web-dev-qa-db-ja.com

MariaDBまたはMySQLはbigintとしてキャストできますが、エラーが発生します:... 'bigint)の近くで使用する正しい構文?

文字列を取得してテーブルを作成する場合(これは strictモード で失敗します)、

_CREATE TABLE g
  AS SELECT CAST('2147483699' AS int);
_

Bigint型が必要であることをどのように伝えることができますか? int(10)タイプも取得します。 SELECTingそれからも滑稽です、

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

データは実際には間違っており、静かに失敗しました。 このデータベースのデフォルトが非常に悪いことは既知の問題です ですが、bigintとしてテーブルを作成するにはどうすればよいですか?

_CREATE TABLE g
  AS SELECT CAST('2147483699' AS bigint);
_

このエラーが発生するようにすると、

エラー1064(42000):SQL構文にエラーがあります。 MariaDBサーバーのバージョンに対応するマニュアルで、2行目で「bigint)の近くで使用する正しい構文を確認してください

整数をbigintにキャストするにはどうすればよいですか?

PostgreSQL

PostgreSQLでは、それは非常に簡単です。 intにキャストした場合に例外をスローすることに加えて、bigintにキャストして

_SELECT CAST('2147483699' AS bigint);
    int8    
------------
 2147483699
_
3
Evan Carroll

静かに?やってみましょう:

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

エラー1064(42000):SQL構文にエラーがあります。 MySQLサーバーのバージョンに対応するマニュアルで、2行目付近の「int)」付近で使用する正しい構文を確認してください

コンピュータはノーと言う。

結論

MariaDBまたはMySQLはbigintとしてキャストできますか?見てきたように、そうです、MariaDB 10.3は可能です(ただし、GAはまだですが...確かに、いつの日かそうなるでしょう)。ただし、暗黙的にbigintとしてのみキャストできます。 varchar(しかし MDEV-1128 を参照)、text、float、tinyintなどにキャストできないのと同じように、bigintとして明示的にキャストしないでください。キャストできるデータ型の数は限られていますこれは十分に文書化されていませんが、CASTは CONVERT関数 にリストされているのと同じデータ型のみをサポートしているようです。

3
dbdemon

MySQL(少なくとも5.6+)とMariaDB(少なくとも10.2+)の両方で機能し、キャストの必要性を回避する方法:

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

テスト:

1
ypercubeᵀᴹ

文字列を数値に変換して算術演算を実行してから、無害な算術演算を実行してみてください。

SELECT '2147483699'+0;

+----------------+
| '2147483699'+0 |
+----------------+
|     2147483699 |
+----------------+
0
Rick James