Loading...
MySQL 9.5 Reference Manual 9.5의 14.8.3 Character Set and Collation of Function Results의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
MySQL에는 문자열을 반환하는 많은 연산자와 함수가 있습니다. 이 절에서는 다음 질문에 답합니다: 그러한 문자열의 character set과 collation은 무엇입니까?
문자열 입력을 받아 문자열 결과를 출력하는 단순한 함수의 경우, 출력의 character set과 collation은 주된 입력 값의 것과 동일합니다. 예를 들어, UPPER(X)는 _X_와 동일한 character set과 collation을 가지는 문자열을 반환합니다. 이는 INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE(), 그리고 UPPER()에 대해서도 마찬가지입니다.
참고
REPLACE() 함수는 다른 모든 함수들과 달리 항상 문자열 입력의 collation을 무시하고 대소문자 구분 비교를 수행합니다.
문자열 입력이나 함수 결과가 바이너리 문자열이면, 해당 문자열은 binary character set과 collation을 가집니다. 이는 CHARSET() 및 COLLATION() 함수를 사용하여 확인할 수 있으며, 두 함수 모두 바이너리 문자열 인자에 대해 binary를 반환합니다:
1mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a'); 2+---------------------+-----------------------+ 3| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') | 4+---------------------+-----------------------+ 5| binary | binary | 6+---------------------+-----------------------+
여러 문자열 입력을 결합하고 단일 문자열 출력을 반환하는 연산의 경우, 결과의 collation을 결정할 때 표준 SQL의 “aggregation rule”이 적용됩니다:
명시적인 COLLATE Y가 존재하면 _Y_를 사용합니다.
명시적인 COLLATE Y와 COLLATE Z가 모두 존재하면 error를 발생시킵니다.
그렇지 않고 모든 collation이 _Y_이면, _Y_를 사용합니다.
그렇지 않으면 결과는 collation을 가지지 않습니다.
예를 들어, CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END의 경우, 결과 collation은 _X_입니다. 이는 UNION, ||, CONCAT(), ELT(), GREATEST(), IF(), 그리고 LEAST()에 대해서도 동일하게 적용됩니다.
문자 데이터로 변환하는 연산의 경우, 연산 결과로 나오는 문자열의 character set과 collation은 기본 커넥션 character set과 collation을 결정하는 시스템 변수인 character_set_connection 및 collation_connection에 의해 정의됩니다 (Section 12.4, “Connection Character Sets and Collations” 참조). 이는 BIN_TO_UUID(), CAST(), CONV(), FORMAT(), HEX(), 그리고 SPACE()에만 적용됩니다.
앞서 언급한 원칙에 대한 예외는 virtual generated column을 위한 expression에서 발생합니다. 이러한 expression에서는, 커넥션 character set과 무관하게 테이블 character set이 BIN_TO_UUID(), CONV(), 또는 HEX() 결과에 대해 사용됩니다.
문자열 함수가 반환하는 결과의 character set이나 collation에 대해 궁금한 점이 있다면, CHARSET() 또는 COLLATION() 함수를 사용하여 확인하십시오:
1mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER()); 2+----------------+-----------------+--------------------+ 3| USER() | CHARSET(USER()) | COLLATION(USER()) | 4+----------------+-----------------+--------------------+ 5| test@localhost | utf8mb3 | utf8mb3_general_ci | 6+----------------+-----------------+--------------------+ 7mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc')); 8+--------------------------+----------------------------+ 9| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) | 10+--------------------------+----------------------------+ 11| binary | binary | 12+--------------------------+----------------------------+
14.8.2 Regular Expressions
14.9 Full-Text Search Functions