みなさんはサロゲートキーを使うことはあるでしょうか。何らかのフレームワークを使っている場合には、望んでも望まなくても使わざるをえない場合もありますが、
さて、
検証環境
今回は、
% docker run --platform linux/x86_64 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest % % mysql -uroot -pmy-secret-pw
執筆時点では、
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.28 | +-----------+ 1 row in set (0.01 sec)
今回のテスト用に、
mysql> create database test; mysql> use test
整数型
サロゲートキーなどで使われていることも多く、
文字通り整数を扱うための型になります。型として指定できるのは次のものになります。TINYINT、
| 型 | 記憶領域 | 符号付き | 最小値 | 最大値 |
|---|---|---|---|---|
| TINYINT | 1バイト | あり | -128 | 127 |
| TINYINT | 1バイト | なし | 0 | 255 |
| SMALLINT | 2バイト | あり | -32768 | 32767 |
| SMALLINT | 2バイト | なし | 0 | 65535 |
| MEDIUMINT | 3バイト | あり | -8388608 | 8388607 |
| MEDIUMINT | 3バイト | なし | 0 | 16777215 |
| INT | 4バイト | あり | -2147483648 | 2147483647 |
| INT | 4バイト | なし | 0 | 4294967295 |
| BIGINT | 8バイト | あり | -2^63 | 2^63-1 |
| BIGINT | 8バイト | なし | 0 | 2^64-1 |
またTINYINTを真偽値として使用する場合もありますが、
自身でユーザIDを定義した場合に、
具体的には、BIGINT UNSIGNED NOT NULL AUTO_という形でIDに適した形にしてくれるので、
使用してみる
さて、
mysql> create table int_test(int_one INT(1), int_max INT(255),int_unsigned INT unsigned ,int_one_zerofill int(1) zerofill, int_max_zerofill int(255) zerofill, serial_test serial , boolean_test boolean);
先述のとおり、BIGINT UNSIGNED NOT NULL AUTO_のエイリアスなため、
mysql> show create table int_test\G
*************************** 1. row ***************************
Table: int_test
Create Table: CREATE TABLE `int_test` (
`int_one` int DEFAULT NULL,
`int_max` int DEFAULT NULL,
`int_unsigned` int unsigned DEFAULT NULL,
`int_one_zerofill` int(1) unsigned zerofill DEFAULT NULL,
`int_max_zerofill` int(255) unsigned zerofill DEFAULT NULL,
`serial_test` bigint unsigned NOT NULL AUTO_INCREMENT,
`boolean_test` tinyint(1) DEFAULT NULL,
UNIQUE KEY `serial_test` (`serial_test`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.03 sec)基本的な使い方としては カラム名 型名[(表示桁数)] [unsigned] [zerofill]と言った形で使用ができます。型名の後ろにおいてある数字はzerofillされる場合に用いられ、
mysql> insert into int_test (int_one, int_max,int_unsigned, int_one_zerofill, int_max_zerofill, boolean_test) VALUE (2147483647, 2147483647, 4294967295, 2147483647, 2147483647, true); Query OK, 1 row affected (0.01 sec)
それぞれのカラムに最大値を入れてみます。
mysql> select * from int_test\G
*************************** 1. row ***************************
int_one: 2147483647
int_max: 2147483647
int_unsigned: 4294967295
int_one_zerofill: 2147483647
int_max_zerofill: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002147483647
serial_test: 1
boolean_test: 1
1 row in set (0.01 sec)zerofillの値を255に入れたためint_カラムでは255桁の文字が表示されているのがわかります。zerofillを使っていない場合は、
ちなみにそれぞれ上限、
mysql> insert into int_test (int_one) VALUE (2147483648); ERROR 1264 (22003): Out of range value for column 'int_one' at row 1 mysql> insert into int_test (int_one) VALUE (-2147483649); ERROR 1264 (22003): Out of range value for column 'int_one' at row 1
unsignedの場合でも、
mysql> insert into int_test (int_unsigned) VALUE (-1); ERROR 1264 (22003): Out of range value for column 'int_unsigned' at row 1 mysql> insert into int_test (int_unsigned) VALUE (4294967296); ERROR 1264 (22003): Out of range value for column 'int_unsigned' at row 1
まとめ
今回はMySQLで扱える整数型に関して紹介しました。基本的なデータ型ではあるのですが、
特に、