TL;DR
SHOW CREATE TABLE
でも桁数の表記がなくなっているけれどTINYINT(1) SIGNED
の時だけは表示がtinyint(1)
になる- これはドライバ(少なくともパッと思いつくのは Connector/J)との互換性のためらしい
MySQL 8.0では INT, TINYINT, BIGINT, ..etc. で (xx)
な桁数指定をしようとするとワーニングを吐く。
これはもともと整数系の桁数括弧書きは ZEROFILL
属性のためのパラメータで、DECIMALのように桁数を制限するものではなかったので、 ZEROFILL
を使っていなければ単に無視すれば良い。
- MySQL :: MySQL 8.0 Reference Manual :: 13.1.1 Numeric Data Type Syntax
(DECIMAL, NUMERIC型はちゃんと桁数指定で動く)
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 件のコメント :
コメントを投稿