MySQLでゼロパディングしてデータを取得したくて
色々調べたので、その備忘録です。
間違った点などあればご教授いただければ幸いです。
※ちなみに「ゼロパディング」とは「桁が足りない分を0で埋める」ことです。
参考:[ゼロパディングとは - IT用語辞典 Weblio辞書][zeropadding]
#はじめに
テーブル作ります。
mysql> CREATE TABLE `demo`(`id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `num` int(10) UNSIGNED NOT NULL);
Query OK, 0 rows affected (0.04 sec)
とりあえずデータを何件か入れます。
mysql> INSERT INTO `demo`(`num`) VALUES (1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `demo`(`num`) VALUES (12);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `demo`(`num`) VALUES (123);
Query OK, 1 row affected (0.00 sec)
こんな感じになります。
mysql> SELECT * FROM `demo`;
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 12 |
| 3 | 123 |
+----+-----+
3 rows in set (0.01 sec)
#ゼロパディングで取得したい
今回取得したいデータはこんな感じです。
+----+-----+
| id | num |
+----+-----+
| 1 | 001 |
| 2 | 012 |
| 3 | 123 |
+----+-----+
調べてみると、どうやら[LPAD][lpad]という関数を使えばいいみたいです。
というわけで、実際に取得してみます。
mysql> SELECT LPAD(`num`, 3, '0') FROM `demo`;
+---------------------+
| LPAD(`num`, 3, '0') |
+---------------------+
| 001 |
| 012 |
| 123 |
+---------------------+
3 rows in set (0.00 sec)
おおおおおおおおおおおおおおおお(๑¯﹀¯๑)!!
ちょっと調整
mysql> SELECT `id`, LPAD(`num`, 3, '0') AS `num` FROM `demo`;
+----+-----+
| id | num |
+----+-----+
| 1 | 001 |
| 2 | 012 |
| 3 | 123 |
+----+-----+
3 rows in set (0.00 sec)
そうです!こういうことです!!
#補足
毎回ゼロパディングして取得したいなら、テーブル作るときに [ZEROFILL][zerofill] 使いましょう。
というわけで作り直します。
mysql> DROP TABLE IF EXISTS `demo`;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE `demo`(`id` int(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `num` int(3) ZEROFILL NOT NULL);
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO `demo`(`num`) VALUES (1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `demo`(`num`) VALUES (12);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `demo`(`num`) VALUES (123);
Query OK, 1 row affected (0.00 sec)
するとこんな感じに。うん、満足。
mysql> SELECT * FROM `demo`;
+----+-----+
| id | num |
+----+-----+
| 1 | 001 |
| 2 | 012 |
| 3 | 123 |
+----+-----+
3 rows in set (0.00 sec)
ちなみに今回 UNSIGNED 属性を指定していませんが、マニュアルによると
数値カラムに対して ZEROFILL を指定すると、MySQL は自動的にそのカラムに UNSIGNED 属性を追加します。
とのことなので、大丈夫みたいです。
#参考
- [MySQL 5.6 リファレンスマニュアル - 12.5 文字列関数][lpad]
- [MySQL 5.6 リファレンスマニュアル - 11.1.1 数値型の概要][zerofill]
[lpad]:https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_lpad
[zerofill]:https://dev.mysql.com/doc/refman/5.6/ja/numeric-type-overview.html
[zeropadding]:https://www.weblio.jp/content/%E3%82%BC%E3%83%AD%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B