MySQL- "0"으로 우편 번호를 앞쪽으로 채우는 방법은 무엇입니까?


93

내 MySQL InnoDB 데이터베이스에 정리하려는 더러운 우편 번호 데이터가 있습니다.

깨끗한 우편 번호 데이터는 우편 번호에 5 자리 숫자가 모두있을 때입니다 (예 : "90210").

그러나 어떤 이유로 "0"으로 시작하는 우편 번호의 경우 0이 삭제되었음을 데이터베이스에서 발견했습니다.

따라서 우편 번호가 " "인 " Holtsville, New York " 00544은 내 데이터베이스에 "544 "

우편 번호가 " "인 " Dedham, MA " 02026는 내 데이터베이스에 "2026 " .

길이가 5 자리가 아닌 모든 우편 번호에 "0"을 입력하기 위해 어떤 SQL을 실행할 수 있습니까? 즉, 우편 번호 길이가 3 자리 인 경우 전면 패드 "00"입니다. 우편 번호 길이가 4 자리 인 경우 앞면 패드는 "0"입니다.

최신 정보 :

방금 우편 번호를 데이터 유형 VARCHAR (5)로 변경했습니다.


3
우편 번호에 대한 테이블 열이 숫자 유형이고 문제를 일으키는 것 같습니다. 이 경우 문자 데이터를 유지하려면 데이터 유형을 변경해야합니다.
Kangkan 2010

1
@Kangkan, 당신이 맞습니다. 내 데이터 유형은 숫자였습니다. 방금 우편 번호를 varchar (5)로 변환했습니다. 이제 "0"이 포함 된 <5 자리 우편 번호를 프론트 페이지로 이동하는 방법은 무엇입니까?
TeddyR 2010

1
VARCHAR 대신 CHAR를 사용하는 것이 좋습니다. 테이블이
커지면

2
또한 다른 국가의 우편 번호가 항상 5자인 것은 아닙니다.
Bill Karwin 2010

답변:


219

우편 번호를 숫자 유형 대신 CHAR (5)로 저장하거나 DB에서로드 할 때 애플리케이션이 0으로 채우도록하십시오. 다음을 사용하여 PHP로 수행하는 방법 sprintf():

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

또는 다음과 LPAD()같이 MySQL 패드를 사용할 수 있습니다 .

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 2010

1
다음 코드를 실행하여 "UPDATE tablename SET zip = LPAD (zip, 5, '0');"
TeddyR 2010

나는이 '수락 된'답변이 답변만큼 좋지 않다고 주장합니다 ZEROFILL.
Rick James

이 답변의 결함. 기본값 CHARACTER SET이 utf8이면 CHAR(5)불필요하게 15 바이트를 차지합니다!
Rick James

19

우편 번호의 길이를 결정해야합니다 (5 자 여야한다고 생각합니다). 그런 다음 MySQL에 숫자를 0으로 채우도록 지시해야합니다.

테이블이 호출 mytable되고 해당 필드가 zipcode, type 이라고 가정합니다 smallint. 다음 쿼리를 실행해야합니다.

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

이 방법의 장점은 데이터를 그대로 유지하고 데이터 삽입 / 업데이트 중에 트리거를 사용할 필요가 없으며 데이터를 사용할 때 함수를 사용할 필요가 없으며 SELECT항상 추가 0을 제거하거나 필드 길이를 늘릴 수 있다는 것입니다. 당신은 당신의 마음을 바꿉니다.


3
unsigned Zerofill이가는 길이지만 smallint는 65535에서 최대 값이됩니다. 저는 mediumint를 제안합니다. Cali는 9xxxx의 지퍼를 가지고 있습니다.
brandon-estrella-dev

4
다른 국가의 우편 번호를 지원하려는 경우 정수는 원하지 않습니다. 일부 국가에서는 우편 번호에 문자를 사용합니다.
Wodin 2015

12

자, 열을 Number에서 VARCHAR (5)로 전환했습니다. 이제 왼쪽으로 채워지도록 우편 번호 필드를 업데이트해야합니다. 이를 수행하는 SQL은 다음과 같습니다.

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

그러면 ZipCode 열의 모든 값이 5 자로 채워지고 왼쪽에 '0'이 추가됩니다.

물론 이전 데이터를 모두 수정 했으므로 새 데이터도 0으로 채워져 있는지 확인해야합니다. 이를 수행하는 올바른 방법에 대한 여러 학교가 있습니다.

  • 애플리케이션의 비즈니스 로직에서 처리하십시오. 장점 : 데이터베이스 독립적 인 솔루션은 데이터베이스에 대해 더 많이 배우지 않습니다. 단점 : 모든 애플리케이션에서 데이터베이스에 쓰는 모든 곳에서 처리해야합니다.

  • 저장 프로 시저로 처리하십시오. 장점 : 저장 프로시 저는 모든 클라이언트에 대해 비즈니스 규칙을 적용합니다. 단점 : 저장 프로시 저는 단순한 INSERT / UPDATE 문보다 더 복잡하며 데이터베이스간에 이식 할 수 없습니다. 베어 INSERT / UPDATE는 여전히 0이 아닌 데이터를 삽입 할 수 있습니다.

  • 방아쇠로 처리하십시오. 장점 : 저장 프로 시저 및 베어 INSERT / UPDATE 문에서 작동합니다. 단점 : 최소한의 휴대용 솔루션. 가장 느린 솔루션. 트리거를 올바르게 설정하기 어려울 수 있습니다.

이 경우 데이터베이스 수준이 아닌 애플리케이션 수준에서 처리합니다. 결국 모든 국가에서 5 자리 우편 번호를 사용하는 것은 아니며 (미국도 아님-우편 번호는 실제로 Zip + 4 + 2 : nnnnn-nnnn-nn입니다) 일부 국가에서는 문자와 숫자를 허용합니다. 데이터 형식을 강제로 시도하고 가끔 발생하는 데이터 오류를 받아들이지 않는 것이 좋습니다. 형식이 예상과 다를지라도 누군가가 올바른 값을 입력하지 못하도록하는 것보다 좋습니다.


4

나는 이것이 OP 이후에 잘된다는 것을 알고 있습니다. 우편 번호 데이터를 서명되지 않은 INT로 저장하지만 0으로 표시되는 테이블을 유지하는 한 가지 방법은 다음과 같습니다.

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

이렇게하면 원본 데이터가 INT로 보존되고 스토리지의 일부 공간을 절약 할 수 있지만 서버에서 INT에서 CHAR로 변환을 수행하게됩니다. 이것은 뷰에 던져 질 수 있으며이 데이터를 필요로하는 사람은 테이블 자체에 대해 거기로 이동할 수 있습니다.


3

우편 번호 필드를 0으로 채워진 부호없는 정수 필드로 만드는 것이 여전히 의미가 있습니다.

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

그런 식으로 mysql이 패딩을 처리합니다.


3
CHAR(5)

또는

MEDIUMINT (5) UNSIGNED ZEROFILL

첫 번째는 우편 번호 당 5 바이트를 차지합니다.

두 번째는 우편 번호 당 3 바이트 만 사용합니다. ZEROFILL 옵션은 앞에 0이있는 우편 번호에 필요합니다.



0

LPAD는 남은 바이트에 공백을 넣지 않기 때문에 VARCHAR2와 함께 작동합니다. LPAD는 LHS에서 남은 / 널 바이트를 0으로 변경하므로 데이터 유형은 VARCHAR2 여야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.