Loading...
MySQL 9.5 Reference Manual 9.5의 12.3.6 Character String Literal Character Set and Collation의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
모든 문자 string 리터럴은 문자 집합과 collation을 가진다.
간단한 문장 SELECT 'string'의 경우, 그 string은
시스템 변수 character_set_connection 및 collation_connection에 의해 정의되는 connection 기본 문자 집합과 collation을 가진다.
문자 string 리터럴은 선택적인 문자 집합
introducer와 COLLATE 절을 가질 수 있으며,
이를 통해 해당 리터럴이 특정 문자 집합과
collation을 사용하는 string임을 지정할 수 있다:
1[_charset_name]'string' [COLLATE collation_name]
_charset_name
식은 형식상 _introducer_라 부른다. 이것은 파서에게
“뒤따르는 string은 문자 집합
_charset_name_을 사용한다”고 알려 준다.
introducer는 CONVERT()가 하는 것처럼
string을 introducer의 문자 집합으로 변경하지 않는다.
string 값은 변경하지 않으며, 패딩만 발생할 수 있다.
introducer는 단지 신호일 뿐이다. Section 12.3.8, “Character Set Introducers”를 참조하라.
예:
1SELECT 'abc'; 2SELECT _latin1'abc'; 3SELECT _binary'abc'; 4SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
문자 집합 introducer와 COLLATE
절은 표준 SQL 명세에 따라 구현된다.
MySQL은 문자 string 리터럴의 문자 집합과 collation을 다음과 같은 방식으로 결정한다:
__charset_name_과
COLLATE collation_name이 모두
지정된 경우, 문자 집합
_charset_name_과 collation
_collation_name_이 사용된다.
_collation_name_은
_charset_name_에 허용된
collation이어야 한다.
__charset_name_은 지정되었으나
COLLATE가 지정되지 않은 경우,
문자 집합 _charset_name_과
그 기본 collation이 사용된다. 각 문자 집합의
기본 collation을 보려면 SHOW CHARACTER SET 문장을 사용하거나
INFORMATION_SCHEMA CHARACTER_SETS 테이블을 조회하라.
__charset_name_은 지정되지 않았으나
COLLATE collation_name이
지정된 경우, 시스템 변수
character_set_connection에 의해 주어지는 connection 기본 문자 집합과
collation _collation_name_이
사용된다. _collation_name_은
connection 기본 문자 집합에 허용된 collation이어야
한다.
그렇지 않은 경우(__charset_name_과
COLLATE collation_name이
모두 지정되지 않은 경우), 시스템 변수
character_set_connection 및 collation_connection에 의해 주어지는 connection 기본 문자 집합과
collation이 사용된다.
예:
latin1 문자 집합과
latin1_german1_ci collation을 갖는
논바이너리 string:1SELECT _latin1'Müller' COLLATE latin1_german1_ci;
utf8mb4 문자 집합과 그 기본
collation(즉, utf8mb4_0900_ai_ci)을 갖는
논바이너리 string:1SELECT _utf8mb4'Müller';
binary 문자 집합과 그 기본
collation(즉, binary)을 갖는
바이너리 string:1SELECT _binary'Müller';
utf8mb4_0900_ai_ci collation을 갖는
논바이너리 string(connection 문자 집합이
utf8mb4가 아니면 실패함):1SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
1SELECT 'Müller';
introducer는 뒤따르는 string의 문자 집합을
나타내지만, 파서가 string 내부에서 이스케이프 처리를 수행하는
방식은 변경하지 않는다. 이스케이프는 항상
character_set_connection이 지정한 문자 집합에 따라 파서에 의해 해석된다.
다음 예제들은 introducer가 있는 경우에도 이스케이프 처리가
character_set_connection를 사용하여 수행됨을 보여 준다. 이 예제에서는
SET NAMES(이는 Section 12.4, “Connection Character Sets and Collations”에서 설명한 대로
character_set_connection을 변경한다)을 사용하며,
정확한 string 내용을 볼 수 있도록
HEX() 함수를 사용해 결과 string을
표시한다.
Example 1:
1mysql> SET NAMES latin1; 2mysql> SELECT HEX('à\n'), HEX(_sjis'à\n'); 3+------------+-----------------+ 4| HEX('à\n') | HEX(_sjis'à\n') | 5+------------+-----------------+ 6| E00A | E00A | 7+------------+-----------------+
여기서 à(16진수 값
E0) 뒤에는 줄바꿈에 대한 이스케이프
시퀀스인 \n이 온다. 이스케이프 시퀀스는
latin1인
character_set_connection 값을 사용해
리터럴 줄바꿈(16진수 값 0A)을
생성하도록 해석된다. 이는 두 번째 string에 대해서도
발생한다. 즉, _sjis
introducer는 파서의 이스케이프 처리에 영향을 주지 않는다.
Example 2:
1mysql> SET NAMES sjis; 2mysql> SELECT HEX('à\n'), HEX(_latin1'à\n'); 3+------------+-------------------+ 4| HEX('à\n') | HEX(_latin1'à\n') | 5+------------+-------------------+ 6| E05C6E | E05C6E | 7+------------+-------------------+
여기서 character_set_connection은
sjis인데, 이 문자 집합에서는
à 뒤에 \(16진수 값
05와 5C)가 오는 시퀀스가
유효한 멀티바이트 문자이다. 따라서 string의 처음 두
byte는 단일 sjis 문자로 해석되고,
\는 이스케이프 문자로 해석되지 않는다. 뒤따르는
n(16진수 값
6E)은 이스케이프 시퀀스의 일부로 해석되지
않는다. 이는 두 번째 string에 대해서도 마찬가지이며,
_latin1 introducer는 이스케이프 처리에 영향을
주지 않는다.
12.3.5 Column Character Set and Collation
12.3.7 The National Character Set