커피와 개발자

[Oracle]ORA-12899: value too large for column 본문

데이터베이스/Oracle

[Oracle]ORA-12899: value too large for column

광박이 2017. 12. 15. 18:59
728x90

ORA-12899: value too large for column

ORA-12899: "유저명"."테이블명"."컬럼명" 열에 대한 값이 너무 큼(실제: m, 최대값: n)


ORA-12899는 INSERT를 한다거나 UPDATE를 하다가 다음과 같은 에러가 발생하는 경우가 있다.

실제로 최대값보다 실제 입력된 값이 커서 발생하는 경우이다.

오라클의 문자셋 NLS_CHARACTERSET의 설정의 문제다 ( 캐릭터셋(charset)의 문제 -> UTF-8 과 ASCII의 Byte 수가 달라 각 3Byte, 2Byte, 1Byte를 계산하다 문제가 생긴 경우)

대다수의 경우는 다음과 같이 해결이 된다.

SELECT NAME,VALUE$ FROM PROPS$ WHERE NAME LIKE 'NLS%' ;

위의 쿼리로 설정된 정보를 확인한다.

UPDATE PROPS$ SET VALUE$ = 'KO16KSC5601' ;

UPDATE 쿼리를 수행한 후 오라클을 재가동 한다.

라고 되어있는데 보통 컬럼의 크기를 조정하는 경우도 있다.


이번 포스팅의 경우는 다른경우인데 문제는 공백이었다.

쉽게 발생하는 케이스가 아니라서, 보통 위의 경우라면 해결방법이 인터넷에 많이 올라와있지만 공백의 경우 찾기도 쉽지 않고 설마 공백이 문제가 될 거라 생각하지 않았다.

대부분 실제 입력 값이 크지 않고 입력되는 값이 모두 영어인 경우라면 다음을 확인해보면 될 것 같다.

공백값 chr(49824)

오라클 공백값이 기존 1byte의 스페이스 키를 입력하여 나온 chr(32) 이다.

하지만 에러가 나는 공백값은 아닌 chr(49824)는 2Byte이다. (공백인듯 공백아닌 공백같은)

두 공백문자를 비교하면

 chr(32)

 chr(49824)

 1Byte

 2Byte

 trim가능, replace 처리가 스페이스 키로 만든 공백으로 처리 가능

 trim불가, replace 처리가 스페이스 키로 만든 공백으로는 불가능

가장 쉽게 해결하는 방법은 해당 공백을 복사하여 replace해주는 방법이다.

SELECT REPLACE(CHR(49824), ' ', ' ') FROM DUAL;

이 공백문자를 만들기도 힘든데 어떻게 들어왔는지는 모르겠다. (어디선가 Ctrl + CV했겠지...)

728x90
Comments