11.4.1 CHAR 및 VARCHAR 형
CHAR
형과 VARCHAR
형은 비슷하지만, 저장 및 검색 방법이 다릅니다. 또한 최대 길이 및 후행 공백이 유지되는지 여부는 점에서 다릅니다.
CHAR
형과 VARCHAR
형은 포함하는 최대 문자 수를 나타내는 길이가 선언되어 있습니다. 예를 들어, CHAR(30)
에는 최대 30 문자를 저장할 수 있습니다.
CHAR
컬럼의 길이는 테이블을 생성 할 때 선언 한 길이로 수정됩니다. 이 길이는 0에서 255까지의 값을 지정할 수 있습니다. CHAR
값은 저장 될 때 지정된 길이가되도록 오른쪽이 공백으로 채워집니다. PAD_CHAR_TO_FULL_LENGTH
SQL 모드가 활성화되어 있지 않은 한, CHAR
값을 추출 할 때 후행 공백이 제거됩니다.
VARCHAR
컬럼의 값은 가변 길이의 문자열입니다. 길이는 0에서 65,535까지의 값으로 지정할 수 있습니다. VARCHAR
컬럼의 최대 유효 길이는 최대 행 크기 (65,535 바이트 모든 컬럼에서 공유되는)과 사용되는 문자 세트에 의해 결정됩니다. 섹션 D.10.4 "테이블 컬럼 및 행 크기 제한" 을 참조하십시오.
CHAR
과는 대조적으로, VARCHAR
값은 1 바이트 또는 2 바이트 길이의 프리픽스가있는 데이터로 저장됩니다. 길이 프리픽스 값에 포함 된 바이트 수를 나타냅니다. 255 바이트 이하의 값을 저장하는 컬럼에서는 1 바이트 길이의 프리픽스를 사용하여 255 바이트보다 큰 값을 저장하는 컬럼에서는 2 바이트 길이의 프리픽스를 사용합니다.
엄격한 SQL 모드가 유효하지 않은 경우, CHAR
또는 VARCHAR
컬럼에 최대 길이를 초과하는 값을 지정하면 그 값은 컬럼의 최대 길이에 맞게 절단되고 경고 메시지가 표시됩니다. 공백이 아닌 문자의 절단에 대해서는 엄격한 SQL 모드를 사용하면 경고가 아닌 오류를 발생시키고, 그 값의 삽입을 억제 할 수 있습니다. 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.
VARCHAR
컬럼의 경우 사용하는 SQL 모드에 관계없이 컬럼 길이를 초과 후행 공백은 삽입 전에 잘리고 경고 메시지가 표시됩니다. CHAR
컬럼의 경우 SQL 모드에 관계없이 초과 한 후행 공백은 예고없이 삽입되는 값에서 잘립니다.
VARCHAR
값은 저장 될 때 묻혀 없습니다. 표준 SQL에 따라 값을 저장하고 꺼낼 때 후행 공백은 유지됩니다.
다음 표는 CHAR(4)
컬럼과 VARCHAR(4)
컬럼에 다양한 문자열 값을 포함하는 결과를 표시하여 CHAR
와 VARCHAR
의 차이를 보여줍니다 (컬럼에는 latin1
등의 싱글 바이트 문자 세트를 사용하는 것으로합니다).
값 | CHAR(4) | 필요한 스토리지 | VARCHAR(4) | 필요한 스토리지 |
---|---|---|---|---|
'' | ' ' | 4 바이트 | '' | 1 바이트 |
'ab' | 'ab ' | 4 바이트 | 'ab' | 3 바이트 |
'abcd' | 'abcd' | 4 바이트 | 'abcd' | 5 바이트 |
'abcdefgh' | 'abcd' | 4 바이트 | 'abcd' | 5 바이트 |
테이블의 마지막 행에 포함 된 것으로 표시된 값은 엄격 모드를 사용하지 않는 경우에만 적용됩니다. MySQL가 엄격 모드에서 실행되는 경우, 컬럼 길이를 초과하는 값은 저장되지 않고 오류가 발생합니다.
소정의 값이 CHAR(4)
및 VARCHAR(4)
컬럼에 저장하면 열기 때 후행 공백이 CHAR
컬럼에서 제거되므로 열로부터 추출 된 값은 반드시 동일하지 않습니다. 다음 예제는이 차이를 보여줍니다.
mysql>CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec) mysql>SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+ | CONCAT('(', v, ')') | CONCAT('(', c, ')') | +---------------------+---------------------+ | (ab ) | (ab) | +---------------------+---------------------+ 1 row in set (0.06 sec)
CHAR
컬럼과 VARCHAR
컬럼의 값은 그 컬럼에 할당 된 문자 집합의 조합 순서에 따라 정렬 및 비교됩니다.
MySQL의 모든 데이터 정렬은 PADSPACE
형의 것입니다. 이것은 MySQL의 모든 CHAR
, VARCHAR
및 TEXT
값이 후행 공백에 관계없이 비교되는 것을 의미합니다. 이러한 맥락에서 '비교'는 후행 공백이 의미를 가지는 LIKE
패턴 매칭 연산자는 포함되지 않습니다. 예 :
mysql>CREATE TABLE names (myname CHAR(10));
Query OK, 0 rows affected (0.03 sec) mysql>INSERT INTO names VALUES ('Monty');
Query OK, 1 row affected (0.00 sec) mysql>SELECT myname = 'Monty', myname = 'Monty ' FROM names;
+------------------+--------------------+ | myname = 'Monty' | myname = 'Monty ' | +------------------+--------------------+ | 1 | 1 | +------------------+--------------------+ 1 row in set (0.00 sec) mysql>SELECT myname LIKE 'Monty', myname LIKE 'Monty ' FROM names;
+---------------------+-----------------------+ | myname LIKE 'Monty' | myname LIKE 'Monty ' | +---------------------+-----------------------+ | 1 | 0 | +---------------------+-----------------------+ 1 row in set (0.00 sec)
이것은 MySQL의 모든 버전에 해당 서버의 SQL 모드의 영향을받지 않습니다.
MySQL의 문자 집합 및 정렬 순서에 대한 자세한 내용은 섹션 10.1 "문자 집합 지원" 을 참조하십시오. 스토리지 요구 사항에 대한 자세한 내용은 섹션 11.7 "데이터 타입 스토리지 요구 사항" 을 참조하십시오.
후행 채움 문자가 제거되거나 비교에서 무시되거나하는 경우는 고유 한 값을 필요로하는 인덱스 컬럼에 포함되어 있으면 끝에 포함 문자의 개수 만 다른 컬럼 값에 삽입 중복 키 오류가 발생합니다. 예를 들어, 테이블에 'a'
가 포함되어있는 경우 'a '
를 저장하려고하면 중복 키 오류가 발생합니다.