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.