◆ バイトやビットじゃないし ほとんどの場合は 意味ない
◆ zero fill オプションがつけた時に この桁になるように先頭に 0 をつけてくれる

ネットを眺めてた時に mysql の int 系の数字はビット数で tinyint(1) に 2 以上の数値を入れて全部 1 になってしまったというのを見かけました

あれ けっこう前に
int 系の()は飾りです 偉い人にはそれがわからんのです とかなんとか聞いたような気がするけど……

実際どうなんだろ ということで試してみました
mysql ユーザではないので mariadb ですが 多分一緒でしょ (たぶん

int と tinyint

とりあえずこの 2 つです
他の int 系は名前覚えてないです

カッコに適当な数字入れてみます

01


CUI で SQL なんて書いてられないので mysql workbench です
SQL は SELECT だけ書ければあとは GUI で適当に選ぶだけで十分ですよね
CREATE TABLE なんて複雑ですし RDB ごとに違いが多いし 一々覚えてられないです
SELECT は基本的なことするならどれも一緒でいけるのに


さて データを入れてみました

一番左が入れるデータです
型としては 3 つめも 一緒なので同じなのですけどね

02


tinyint では 127 以上の値を入れられないので 127 になってしまっています
ですが 特に () の数字は意味ないようですね

zerofill

普段は書くだけムダで省略するようなものですが 書けるということはちゃんと意味があるんです
zerofill を指定してる時に 0 で埋める桁数として使われます

こんな風に zerofill を型に指定にすると

03


こう表示されます

04


SELECT 文は単純に * で全部表示してるだけです
() の中の数値の桁数で表示されていますね
int(11) は 11 桁で int(3) は 3 桁になってます
指定した桁を超えていたら 何もしないです

型の情報では zerofill つけると unsigned までついてますが 255 になってないのは 上のテーブルに alter table したせいですでに 127 という値でデータベースに入ってるからです


というわけで () の数値はビットやバイトとは全く関係ない数字なんですね
char 系もマルチバイト関係なく文字数だったと思いますし SQL ってあまりバイト数って意識しなくていいのかな?


zerofill なんて postgres に(たぶん)なかったので そんな機能あるのこれで初めて知りました
SELECT するときに通す関数じゃなくて テーブル定義の時点で指定するんですねー

JSON で保存できるのが好きだから RDB なんてめったに使わないのでひさびさに こんなこと調べたような気がします
もしかしてこのブログで RDB 関係は初めてかな