내 MySQL InnoDB 데이터베이스에 정리하려는 더러운 우편 번호 데이터가 있습니다.
깨끗한 우편 번호 데이터는 우편 번호에 5 자리 숫자가 모두있을 때입니다 (예 : “90210”).
그러나 어떤 이유로 “0”으로 시작하는 우편 번호의 경우 0이 삭제되었음을 데이터베이스에서 발견했습니다.
따라서 우편 번호가 ” “인 ” Holtsville, New York ” 00544
은 내 데이터베이스에 “544
“
과
우편 번호가 ” “인 ” Dedham, MA ” 02026
는 내 데이터베이스에 “2026
” .
길이가 5 자리가 아닌 모든 우편 번호에 “0”을 입력하기 위해 어떤 SQL을 실행할 수 있습니까? 즉, 우편 번호 길이가 3 자리 인 경우 전면 패드 “00”입니다. 우편 번호 길이가 4 자리 인 경우 앞면 패드는 “0”입니다.
최신 정보 :
방금 우편 번호를 데이터 유형 VARCHAR (5)로 변경했습니다.
답변
우편 번호를 숫자 유형 대신 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
답변
우편 번호의 길이를 결정해야합니다 (5 자 여야한다고 생각합니다). 그런 다음 MySQL에 숫자를 0으로 채우도록 지시해야합니다.
테이블이 호출 mytable
되고 해당 필드가 zipcode
, type 이라고 가정합니다 smallint
. 다음 쿼리를 실행해야합니다.
ALTER TABLE mytable CHANGE `zipcode` `zipcode`
MEDIUMINT( 5 ) UNSIGNED ZEROFILL NOT NULL;
이 방법의 장점은 데이터를 그대로 유지하고 데이터 삽입 / 업데이트 중에 트리거를 사용할 필요가 없으며 데이터를 사용할 때 함수를 사용할 필요가 없으며 SELECT
항상 추가 0을 제거하거나 필드 길이를 늘릴 수 있다는 것입니다. 당신은 당신의 마음을 바꿉니다.
답변
자, 열을 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입니다) 일부 국가에서는 문자와 숫자를 허용합니다. 데이터 형식을 강제로 시도하고 가끔 발생하는 데이터 오류를 받아들이지 않는 것이 좋습니다. 형식이 예상과 다를지라도 누군가가 올바른 값을 입력하지 못하도록하는 것보다 좋습니다.
답변
나는 이것이 OP 이후에 잘된다는 것을 알고 있습니다. 우편 번호 데이터를 서명되지 않은 INT로 저장하지만 0으로 표시되는 테이블을 유지하는 한 가지 방법은 다음과 같습니다.
select LPAD(cast(zipcode_int as char), 5, '0') as zipcode from table;
이렇게하면 원본 데이터가 INT로 보존되고 스토리지의 일부 공간을 절약 할 수 있지만 서버에서 INT에서 CHAR로 변환을 수행하게됩니다. 이것은 뷰에 던져 질 수 있으며이 데이터를 필요로하는 사람은 테이블 자체에 대해 거기로 이동할 수 있습니다.
답변
우편 번호 필드를 0으로 채워진 부호없는 정수 필드로 만드는 것이 여전히 의미가 있습니다.
CREATE TABLE xxx (
zipcode INT(5) ZEROFILL UNSIGNED,
...
)
그런 식으로 mysql이 패딩을 처리합니다.
답변
CHAR(5)
또는
MEDIUMINT (5) UNSIGNED ZEROFILL
첫 번째는 우편 번호 당 5 바이트를 차지합니다.
두 번째는 우편 번호 당 3 바이트 만 사용합니다. ZEROFILL 옵션은 앞에 0이있는 우편 번호에 필요합니다.
답변
UNSIGNED ZEROFILL
테이블 구조에서 사용해야합니다 .