CentOS 6.2 64비트 버전 OS 에 큐브리드 4.0 64비트 버전을 쓰고 있습니다
A 라는 테이블에 B 라는 컬럼을 VARCHAR(4) 로 생성하고 나서
insert into A (B) values ('1234567') ;
이렇게 쿼리를 날리면 에러가 발생하지 않고 짤려서 들어갑니다 (1234 까지만)
insert into A (B) values ('하하') ;
이렇게 쿼리를 날리면 하ㅁ 이렇게 깨져서 저장이 됩니다
첨부한 그림파일을 보시면 결과를 캡쳐하였습니다
UTF-8 형식이고 single_byte_compare = yes 로 되어 있는데 이것이 상관이 있는지요?
제가 원하는것은 크기를 벗어나는 문자열이 입력되면 짤려서 들어가는것이 아니고 에러가 나면서
insert 가 되지 않았으면 좋겠습니다 해결책이 있는지 궁금합니다
- UTF-8 환경에서 VARCHAR(4)에 '하하'를 저장하면 마지막 글자가 깨진다
왜냐하면 UTF-8은 한글, 특수문자에 대해 한 문자가 3바이트로 처리되므로 마지막 글자를 저장할 공간이 2바이트 부족합니다.
그러므로 자리수 2btye를 늘려야 합니다.
- Query Editor에서 Length함수를 사용하면 길이값을 알 수 있습니다.
[ 예)SELECT LENGTH('하하'); ]
해결 방법
- Query Editor상에서 Data를 저장하지 않기 위한 방법
INSERT INTO A(B)
SELECT CASE WHEN LENGTH('하하') = 4 THEN '하하' END
FROM db_root
WHERE CASE WHEN LENGTH('하하') = 4 THEN '하하' END IS NOT NULL;
- 일반적으로 개발에서의 처리방법
1. 응용단(Java, JavaScript, PHP, 개발Tool)에서 입력값 체크
1) 입력값에 대한 자리수 체크한다.
2) 입력값를 한문자씩 ASCII코드값으로 가져와 0~127까지면 정상적인 값이고,
그외는 한글이나 특수문자을 판단하고 처리하는 함수를 만들어서 사용하셔야 합니다.
3) 위 1,2번에 대한 작업을 완료한 다음에 Insert문을 사용하면 됩니다.
2. 자리수를 늘리는 방법
1) 컬럼의 자리수를 늘린다.
2) 응용단(Java, JavaScript, PHP, 개발Tool)에서 입력값의 대한 자리수 체크한다.
3) 위 1,2에 대한 작업을 완료한 다음에 Insert문을 사용하면 됩니다.