MySQL8.0がGA(Changes in MySQL 8.0.11 (2018-04-19, General Availability)になってから4年以上が過ぎていますが、色々な機能追加や機能のDeprecate(廃止)やDeprecateに対する警告が出ています。その中でも、テーブル生成する時にも以下の様なWarning 1681が出て来るようになったので、改めて再確認してみます。
整数データ型における幅表示の非推奨
MySQL 8.0.17 では、整数データ型の表示幅属性は非推奨になりました。将来のバージョンの MySQL ではサポートされなくなる予定です。
11.1.1 数値データ型の構文
上記で作成したテーブルをSHOW CREATE TABLEで見るとintには桁数が入っていません。
mysql> show create table T_8030\G
*************************** 1. row ***************************
Table: T_8030
Create Table: CREATE TABLE `T_8030` (
`id` int NOT NULL AUTO_INCREMENT,
`num` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)
数値データ型におけるZEROFILLの非推奨
必要に応じて、アプリで処理するかLPADで対応
MySQL 8.0.17 では、ZEROFILL 属性は数値データ型では非推奨です。将来のバージョンの MySQL ではサポートされなくなる予定です。 この属性の効果を生成する別の方法の使用を検討してください。 たとえば、アプリケーションでは、LPAD() 関数を使用して、必要な幅まで数値をゼロ埋めたり、書式設定された数値を CHAR カラムに格納したりできます。
mysql> CREATE TABLE
-> `T_ZEROFILL`(
-> `id` int(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> `num` int(4) ZEROFILL NOT NULL
-> );
Query OK, 0 rows affected, 3 warnings (0.04 sec)
mysql> CREATE TABLE
-> `T_NON_ZEROFILL`(
-> `id` int(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> `num` int(4) NOT NULL
-> );
Query OK, 0 rows affected, 2 warnings (0.06 sec)
mysql> INSERT INTO T_ZEROFILL(num) VALUES (1);
Query OK, 1 row affected (0.01 sec)
mysql> truncate table T_ZEROFILL;
Query OK, 0 rows affected (0.06 sec)
mysql> INSERT INTO T_ZEROFILL(num) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> INSERT INTO T_NON_ZEROFILL(num) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from T_ZEROFILL;
+----+------+
| id | num |
+----+------+
| 1 | 0001 |
| 2 | 0002 |
| 3 | 0003 |
+----+------+
3 rows in set (0.00 sec)
mysql> select * from T_NON_ZEROFILL;
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+-----+
3 rows in set (0.00 sec)
mysql> SELECT id,LPAD(num,4,'0') from T_NON_ZEROFILL;
+----+-----------------+
| id | LPAD(num,4,'0') |
+----+-----------------+
| 1 | 0001 |
| 2 | 0002 |
| 3 | 0003 |
+----+-----------------+
3 rows in set (0.00 sec)
mysql>
FLOAT、DOUBLE, DECIMALデータ型に対してUNSIGNED属性の非推奨
MySQL 8.0.17 では、FLOAT、DOUBLE および DECIMAL(およびすべてのシノニム) タイプのカラムに対して UNSIGNED 属性は非推奨になりました。将来のバージョンの MySQL ではサポートされなくなる予定です。 このようなカラムには、かわりに単純な CHECK 制約の使用を検討してください。
INT型等はこれまで通り利用出来る、上記影響を受けるのはFLOAT、DOUBLE, DECIMAL等
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小さい整数。符号付きの範囲は -32768 から 32767 です。符号なしの範囲は 0 から 65535 です。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
中間サイズの整数。符号付きの範囲は -8388608 から 8388607 です。符号なしの範囲は 0 から 16777215 です。
INT[(M)] [UNSIGNED] [ZEROFILL]
普通サイズの整数。符号付きの範囲は -2147483648 から 2147483647 です。符号なしの範囲は 0 から 4294967295 です。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
この型は INT のシノニムです。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大きい整数。符号付きの範囲は -9223372036854775808 から 9223372036854775807 です。符号なしの範囲は 0 から 18446744073709551615 です。
SERIAL は BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE のエイリアスです。
UNSIGNEDにはマイナス値を入れる事が出来ない。
UNSIGNEDにはマイナス値が入らない代わりに、intの場合で最大値が4294967295迄取り扱える様になります。
Decimalデータ型における確認。
mysql> desc T_8030_DEC;
+--------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| num | int | NO | | NULL | |
| salary | decimal(5,2) | YES | | NULL | |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.03 sec)
Decimalデータ型にUNSINGED属性を付けて見ると以下の様なWARNINGが出て来る。
DeciamlにUnsignedを付けるケースとしては、マイナスの値を許容しない様にする等のケース。殆どのケースではアプリ側で処理しているかと思いますが、データ型で担保する事が出来た。データベース側で何とか処理したい場合は、MySQL8.0.16以降ではCHECK制約を利用するか、生成列で処理する等でデータがマイナスにならない様に処理する等が考えられます。
mysql> desc T_8030_DEC_U;
+--------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| num | int | NO | | NULL | |
| salary | decimal(5,2) unsigned | YES | | NULL | |
+--------+-----------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
FLOATデータ型における(M,D)構文の非推奨
MySQL は、FLOAT(M,D) または REAL(M,D) または DOUBLE PRECISION(M,D) の非標準の構文を許可します。 ここで、(M、D) は、値は合計で M 桁まで格納でき、そのうちの D 桁は小数点以下です。 たとえば、FLOAT(7,4) として定義されたカラムは、-999.9999 として表示されます。 MySQL は、値を格納するときに丸めを行うので、FLOAT(7,4) カラムに 999.00009 を挿入すると、近似の結果は 999.0001 になります。MySQL 8.0.17 では、非標準の FLOAT(M,D) および DOUBLE(M,D) 構文は非推奨であり、将来のバージョンの MySQL ではサポートされなくなる予定です。
11.1.4 浮動小数点型 (概数値) – FLOAT、DOUBLE
mysql> CREATE TABLE T_8030_FLOAT(
-> `id` int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-> `num` int NOT NULL,
-> `salary` FLOAT(7,4)
-> );
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> insert into T_8030_FLOAT(num,salary) values(1,999);
Query OK, 1 row affected (0.02 sec)
mysql> select * from T_8030_FLOAT;
+----+-----+----------+
| id | num | salary |
+----+-----+----------+
| 1 | 1 | 999.0000 |
+----+-----+----------+
1 row in set (0.01 sec)
mysql> insert into T_8030_FLOAT(num,salary) values(1,999.9999);
Query OK, 1 row affected (0.01 sec)
mysql> select * from T_8030_FLOAT;
+----+-----+----------+
| id | num | salary |
+----+-----+----------+
| 1 | 1 | 999.0000 |
| 2 | 1 | 999.9999 |
+----+-----+----------+
2 rows in set (0.00 sec)
mysql> insert into T_8030_FLOAT(num,salary) values(1,999.0001);
Query OK, 1 row affected (0.01 sec)
mysql> insert into T_8030_FLOAT(num,salary) values(1,999.00009);
Query OK, 1 row affected (0.01 sec)
mysql> select * from T_8030_FLOAT;
+----+-----+----------+
| id | num | salary |
+----+-----+----------+
| 1 | 1 | 999.0000 |
| 2 | 1 | 999.9999 |
| 3 | 1 | 999.0001 |
| 4 | 1 | 999.0001 |
+----+-----+----------+
4 rows in set (0.00 sec)
mysql>
バージョンアップにより、新機能追加と機能廃止(Deprecate)が発生するのでリリースノートやログを定期的に確認して、運用中のサービスに影響が出ない様にキャッチアップしておく事は重要ですね。勿論データベースに限った事ではありませんが。