みなさんはサロゲートキーを使うことはあるでしょうか。何らかのフレームワークを使っている場合には、望んでも望まなくても使わざるをえない場合もありますが、
さて、
検証環境
今回は、
% 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で扱える整数型に関して紹介しました。基本的なデータ型ではあるのですが、
特に、