현상
MySQL의 '' (empty string, 빈 문자열) 데이터를 Tibero로 이관 시 JDBC-10005: NOT NULL constraint violation 에러가 발생하였습니다.
원인
MySQL에서는 '' (빈 문자열)을 NULL이 아닌 유효한 문자열로 처리하지만, Tibero에서는 '' (빈 문자열)을 NULL로 처리합니다.
따라서 NOT NULL 제약 조건이 있는 컬럼의 '' (빈 문자열) 을 Tibero로 이관할 경우, Tibero에서는 NOT NULL 제약 조건 위반 에러가 발생할 수 있습니다.
해결
'' (빈 문자열, Empty String) 처리 방식에 대한 협의가 아래와 같이 필요합니다.
1) NULL 처리 : INSERT_ZERO_LENGTH_STRING_AS_NULL=Y 사용, NOT NULL 제약 조건 삭제
2) ' ' (공백) 처리 : INSERT_ZERO_LENGTH_STRING_AS_NULL=N 사용
예시 적용
NOT NULL 컬럼에 ''(빈 문자열) 데이터 입력을 아래와 같이 진행합니다.
•
mysql
mysql> CREATE TABLE empty_table (C1 VARCHAR(10) DEFAULT '' NOT NULL);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into empty_table values (''), ('a');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from empty_table;
+----+
| C1 |
+----+
| |
| a |
+----+
2 rows in set (0.00 sec)
SQL
복사
•
tibero
SQL> CREATE TABLE empty_table (C1 VARCHAR(10) DEFAULT '' NOT NULL);
Table 'EMPTY_TABLE' created.
SQL> insert into empty_table values (''), ('a');
TBR-10005: NOT NULL constraint violation ('WORLD'.'EMPTY_TABLE'.'C1').
SQL
복사
INSERT_ZERO_LENGTH_STRING_AS_NULL설정에 따른 이관 결과는 다음과 같습니다.
SQL> CREATE TABLE empty_table (C1 VARCHAR(10));
Table 'EMPTY_TABLE' created.
INSERT_ZERO_LENGTH_STRING_AS_NULL=Y
SQL> select c1, length(c1) from empty_table;
C1 LENGTH(C1)
a 1
2 rows selected.
INSERT_ZERO_LENGTH_STRING_AS_NULL=N
SQL> select c1, length(c1) from empty_table;
C1 LENGTH(C1)
1
a 1
2 rows selected.
SQL
복사
참고
RDBMS 별 NULL 저장 방식
INSERT VALUES TIBERO ORACLE MySQL MariaDB SQL Server PostgreSQL CUBRID
------------- -------- -------- ------- --------- ----------- ----------- -------------
NULL NULL NULL NULL NULL NULL NULL NULL
'NULL' 문자열 문자열 문자열 문자열 문자열 문자열 문자열
' '(공백) 문자열 문자열 문자열 문자열 문자열 문자열 문자열
''(빈 문자열) NULL NULL 문자열 문자열 문자열 문자열 문자열
SQL
복사