Upgrade to Pro — share decks privately, control downloads, hide ads and more …

0から始まるかもしれない固定長整数をINT型に入れたい

MATSUURA, yosuke
September 13, 2019

 0から始まるかもしれない固定長整数をINT型に入れたい

0から始まる数字列をINTに入れるために試行錯誤しています

MATSUURA, yosuke

September 13, 2019
Tweet

More Decks by MATSUURA, yosuke

Other Decks in Technology

Transcript

  1. 自己紹介 • Twitter: 蟒蛇(@uwabami_garden) • 名前: 松浦 庸介 • 所属:

    hachidori株式会社 • 詳しくはこちら https://hachidoriinc.com/ • 表紙のキャラクターは弊社サービスCASTのマスコット「てんちょ」です • https://twitter.com/CAST_tencho
  2. 現状 • 店舗ごとに9桁の数字(identifier)を発行し、識別子として使っている • “012345678”のように0から始まることもある • 今はvarchar型に文字列として入れている • 簡略化したテーブル設計はこんな感じ •

    これはこれで問題なく動く show create table shops¥G *************************** 1. row *************************** Table: shops Create Table: CREATE TABLE `shops` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `identifier` varchar(255) NOT NULL, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=**** DEFAULT CHARSET=utf8mb4
  3. INTにしたい • 行数が増えると、データ格納効率が無視できなくなってくるので、INTにしたい • とにかくINTにしたい • INT(9)で桁を指定すればよいのでは??? CREATE TABLE `int_table01`

    ( `id` int(11) NOT NULL AUTO_INCREMENT, `identifier` int(9) NOT NULL, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  4. どうして mysql> INSERT INTO int_table01 SET identifier=012345678, name="現場猫"; Query OK,

    1 row affected (0.00 sec) mysql> SELECT identifier FROM int_table01 WHERE name like "現場猫"; +------------+ | identifier | +------------+ | 12345678 | ←9文字にならない! +------------+ 1 row in set (0.02 sec)
  5. INTにZEROFILLをつける • INT(n)にZEROFILL attributeをつけると、0フィルでn桁にしてくれる • INTの引数はZEROFILLオプションがないと無意味(だと思う) • INT以外の他の長さの整数型でも同様に使える • こんな感じ

    CREATE TABLE `int_table02` ( `id` INT NOT NULL AUTO_INCREMENT, `identifier` INT(9) ZEROFILL NOT NULL, `name` VARCHAR(45) NOT NULL, PRIMARY KEY (`id`)) DEFAULT CHARACTER SET = utf8mb4;
  6. 同じことをする mysql> INSERT INTO int_table02 SET identifier=012345678, name="現場猫"; Query OK,

    1 row affected (0.00 sec) mysql> SELECT identifier FROM int_table02 WHERE name like "現場猫"; +------------+ | identifier | +------------+ | 012345678 | ←先頭が0で埋められている! +------------+ 1 row in set (0.00 sec)
  7. LPAD関数で0パディングする • SELECTするときにLPAD関数を通して、パディングする • LPAD(パディングする文字列, 出力文字長, 埋める文字) • こんな感じ mysql>

    SELECT LPAD(identifier,9,0) FROM int_table01 WHERE name like "現場猫"; +----------------------+ | LPAD(identifier,9,0) | +----------------------+ | 012345678 | ←先頭が0で埋められている! +----------------------+ 1 row in set (0.00 sec)