10.1.3.5 문자열 리터럴 문자 집합 및 데이터 정렬
각 문자열 리터럴은 문자 셋과 콜레 션이 있습니다.
문자열 리터럴은 옵션으로 문자 세트 인트로 듀서와 COLLATE
절을 지정할 수 있습니다.
[_ charset_name
] ' string
'[COLLATE collation_name
]
예 :
SELECT 'string
'; SELECT _latin1 'string
'; SELECT _latin1 'string
'COLLATE latin1_danish_ci;
간단한 문장 SELECT '
에 대해 문자열에는 string
'character_set_connection
및 collation_connection
시스템 변수에 정의 된 문자 셋과 콜레 션이 적용됩니다.
_
수식은 공식적으로 인트로 듀서라고합니다. 이것은 "후속 문자열이 문자 집합 charset_name
X
를 사용하는 "것을 퍼서에게 통지합니다. 알기 어렵 기 때문에 강조하고 있지만, 인트로 듀서는 CONVERT()
가 실시하는 인트로 듀서 문자 세트로 문자열의 변환하지 않습니다. 패딩이 이뤄질 가능성이 있지만 문자열 값은 변경하지 않습니다. 인트로 듀서는 단순한 신호입니다. 인트로 듀서는 표준 16 진수 리터럴 및 숫자의 16 진수 리터럴 표기법 ( x'
및 literal
'0x
) 앞에서도 비트 필드 리터럴 표기 ( nnnn
b'
및 literal
'0b
) 앞에서도 유효합니다. nnnn
예 :
SELECT _latin1 x'AABBCC '; SELECT _latin1 0xAABBCC; SELECT _latin1 b'1100011 '; SELECT _latin1 0b1100011;
MySQL은 리터럴 문자 집합 및 정렬 순서가 다음과 같이 결정됩니다.
_X
와COLLATE
가 모두 지정된 경우 문자 집합Y
X
와 데이터 정렬Y
가 사용됩니다._X
는 지정되어 있으나,COLLATE
가 지정되어 있지 않으면 문자 집합X
와 기본 데이터 정렬이 사용됩니다. 각 문자 집합의 기본 데이터 정렬을 확인하려면SHOW COLLATION
명령문을 사용합니다.그렇지 않은 경우는
character_set_connection
및collation_connection
시스템 변수로 지정되는 문자 셋과 콜레 션이 사용됩니다.
예 :
문자열에
latin1
문자 집합과latin1_german1_ci
데이터 정렬이 지정되어있는 경우SELECT _latin1'Müller 'COLLATE latin1_german1_ci;
문자열에
latin1
문자셋과 기본 데이터 정렬 (즉,latin1_swedish_ci
)가 지정되어있는 경우SELECT _latin1'Müller ';
문자열에 연결 기본 문자 집합 및 정렬 순서가 지정되어있는 경우
SELECT 'Müller';
문자 세트 인트로 듀서와 COLLATE
절은 표준 SQL 사양에 따라 구현되어 있습니다.
인트로 듀서는 후속 문자열의 문자 세트를 지정하지만 현재 문자열에서 파서가 이스케이프 처리를 실행하는 방법까지 변경하지 않습니다. 이스케이프는 항상 character_set_connection
에서 지정된 문자 세트에 따라 파서가 해석합니다.
다음의 예는 인트로 듀서가 존재하는 경우에도 character_set_connection
를 사용하여 이스케이프 처리가 행해지는 것을 나타냅니다. 예를 들어, SET NAMES
( 섹션 10.1.4 "연결 문자 집합 및 정렬 순서" 에서 설명하고있는 바와 같이, character_set_connection
을 변경합니다)를 사용하여 정확한 문자열의 내용을 확인할 수 있도록 HEX()
함수를 사용하여 결과 문자열을 표시합니다.
예 1 :
mysql>SET NAMES latin1;
Query OK, 0 rows affected (0.01 sec) mysql>SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+ | HEX('à\n') | HEX(_sjis'à\n') | +------------+-----------------+ | E00A | E00A | +------------+-----------------+ 1 row in set (0.00 sec)
여기에서는 " à
"(16 진수 값 E0
) 뒤에 줄 바꿈 이스케이프 시퀀스 인 ' \n
'이 계속되고 있습니다. 이 이스케이프 시퀀스는 latin1
의 character_set_connection
값을 사용하여 해석 리터럴 개행 (16 진수 0A
)을 생성합니다. 이것은 두 번째 문자열도 이루어집니다. 즉, _sjis
의 인트로 듀서는 파서의 이스케이프 처리에 영향을 미치지 않습니다.
예 2 :
mysql>SET NAMES sjis;
Query OK, 0 rows affected (0.00 sec) mysql>SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+ | HEX('à\n') | HEX(_latin1'à\n') | +------------+-------------------+ | E05C6E | E05C6E | +------------+-------------------+ 1 row in set (0.04 sec)
여기에서는 character_set_connection
는 sjis
입니다. 이 캐릭터 세트는 " à
"뒤에" \
"(16 진수 값 05
및 5C
)가 뒤를이었다 시퀀스는 유효한 멀티 바이트 문자입니다. 따라서 문자열의 처음 두 바이트는 단일 sjis
문자로 해석되어 " \
"는 이스케이프 문자로 해석되지 않습니다. 후속 " n
"(16 진수 값 6E
) 이스케이프 시퀀스의 일부로 해석되지 않습니다. 이것은 두 번째 문자열에 적용됩니다. _latin1
의 인트로 듀서는 이스케이프 처리에 영향을 미치지 않습니다.