Mysql

MariaDB 或 MySQL 可以轉換為 bigint,得到一個錯誤:… ‘bigint)’ 附近使用正確的語法嗎?

  • May 20, 2018

如果我想獲取一個字元串並創建一個表(這在嚴格模式下失敗),

CREATE TABLE g
 AS SELECT CAST('2147483699' AS int);

我如何告訴它我想要一個 bigint 類型?我也會得到一個int(10)類型。SELECT從中改編也很幽默,

+---------------------------+
| CAST('2147483699' AS int) |
+---------------------------+
|                2147483647 |
+---------------------------+

數據實際上是錯誤的,它默默地失敗了。我知道這是一個已知問題,該數據庫的預設值非常差,但我怎樣才能將表創建為 bigint?

CREATE TABLE g
 AS SELECT CAST('2147483699' AS bigint);

這樣做我得到這個錯誤,

ERROR 1064 (42000):您的 SQL 語法有錯誤;檢查與您的 MariaDB 伺服器版本相對應的手冊,以在第 2 行的“bigint)”附近使用正確的語法

如何將整數轉換為 bigint?

PostgreSQL

使用 PostgreSQL,這非常簡單。除了在轉換為 a 時拋出異常之外int,您還轉換為bigintusing

SELECT CAST('2147483699' AS bigint);
   int8    
------------
2147483699

*默默?*咱們試試吧:

CREATE TABLE g
  AS SELECT CAST('2147483699' AS int);

MariaDB 10.1.32,預設 sql_mode(非嚴格)

查詢正常,1 行受影響,1 個警告(0.19 秒)記錄:1 重複:0 警告:1

警告是:

| 警告 | 第1264章 第 1 行的列 ‘CAST(‘2147483699’ AS int)’ 的值超出範圍 |

是的,從表中選擇很有趣,但考慮到警告,這並不奇怪。

(我目前沒有 MariaDB 10.2 實例,但在 dbfiddle.uk 上進行的測試表明它也失敗了,但又不是靜默。)

MariaDB 10.3.6,預設 sql_mode(嚴格)

沒有警告。

從 g 中選擇 *;

給出:

+---------------------------+
| CAST('2147483699' AS int) |
+---------------------------+
|                2147483699 |
+---------------------------+
1 row in set (0.000 sec)

該列確實創建為 bigint(10)。

MySQL 8.0,預設的嚴格和非嚴格 sql_mode

ERROR 1064 (42000):您的 SQL 語法有錯誤;檢查與您的 MySQL 伺服器版本相對應的手冊,以在第 2 行的“int)”附近使用正確的語法

電腦說不行。

結論

MariaDB 或 MySQL 可以轉換為 bigint 嗎?正如我們所看到的,是的,MariaDB 10.3 可以(雖然它還不是 GA ……但現在肯定會出現)。但是,它只能隱式轉換為 bigint。您不能顯式轉換為 bigint,就像您不能轉換為 varchar(但請參閱MDEV-11283)、text、float、tinyint 等一樣。您只能轉換為有限數量的數據類型。這沒有很好的記錄,但 CAST 似乎只支持為CONVERT 函式列出的相同數據類型。

一種適用於 MySQL(至少 5.6+)和 MariaDB(至少 10.2+)的方法,無需強制轉換:

CREATE TABLE g (b bigint)
 AS 
SELECT 2147483699 AS b            -- no CAST needed
UNION ALL
SELECT '2147483699' ;

測試:

引用自:https://dba.stackexchange.com/questions/205609