MSSQL 에서 공백으로 끝나는 값 저장시 PRIMARY KEY 중복오류가 ?
MSSQL SERVER 2017 DATABASE 에 관한 질문입니다.
테이블에 PRIMARY KEY 또는 UNIQUE 로 설정된 컬럼에 공백으로 끝나는 값과 공백없이 끝나는 동일한 값 2건을 입력하면 중복에러가 발생합니다.
예. CREATE TABLE TEST (
PKCOL VARCHAR(20) NOT NULL PRIMARY KEY
);
INSERT INTO TEST VALUES ('AB'); --성공
INSERT INTO TEST VALUES (' AB'); -- 성공
INSERT INTO TEST VALUES ('AB '); -- 실패
INSERT INTO TEST VALUES (' AB '); --실패
즉 ,
INDEX 없이는 공백그대로 저장이 잘 되는데,
UNIQUE INDEX 를 만든상태에선,
오른쪽 공백을 자동으로 잘라내면서 인덱스 데이터를 구성하는 문제로 중복오류가 발생하는 현상인것 같습니다.
공백(BLANK)은 문자인데 왜 강제로 잘라(RIGHT TRIM)내서 인덱를 구성하는지 이해 할 수 없네요.
오라클에선 정상적으로 처리되는데.
이를 해결할 수 있는 방법을 질문합니다.
감사합니다.
https://stackoverflow.com/questions/9460671/behavior-of-unique-index-varchar-column-and-blank-spaces를 참고했습니다.
MSSQL은 길이가 다른 두 문자열을 비교할 때 길이를 맞추기 위해 뒤에 공백 문자들을 붙이기도 하는데
그래서 어떤 문자열을 그 위에 공백이 붙은 문자열과 비교하면... 그 두 문자열이 같은 게 됩니다!공백으로 끝날 수 있는 것(공백으로 끝나는 게 정상인 것)을 UNIQUE로 해 본 적이 없어서
비슷하게라도 해 본 것도 아니고, 또 이게 좋은 방법이라고 생각하는 건 아니지만값을 넣을 때는 맨 뒤에 #같은 걸 붙여서 넣고, 조회할 때 마지막의 #를 빼 버리면
뒤에 공백이 붙은 다른 문자열을 같은 문자열로 보는 문제를 우회할 수 있습니다.성능이나 DB 관리상 안좋긴 합니다만
그럼 그냥 유니크 인덱스 조건을 빼버리면됩니다.
말씀하시는걸 들어보니 이미 오라클에 있는 데이터를 interface하여 mssql에 저장하여 분석하는것이 주내용인것같습니다.
그럼 특이한 경우가 아니면 원 데이터는 어차피 오라클에서 계속 받아와서 사용할수있을거고
결국에 오라클에서 받아온 프라이머리 키와 mysql에 PK 칼럼 값만 똑같으면 언제든지 다시 동기화 및 분석할수있다고 보여집니다.
그럼 그냥 PK 칼럼을 다른 제약조건없이 사용하시면 될것같은데 어떠신지요??