GA

2025/03/10

MySQL 8.0ではINT系のデータ幅表記をdeprecatedにした…けれども

TL;DR


MySQL 8.0では INT, TINYINT, BIGINT, ..etc. で (xx) な桁数指定をしようとするとワーニングを吐く。
これはもともと整数系の桁数括弧書きは ZEROFILL 属性のためのパラメータで、DECIMALのように桁数を制限するものではなかったので、 ZEROFILL を使っていなければ単に無視すれば良い。

mysql80 18> CREATE TABLE t1 (tinyint_signed_1 TINYINT(1) SIGNED, tinyint_unsigned_1 TINYINT(1) UNSIGNED, tinyint_signed_2 TINYINT(2) SIGNED, tinyint_unsigned_2 TINYINT(2) UNSIGNED);
Query OK, 0 rows affected, 4 warnings (0.02 sec)

mysql80 18> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level   | Code | Message                                                                      |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
| Warning | 1681 | Integer display width is deprecated and will be removed in a future release. |
+---------+------+------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

ところで TINYINT(1) といえば Connector/J がBoolean型にキャストすることで有名だが、桁数表記がサーバー側で無視されているとしたらJavaはこれをどう扱うんだろう…? と思った。

mysql80 18> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `tinyint_signed_1` tinyint(1) DEFAULT NULL,              ### <---- ここだけなんか違和感が
  `tinyint_unsigned_1` tinyint unsigned DEFAULT NULL,
  `tinyint_signed_2` tinyint DEFAULT NULL,
  `tinyint_unsigned_2` tinyint unsigned DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

(つд⊂)ゴシゴシ

(;゚ Д゚) …!?

TINYINT(1) SIGNED の時だけ、データ型が tinyint(1) を返すようになっている。
どうやら意図したものらしい。

// Print TINYINT(1) since connectors use this to indicate BOOLEAN

ChatGPTにConnector/J側からの見え方を調べる方法を教えてもらった。

$ java -cp .:/usr/share/java/mysql-connector-java.jar MySQLColumnTypeViewer
Column Name | MySQL Type | Java Type
------------------------------------
tinyint_signed_1 | BIT        | Unknown
tinyint_unsigned_1 | TINYINT UNSIGNED | Byte
tinyint_signed_2 | TINYINT    | Byte
tinyint_unsigned_2 | TINYINT UNSIGNED | Byte

ああちゃんと特別扱いしてるっぽい…。

というか field_length 自体はまだ持ってるのね…。

0 件のコメント :

コメントを投稿