10.1.7.6 _bin 및 binary 데이터 정렬
이 섹션에서는 비 이진 문자열의 _bin
데이터 정렬이 이진 문자열 binary
"데이터 정렬"과 어떻게 다른지에 대해 설명합니다.
비 이진 문자열 ( CHAR
, VARCHAR
및 TEXT
데이터 유형에 포함)에는 문자 셋과 콜레 션이 있습니다. 특정 문자 집합에 여러 데이터 정렬을 지원하는 수 있으며, 그 각각이 세트의 문자의 구체적인 정렬 및 비교 순서를 정의하고 있습니다. 이들 중 하나가 문자 세트의 이진 데이터 정렬이며, 그 데이터 정렬 이름 중에는 _bin
접미사가 있습니다. 예를 들어, latin1
과 utf8
에는 latin1_bin
및 utf8_bin
라는 이진 데이터 정렬이 있습니다.
이진 문자열 ( BINARY
, VARBINARY
, 그리고 BLOB
데이터 유형에 포함)에는 비 이진 문자열에있는 것 같은 문자 세트 및 데이터 정렬은 없습니다. ( CHARSET()
와 COLLATION()
함수는 모두 이진 문자열에 적용되면 binary
값을 반환합니다.) 이진 문자열은 바이트의 시퀀스이며,이 바이트의 숫자 정렬 순서를 결정 합니다.
_bin
데이터 정렬은 몇 가지 점에서 binary
데이터 정렬과 다릅니다.
정렬 및 비교 단위. 이진 문자열은 바이트 순서입니다. 정렬 및 비교는 항상 숫자의 바이트 값에 따라 결정됩니다. 비 이진 문자열은 문자의 시퀀스이며, 이것은 멀티 바이트 일 수도 있습니다. 비 이진 문자열 데이터 정렬은 문자 값의 정렬 및 비교의 순서를 정의합니다. _bin
데이터 정렬의 경우,이 순서는 문자의 바이너리 코드 값에만 근거합니다 (이것은 _bin
데이터 정렬은 멀티 바이트 문자의 가능성을 고려할 필요가있는 점을 제외하면 이진 문자열의 순서에 비슷합니다). 다른 데이터 정렬의 경우, 문자의 순서는 대문자와 소문자의 구별 등의 기타 요소를 고려에 넣을 수 있습니다.
문자 집합 변환. 비 이진 문자열은 문자 세트가 많은 경우 문자열에 _bin
데이터 정렬이있는 경우에도 다른 문자 집합으로 변환됩니다.
다른 문자 집합을 가진 다른 컬럼에서 컬럼 값을 할당하는 경우 :
UPDATE t1 SET utf8_bin_column = latin1_column; INSERT INTO t1 (latin1_column) SELECT utf8_bin_column FROM t2;
문자열 리터럴을 사용하여
INSERT
또는UPDATE
의 컬럼 값을 할당하는 경우 :SET NAMES latin1; INSERT INTO t1 (utf8_bin_column) VALUES ( 'string-in-latin1');
서버에서 클라이언트로 결과를 전송하는 경우 :
SET NAMES latin1; SELECT utf8_bin_column FROM t2;
바이너리 문자열 컬럼의 경우 변환되지 않습니다. 위의 경우 문자열 값은 바이트처럼 복사됩니다.
대소 문자 변환. 데이터 정렬은 문자의 대소 문자에 대한 정보를 가지고 있기 때문에 비 이진 문자열의 문자는 대소 문자를 변환 할 수 있습니다. 이것은 순서로 대문자와 소문자의 구별을 무시 _bin
데이터 정렬의 경우에도 해당합니다.
mysql>SET NAMES latin1 COLLATE latin1_bin;
Query OK, 0 rows affected (0.02 sec) mysql>SELECT LOWER('aA'), UPPER('zZ');
+-------------+-------------+ | LOWER('aA') | UPPER('zZ') | +-------------+-------------+ | aa | ZZ | +-------------+-------------+ 1 row in set (0.13 sec)
대소 문자라는 개념은 이진 문자열의 바이트에는 적용되지 않습니다. 대소 문자 변환하려면 문자열을 비 이진 문자열로 변환해야합니다.
mysql>SET NAMES binary;
Query OK, 0 rows affected (0.00 sec) mysql>SELECT LOWER('aA'), LOWER(CONVERT('aA' USING latin1));
+-------------+-----------------------------------+ | LOWER('aA') | LOWER(CONVERT('aA' USING latin1)) | +-------------+-----------------------------------+ | aA | aa | +-------------+-----------------------------------+ 1 row in set (0.00 sec)
비교에서 후행 공백을 처리합니다. 비 이진 문자열은 _bin
데이터 정렬을 포함한 모든 데이터 정렬에 대한 PADSPACE
동작이 있습니다. 후행 공백은 비교 의미가 없습니다.
mysql>SET NAMES utf8 COLLATE utf8_bin;
Query OK, 0 rows affected (0.00 sec) mysql>SELECT 'a ' = 'a';
+------------+ | 'a ' = 'a' | +------------+ | 1 | +------------+ 1 row in set (0.00 sec)
이진 문자열은 후행 공백을 포함한 모든 문자를 비교 중요합니다.
mysql>SET NAMES binary;
Query OK, 0 rows affected (0.00 sec) mysql>SELECT 'a ' = 'a';
+------------+ | 'a ' = 'a' | +------------+ | 0 | +------------+ 1 row in set (0.00 sec)
삽입 및 제거에 후행 공백을 처리합니다. CHAR(
열은 비 이진 문자열이 저장됩니다. N
)N
문자보다 짧은 값은 삽입시 공백으로 확장됩니다. 제거의 경우 후행 공백은 삭제됩니다.
BINARY(
열은 이진 문자열이 저장됩니다. N
)N
바이트보다 짧은 값은 삽입시에 0x00
바이트로 확장됩니다. 제거의 경우 아무것도 삭제되지 않고 선언 된 길이 값이 항상 반환됩니다.
mysql>CREATE TABLE t1 (
->a CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin,
->b BINARY(10)
->);
Query OK, 0 rows affected (0.09 sec) mysql>INSERT INTO t1 VALUES ('a','a');
Query OK, 1 row affected (0.01 sec) mysql>SELECT HEX(a), HEX(b) FROM t1;
+--------+----------------------+ | HEX(a) | HEX(b) | +--------+----------------------+ | 61 | 61000000000000000000 | +--------+----------------------+ 1 row in set (0.04 sec)