http://www.mysqlkorea.co.kr
한글매뉴얼 5.0 , 한글매뉴얼 5.1 , MySQL 5.1 HA , 사용자매뉴얼
한글매뉴얼 5.0  
한글매뉴얼 5.1  
MYSQL 5.1 HA  
사용자매뉴얼  
영문매뉴얼  
최신글
foreign key 설정…
인텍스 추가 등에…
mysql master - s…
다대다 관계에서 …
mysql my파일과 …
 
한글매뉴얼 5.0 > 매뉴얼존 > 한글매뉴얼 5.0
 

11.4.1. CHAR VARCHAR 타입

 

CHAR VARCHAR 타입은 서로 비슷하지만, 저장 및 추출하는 방식에서 서로 차이가 있다.
MySQL 5.0.3
버전까지는, 두 타입간에는 최대 길이 및 트레일링 스페이스(trailing space)
유지 되는지에 관해서도 차이점을 가진다.
 
CHAR VARCHAR 타입은 여러분이 저장하고자 하는 문자의 최대 숫자를 지정하는 길이와
함께 선언된다. 예를 들면,
CHAR(30) 30개의 문자를 저장할 수가 있다.
 
CHAR 컬럼의 길이는 여러분이 테이블을 생성할 때 선언한 길이에 고정이 된다. 그 길이는
0 에서 255 사이의 값을 가진다. CHAR 값을 저장할 때에는, 지정된 길이를 맞추기 위해서
오른쪽에 스페이스를 집어 넣게 된다.
CHAR 값을 추출할 때에는, 이렇게 추가된 스페이스가
제거된다.
 
VARCHAR 컬럼에 저장되어 있는 값들은 변수-길이 스트링이다. 그 길이는 MySQL 5.0.3
이전에는 0에서 255 사이의 값을 가질 수 있었으며, 5.0.3 이후의 버전에서는 0에서 65,535
사이의 값을 가지게 된다.
 
CHAR와는 반대로, VARCHAR 값은 필요한 문자 수 만큼만을 사용해서 저장되며,
여기에 길이를 기록하는 1 바이트가 추가 된다 (255 보다 긴 길이로 선언된 컬럼에 대해서는
2
바이트가 추가 됨).
 
VARCHAR 값을 저장할 때에는 스페이스가 따라 붙지 않는다. 트레일링 스페이스를 처리하는
것은 버전에 따라 다르게 된다. MySQL 5.0.3 버전 이후에는, 표준 SQL 에서 처럼, 값을 저장
및 추출할 때 트레일링 스페이스를 유지한다. MySQL 5.0.3 버전 이전에는,
VARCHAR 컬럼에
값을 저장할 때 트레일링 스페이스가 값에서 제거가 된다; 이것은 값을 추출할 때에도
스페이스가 없게 된다는 것을 의미한다.
 
만일 여러분이 컬럼의 최대 길이를 초과하는 CHAR 또는 VARCHAR 컬럼에 값을 할당한다면,
그 값은 허용된 길이에 맞도록 잘리게 된다 (truncated). 만일 이렇게 잘린 문자가 스페이스가
아니라면, 경고문이 발생한다. 스페이스가 아닌 문자를 제거 (truncation)할 경우에 경고가
아닌 에러를 발생시키도록 할 수가 있고 스트릭트 SQL모드를 사용해서 값을 삽입하는 것을
막을 수도 있다. Section 5.2.5, “서버 SQL 모드를 참조.
 
MySQL 5.0.3 이전에서는, 만일 트레일링 스페이스가 제거되지 않는 데이터 타입을 필요로 할
경우에는,
BLOB 또는 TEXT 타입을 사용하면 된다. 또한, 만일 임의의 바이트 값을 가지고
있는 암호 또는 압축 함수에서 얻는 결과와 같은 바이너리 값을 저장하고자 한다면,
CHAR
또는 VARCHAR 컬럼 보다는 BLOB 컬럼을 사용한다 이렇게 하면 트레일링 스페이스를
삭제함으로서 발생될 수 있는 데이터 값의 변화를 피할 수가 있게 된다.
 
아래의 테이블은 CHAR VARCHAR 간의 차이점에 대해서 예시를 하고 있다:
 

Value

CHAR(4)

Storage Required

VARCHAR(4)

Storage Required

''

'    '

4 bytes

''

1 byte

'ab'

'ab  '

4 bytes

'ab'

3 bytes

'abcd'

'abcd'

4 bytes

'abcd'

5 bytes

'abcdefgh'

'abcd'

4 bytes

'abcd'

5 bytes

 
테이블의 마지막 줄에서 보이는 값들은 스트릭트 모드를 사용하지 않았을 경우에만 적용되는
것임을 알아두자; 만일 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 값들은 어떠한 트레일링 스페이스와는 상관 없이 비교된다는 것을 의미하는
것이다. 예를 들면:
mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10)); 
Query OK, 0 rows affected (0.09 sec)

mysql>
INSERT INTO names VALUES ('Monty ', 'Monty ');
 
Query OK, 1 row affected (0.00 sec)
 
 
mysql> SELECT myname = 'Monty ', yourname = 'Monty  ' FROM names; 
+--------------------+----------------------+
| myname = 'Monty  ' | yourname = 'Monty  ' |
+--------------------+----------------------+
|                  1 |                    1 |
+--------------------+----------------------+
1 row in set (0.00 sec)
이것은 모든 MySQL 버전에 공통으로 적용되는 사항임을 알아 두자.
상위
11.4.1. CHAR 및 VARCHAR 타…
MySQL Korea 사이트의 컨텐츠 소유권은 (주)상상이비즈에 있으므로 무단전재를 금합니다.
Copyright ⓒ ssebiz All Rights Reserved.