MySQLのゼロフィルの利点は何ですか?


168

私はちょうど定義の利益/用法であるかを知りたいZEROFILLためINTにデータ型MySQL

`id` INT UNSIGNED ZEROFILL NOT NULL 


良い質問。同様に尋ねられる可能性のある関連質問:ZEROFILLを使用しない正当な理由はありますか?ZEROFILLを使用する場合の欠点と潜在的な落とし穴は何ですか?利点は欠点を上回りますか?
spencer7593 2017

回答:


254

タイプ付きの列を選択するとZEROFILL、列の定義で指定された表示幅まで、フィールドの表示値にゼロが埋め込まれます。表示幅より長い値は切り捨てられません。の使用ZEROFILLも意味することに注意してくださいUNSIGNED

ZEROFILL表示幅を使用しても、データの保存方法には影響しません。表示方法にのみ影響します。

以下は、の使用を示すSQLの例ですZEROFILL

CREATE TABLE yourtable (x INT(8) ZEROFILL NOT NULL, y INT(8) NOT NULL);
INSERT INTO yourtable (x,y) VALUES
(1, 1),
(12, 12),
(123, 123),
(123456789, 123456789);
SELECT x, y FROM yourtable;

結果:

        x          y
 00000001          1
 00000012         12
 00000123        123
123456789  123456789

52
@diEcho:たとえば、すべての請求書番号を10桁で表示したい場合は、その列のタイプをINT(10)ZEROFILLとして宣言できます。
Mark Byers、2011年

76
この機能を使用しないことを強くお勧めします。数値がどのように表示/フォーマットされるかはプレゼンテーションの問題であり、データベースレベルに属するものではありません。少なくとも、データベースを使用してソフトウェアをバックアップしている場合はそうではありません。これが問題を引き起こす可能性があることに注意してください-先行ゼロ付きの値を整数として解析すると、多くのパーサーはその値を8進数と見なします。この機能を使用する必要があるのは、(格納)最適化としてのみです。実際に格納するのは、事実上、(固定長の)数字列です。
mindplay.dk 14年

3
@ mindplay.dk:依存する。GTINのようなものを保存している場合、それらは14桁の長さである必要がありますが、8桁で左にゼロを埋め込むこともできます。これは単なる10進数ではなくキーなので、出力側に依存することはこの場合正しくありません。
DanMan 2014年

1
@MarkByers、しかし実際的に言えば、ほとんどのクライアントライブラリ(PHPなど)は、ゼロをアプリケーションコードに渡す前に単にゼロを取り除きませんか?もしそうなら、それは本当にやや無意味に思えます。MySQLの初期の頃の悪いデザイン。
パセリエ

131

理解するための1つの例ZEROFILL

ドイツでは、5桁の郵便番号があります。ただし、これらのコードはゼロで始まる場合80337があるため、municの有効な郵便番号で01067あり、ベルリンの郵便番号です。

ご覧のとおり、ドイツの市民は郵便番号が5桁のコードとして表示されることを期待しているため、1067奇妙に見えます。

これらのデータを保存するために、a VARCHAR(5)またはorを使用できますがINT(5) ZEROFILL、ゼロで満たされた整数には2つの大きな利点があります。

  1. ハードディスクのストレージ容量が大幅に少なくなります
  2. を挿入すると1067、まだ01067戻ります

多分この例は、の使用を理解するのに役立ちますZEROFILL


10
データを表示するSQLクライアントが、数値を先行ゼロでフォーマットする責任があることを付け加えておく価値があります。これは、データを取得するすべてのアプリケーションで「自動的に」発生するものではありません。
a_horse_with_no_name 2014年

固定幅の列は、ディスク上の断片化を減らすため、より優れています。
DanMan 2014年

@Phil、しかし実際的に言えば、ほとんどのクライアントライブラリ(PHPなど)は、ゼロをアプリケーションコードに渡す前に単にゼロを取り除きませんか?もしそうなら、それは本当にやや無意味に思えます。MySQLの初期の頃の悪いデザイン。
Pacerier

3
@Pacerierこれは、クライアントライブラリのデータを数値または文字列でどのように表現するかによって異なります。ドイツの郵便番号は数字ではなく、数字のみで構成される文字列です。したがって、MySQLの初期の頃の設計の悪さについてのあなたの意見には同意しません。それはまだ有効なアプローチですが、まれなケースです。
Phil

61

これは、四角い箱が好きな、邪魔な人格のための機能です。

あなたが挿入する

1
23
123 

選択すると、値が埋め込まれます

000001
000023
000123

15

この「整数」を、「テキスト」としてソートする必要のある何か(別の数値またはテキスト)と連結する必要がある場合に、正しいソートに役立ちます。

例えば、

A-005または10/0005として連結された整数フィールド番号(5としましょう)を使用する必要がある場合


4

私はパーティーに遅れていることを知っていますが、zerofillはTINYINT(1)のブール表現に役立ちます。nullは常にFalseを意味するわけではなく、場合によってはそれを望まないこともあります。tinyintをゼロフィルすることで、これらの値を効果的にINTに変換し、アプリケーションが対話時に発生する可能性のある混乱を取り除きます。アプリケーションは、これらの値をプリミティブデータ型True = Not(0)と同様の方法で処理できます。


1
おかげで、残念ながら私はmysql dbに対していくつかのテストを実行しただけで、null値がゼロで埋められません:-/。この目標は、フィールドをnullを許可しないように制限することで引き続き達成されます。私は通常使用しないdbsについての質問に答えるよりもよく知っているべきです。人々が投票に満足する前に私の回答を削除します。笑
マーリン2012

1
有用?不正解です。ディスプレイの長さが1のときZEROFILLは(符号なしの追加を除く)何もしません
Brilliand

@Marlinとデフォルト値を常にtrueまたはfalseに設定する必要があります...デフォルト値を使用しない場合、前述の問題は唯一のものではありません... NOT NULLも必須です:)
バクアワッド2014

私は反対票を投じますが、あなたの担当者はいます666ので、この回答をそのままにしておきたいと思います;-)
Martin

3
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)

1

オプションの(非標準)属性ZEROFILLと組み合わせて使用​​すると、デフォルトのスペースのパディングはゼロに置き換えられます。たとえば、INT(4)ZEROFILLとして宣言された列の場合、値5は0005として取得されます。

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html



1

数値カラムにZEROFILLを指定すると、MySQLは自動的にUNSIGNED属性をカラムに追加します。

UNSIGNED属性を許可する数値データ型は、SIGNEDも許可します。ただし、これらのデータ型はデフォルトで署名されているため、SIGNED属性は無効です。

上記の説明はMYSQL公式ウェブサイトからの引用です。


0

ゼロフィル

これは基本的に、整数値23が幅8のINT列に挿入された場合、残りの利用可能な位置には自動的にゼロが埋め込まれることを意味します。

したがって

23

になる:

00000023
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.