MySQL8.0以降における数値データ型

Deprecate Warning

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 数値データ型の構文

MySQL 8.0.30での確認

上記で作成したテーブルを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にはマイナスの値は入りません

UNSIGNEDにはマイナス値が入らない代わりに、intの場合で最大値が4294967295迄取り扱える様になります。

2147483647と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 Data Type

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)
Decimal Data Type with Unsigned

備考:NO_UNSIGNED_SUBTRACTION

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

Float With (M,D)

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)が発生するのでリリースノートやログを定期的に確認して、運用中のサービスに影響が出ない様にキャッチアップしておく事は重要ですね。勿論データベースに限った事ではありませんが。

カテゴリー:

最近のコメント

表示できるコメントはありません。