14
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLでゼロパディングする

Last updated at Posted at 2018-11-20

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 属性を追加します。

とのことなので、大丈夫みたいです。

#参考

14
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?