Mysql document를 읽던 도중 PAD_CHAR_TO_FULL_LENGTH 옵션에 대해 알게 되었다.
고정길이 문자형 변수를 저장하는 CHAR타입 컬럼에 이 옵션을 disable시키면, VARCHAR타입과 같이 남은 공간을 space가 아닌 null로 처리해주는 옵션이었다. (default로 활성화되어있는 변수이기 때문에, CHAR타입의 길이보다 적게 데이터를 입력하면 알아서 space처리가 된다.)
그렇다면 VARCHAR형과 같은 데이터 타입인데.. 굳이 이 옵션을 만들어서 둘을 구분해 둔 이유가 궁금해서 테스트를 진행해 보았다.
테스트 환경은 macOS Catalina 10.15, MySQL 5.7 버전을 사용하였다.
char type
우선 PAD_CHAR_TO_FULL_LENGTH = disable 상태에서
CHAR(10) 짜리 column에 여러 길이의 데이터를 삽입해 보았다.
그 결과, 길이보다 짧은 값을 넣은 row는 남은 부분을 null로 처리하여 글자 수만큼의 길이값을 반환하였고,
길이보다 큰 값을 넣은 row는 경고가 발생하며 초과하는 부분은 잘려서 insert됨을 확인할 수 있었다.
varchar type
VARCHAR형의 경우, PAD_CHAR_TO_FULL_LENGTH 옵션이 없다.(해당 옵션은 char 전용 옵션)
같은 사이즈의 VARCHAR(10) column에 여러 길이의 데이터를 삽입해 본 결과, char형일 때와 같은 결과를 보였다.
test 2
CHAR type의 max size는 255자, VARCHAR type은 65535 bytes이다. (mySQL 5.7기준)
따라서 CHAR(255), VARCHAR(500) 컬럼에 500자 길이 string을 insert해 보았다.
※ VARCHAR 타입의 최대 길이 65535 bytes는 mySQL에서 한 레코드의 최대 길이인 65535bytes에서 온 것이다. 즉, 한 레코드가 단일 컬럼일 경우에만 65535byte의 길이 데이터를 삽입할 수 있다. 실험환경에서는 4개의 컬럼이 존재했으므로, VARCHAR컬럼의 최대 길이를 65535로 설정하면 mySQL상에서 자동으로 medium text type으로 형변환을 시키는 현상이 발생하여 적당한 값인 500으로 조절하였다.
실험 결과, 아까와 같이 최대 길이를 초과하면 나머지 부분은 알아서 Truncate됨을 확인할 수 있었다.
Conclusion
- CHAR형에서 PAD_CHAR_TO_FULL_LENGTH 옵션을 비활성화하면 VARCHAR형과 똑같이 동작한다, 그러나, 두 타입의 최대 길이(255자와 65535bytes)에 차이가 있다.
- PAD_CHAR_TO_FULL_LENGTH 변수는 mySQL 8.0.13버전부터 지원하지 않는다고 한다. 옵션이 곧 사라지고 CHAR형은 남는 공간을 space로 채워 고정길이를 유지하는 변수로만 사용하는 규칙을 따를 것으로 보인다!
출처: dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_pad_char_to_full_length
'MySQL' 카테고리의 다른 글
[Collation] UTF8 charset & collation 비교 (0) | 2021.02.26 |
---|---|
Year 2038 Problem (0) | 2021.02.26 |
[InnoDB] Redo Log와 checkpoint age (0) | 2021.02.22 |
[InnoDB] In-memory buffer의 종류 (0) | 2021.02.19 |
06. 트랜잭션에 대한 격리 수준(isolation level) (0) | 2020.06.23 |