아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
고상한레오파드73
고상한레오파드7319.07.27

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)내서 인덱를 구성하는지 이해 할 수 없네요.

오라클에선 정상적으로 처리되는데.

이를 해결할 수 있는 방법을 질문합니다.

감사합니다.

55글자 더 채워주세요.
답변의 개수
2개의 답변이 있어요!
  • https://stackoverflow.com/questions/9460671/behavior-of-unique-index-varchar-column-and-blank-spaces를 참고했습니다.

    MSSQL은 길이가 다른 두 문자열을 비교할 때 길이를 맞추기 위해 뒤에 공백 문자들을 붙이기도 하는데
    그래서 어떤 문자열을 그 위에 공백이 붙은 문자열과 비교하면... 그 두 문자열이 같은 게 됩니다!

    공백으로 끝날 수 있는 것(공백으로 끝나는 게 정상인 것)을 UNIQUE로 해 본 적이 없어서
    비슷하게라도 해 본 것도 아니고, 또 이게 좋은 방법이라고 생각하는 건 아니지만


    값을 넣을 때는 맨 뒤에 #같은 걸 붙여서 넣고, 조회할 때 마지막의 #를 빼 버리면
    뒤에 공백이 붙은 다른 문자열을 같은 문자열로 보는 문제를 우회할 수 있습니다.


  • 성능이나 DB 관리상 안좋긴 합니다만

    그럼 그냥 유니크 인덱스 조건을 빼버리면됩니다.

    말씀하시는걸 들어보니 이미 오라클에 있는 데이터를 interface하여 mssql에 저장하여 분석하는것이 주내용인것같습니다.

    그럼 특이한 경우가 아니면 원 데이터는 어차피 오라클에서 계속 받아와서 사용할수있을거고

    결국에 오라클에서 받아온 프라이머리 키와 mysql에 PK 칼럼 값만 똑같으면 언제든지 다시 동기화 및 분석할수있다고 보여집니다.

    그럼 그냥 PK 칼럼을 다른 제약조건없이 사용하시면 될것같은데 어떠신지요??