MariaDB 或 MySQL 可以轉換為 bigint,得到一個錯誤:… ‘bigint)’ 附近使用正確的語法嗎?
如果我想獲取一個字元串並創建一個表(這在嚴格模式下失敗),
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
,您還轉換為bigint
usingSELECT 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' ;
測試: