Loading...
MySQL 9.5 Reference Manual 9.5의 12.7 Column Character Set Conversion의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
특정 캐릭터 세트를 사용하도록 바이너리 또는 논바이너리 문자열 컬럼을 변환하려면 ALTER TABLE을 사용합니다. 변환이 성공적으로 이루어지려면 다음 조건 중 하나가 만족되어야 합니다:
컬럼이 바이너리 데이터 타입
( BINARY,
VARBINARY,
BLOB)인 경우, 그 안에 포함된 모든 값이 단일 캐릭터 세트(해당 컬럼을 변환하려는 대상 캐릭터 세트)로 인코딩되어 있어야 합니다. 바이너리 컬럼을 사용하여 여러 캐릭터 세트의 정보를 저장하는 경우, MySQL은 어떤 값이 어떤 캐릭터 세트를 사용하는지 알 방법이 없으므로 데이터를 올바르게 변환할 수 없습니다.
컬럼이 논바이너리 데이터 타입
( CHAR,
VARCHAR,
TEXT)인 경우, 그 내용은 컬럼의 캐릭터 세트로 인코딩되어 있어야 하며, 다른 캐릭터 세트로 인코딩되어 있어서는 안 됩니다. 내용이 다른 캐릭터 세트로 인코딩되어 있다면, 먼저 컬럼을 바이너리 데이터 타입으로 변환한 다음, 원하는 캐릭터 세트를 사용하는 논바이너리 컬럼으로 변환할 수 있습니다.
테이블 t에 col1이라는 바이너리 컬럼이 있고, 이 컬럼이 VARBINARY(50)으로 정의되어 있다고 가정합니다. 컬럼 안의 정보가 단일 캐릭터 세트로 인코딩되어 있다고 가정하면, 해당 캐릭터 세트를 가지는 논바이너리 컬럼으로 변환할 수 있습니다. 예를 들어, col1이 greek 캐릭터 세트의 문자를 나타내는 바이너리 데이터를 포함하고 있다면, 다음과 같이 변환할 수 있습니다:
1ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek;
원래 컬럼의 타입이 BINARY(50)인 경우, 이를 CHAR(50)으로 변환할 수 있습니다. 그러나 결과 값은 끝에 0x00 바이트로 패딩되며, 이는 원치 않을 수 있습니다. 이러한 바이트를 제거하려면 TRIM() 함수를 사용합니다:
1UPDATE t SET col1 = TRIM(TRAILING 0x00 FROM col1);
테이블 t에 col1이라는 논바이너리 컬럼이 있고, 이 컬럼이 CHAR(50) CHARACTER SET latin1으로 정의되어 있지만 여러 언어의 값을 저장할 수 있도록 이를 utf8mb4를 사용하도록 변환하고 싶다고 가정합니다. 다음 스테이트먼트가 이를 수행합니다:
1ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8mb4;
컬럼에 두 캐릭터 세트 모두에 존재하지 않는 문자가 포함되어 있다면, 변환 과정에서 정보 손실이 발생할 수 있습니다.
특수한 경우로, MySQL 4.1 이전의 오래된 테이블에서 논바이너리 컬럼에 서버의 기본 캐릭터 세트와는 다른 캐릭터 세트로 인코딩된 값이 실제로 포함되어 있는 경우가 있습니다. 예를 들어, 어떤 애플리케이션이 MySQL의 기본 캐릭터 세트가 다른 값이었음에도 불구하고 컬럼에 sjis 값을 저장했을 수 있습니다. 컬럼을 올바른 캐릭터 세트를 사용하도록 변환하는 것은 가능하지만, 추가 단계가 필요합니다. 서버의 기본 캐릭터 세트가 latin1이고 col1이 CHAR(50)으로 정의되어 있지만 그 내용이 sjis 값인 경우를 가정해 보겠습니다. 첫 번째 단계는 컬럼을 바이너리 데이터 타입으로 변환하는 것으로, 이는 어떤 캐릭터 변환도 수행하지 않고 기존 캐릭터 세트 정보를 제거합니다:
1ALTER TABLE t MODIFY col1 BLOB;
다음 단계는 컬럼을 올바른 캐릭터 세트를 사용하는 논바이너리 데이터 타입으로 변환하는 것입니다:
1ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;
이 절차를 사용하려면, 테이블이 MySQL 4.1 이상으로 업그레이드된 이후 INSERT나
UPDATE와 같은 스테이트먼트로 이미 수정되지 않았어야 합니다. 그런 경우 MySQL은 컬럼에 새로운 값을 latin1을 사용하여 저장하게 되고, 컬럼에는 sjis 값과 latin1 값이 섞여 있게 되어 올바르게 변환할 수 없습니다.
컬럼을 처음 생성할 때 애트리뷰트를 지정했다면, 테이블을 ALTER TABLE로 변경할 때도 해당 애트리뷰트를 지정해야 합니다. 예를 들어, NOT NULL과 명시적인 DEFAULT 값을 지정했다면, ALTER TABLE 스테이트먼트에서도 이를 제공해야 합니다. 그렇지 않으면, 결과 컬럼 정의에는 해당 애트리뷰트가 포함되지 않습니다.
테이블의 모든 캐릭터 컬럼을 변환하기 위해 ALTER TABLE ... CONVERT TO CHARACTER SET charset 스테이트먼트가 유용할 수 있습니다. Section 15.1.11, “ALTER TABLE Statement”를 참조하십시오.
참고
테이블 또는 컬럼의 캐릭터 세트나 콜레이션을 변경하는 ALTER TABLE 스테이트먼트는 ALGORITHM=COPY를 사용하여 수행해야 합니다. 자세한 내용은 Section 17.12.1, “Online DDL Operations”을 참조하십시오.
12.6 Error Message Character Set
12.8 Collation Issues