MySQL-郵便番号を「0」で埋める方法は?


89

MySQL InnoDBデータベースに、クリーンアップしたいダーティな郵便番号データがあります。

クリーンな郵便番号データとは、郵便番号の5桁すべて(「90210」など)を取得したときです。

しかし、何らかの理由で、データベースで、「0」で始まる郵便番号の場合、0が削除されていることに気付きました。

したがって、郵便番号「」の「ニューヨーク州ホルツビル00544」が「544」としてデータベースに保存されます

そして

「郵便番号「」の「デダム、マサチューセッツ州」が「02026」としてデータベースに保存されています2026

長さが5桁ではない郵便番号の前に「0」を埋めるために、どのSQLを実行できますか?つまり、郵便番号の長さが3桁の場合、フロントパッドは「00」になります。郵便番号の長さが4桁の場合、フロントパッドは「0」のみになります。

更新

郵便番号をデータ型VARCHAR(5)に変更しました


3
郵便番号のテーブル列がタイプ番号であり、それが問題の原因であるようです。その場合、文字データを保持するためにデータ型を変更する必要があります。
2010

1
@カンカン、あなたは正しいです。私のデータ型は数値でした。郵便番号をvarchar(5)に変換しました。では、フロントページの「0」付きの5桁未満の郵便番号を表示するにはどうすればよいですか?
TeddyR

1
VARCHARではなくCHARを使用することをお勧めします。テーブルが大きくなると、クエリが大幅に高速化されます(ただし、他のすべての列のサイズが固定されている場合のみ)
QuantumSoup

2
また、他の国の郵便番号が常に5文字であるとは限らないことを考慮してください。
ビルカーウィン、2010

回答:


214

郵便番号を数値型ではなくCHAR(5)として保存するか、DBからロードするときにアプリケーションでゼロを埋め込んでください。PHPを使用してそれを行う方法sprintf()

echo sprintf("%05d", 205); // prints 00205
echo sprintf("%05d", 1492); // prints 01492

または、MySQLでそれを埋め込むこともできますLPAD()

SELECT LPAD(zip, 5, '0') as zipcode FROM table;

すべての行を更新してパディングする方法は次のとおりです。

ALTER TABLE `table` CHANGE `zip` `zip` CHAR(5); #changes type
UPDATE table SET `zip`=LPAD(`zip`, 5, '0'); #pads everything

実際にデータベース自体のデータをクリーンアップしたいと思います。SQLでこれを行うのと同等のことを知っていますか?
TeddyR

1
「UPDATE tablename SET zip = LPAD(zip、5、 '0');」を機能させる次のコードを実行しました。
TeddyR

私はこの「受け入れられた」答えは答えほど良くないと主張しZEROFILLます。
リックジェームズ

この答えの欠陥。デフォルトCHARACTER SETがutf8の場合、CHAR(5)不必要に15バイトがかかります!
リックジェームズ

19

あなたは郵便番号の長さを決定する必要があります(私はそれが5文字であるべきだと思います)。次に、MySQLに数値をゼロで埋めるように指示する必要があります。

テーブルが呼び出さmytableれ、問題のフィールドがzipcodetypeであるとしましょうsmallint。次のクエリを発行する必要があります。

ALTER TABLE mytable CHANGE `zipcode` `zipcode`
    MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;

この方法の利点は、データをそのままにしておくこと、データの挿入/更新中にトリガーを使用する必要がないことSELECT、データのときに関数を使用する必要がないこと、そして余分なゼロを常に削除するか、フィールド長を長くする必要があることですあなたの心を変える。


3
未署名のゼロフィルが最適ですが、smallintの最大値は65535です。mediumintをお勧めします。カリは9xxxxのzipを持っています。
brandon-estrella-dev

4
他の国の郵便番号をサポートしたい場合、整数は必要ありません。一部の国では、郵便番号に文字を使用しています。
Wodin、2015

11

それでは、列をNumberからVARCHAR(5)に切り替えました。次に、郵便番号フィールドを左詰めにするように更新する必要があります。そのためのSQLは次のとおりです。

UPDATE MyTable
SET ZipCode = LPAD( ZipCode, 5, '0' );

これにより、ZipCode列のすべての値に5文字が埋め込まれ、左側に「0」が追加されます。

もちろん、古いデータをすべて修正したので、新しいデータにもゼロが埋め込まれていることを確認する必要があります。これを行う正しい方法については、いくつかの考え方があります。

  • アプリケーションのビジネスロジックで処理します。利点:データベースに依存しないソリューションで、データベースの詳細を学ぶ必要がありません。短所:すべてのアプリケーションで、データベースに書き込むすべての場所で処理する必要があります。

  • ストアドプロシージャで処理します。利点:ストアドプロシージャは、すべてのクライアントにビジネスルールを適用します。短所:ストアドプロシージャは、単純なINSERT / UPDATEステートメントよりも複雑であり、データベース間での移植性は低くなります。裸のINSERT / UPDATEでも、ゼロが埋め込まれていないデータを挿入できます。

  • トリガーで処理します。利点:ストアドプロシージャと最小限のINSERT / UPDATEステートメントで機能します。短所:ポータブルではないソリューション。最も遅いソリューション。トリガーを正しく設定するのは難しい場合があります。

この場合、データベースレベルではなく、アプリケーションレベルで(もしあれば)処理します。結局のところ、すべての国が5桁の郵便番号を使用しているわけではなく(米国でさえ-私たちの郵便番号は実際にはZip + 4 + 2:nnnnn-nnnn-nnです)、いくつかは文字と数字を許可します。データ形式が予期したものではない場合でも、誰かが正しい値を入力できないようにするよりも、データ形式を強制的に実行したり、時々発生するデータエラーを受け入れたりしない方がよいでしょう。


4

これはOPの後でよくわかります。テーブルに郵便番号データを符号なしINTとして保存し、ゼロで表示する方法は次のとおりです。

select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;

これにより、元のデータがINTとして保持され、ストレージの一部のスペースを節約できますが、サーバーにINTからCHARへの変換を実行させることになります。これはビューにスローすることができ、このデータを必要とする人は、テーブル自体ではなく、そこに誘導できます。


3

それでも、郵便番号フィールドをゼロで埋められた符号なし整数フィールドとして作成することには意味があります。

CREATE TABLE xxx ( zipcode INT(5) ZEROFILL UNSIGNED, ... )

そうすることで、mysqlがパディングを処理します。


3
CHAR(5)

または

MEDIUMINT (5) UNSIGNED ZEROFILL

最初は郵便番号ごとに5バイトかかります。

2番目は、郵便番号あたり3バイトしかかかりません。ZEROFILLオプションは、先行ゼロのある郵便番号に必要です。



0

LPADは、残りのバイトにスペースを入れないので、VARCHAR2で動作します。LPADは、LHS SOデータ型の残り/ nullバイトをゼロに変更し、VARCHAR2にする必要があります

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