현상
다음 파일의 줄 끝에 일관성이 없습니다. 줄 끝을 정규화시키시겠습니까?
이런 대화창은 왜 나오는걸까?
원인
데이터에 줄바꿈(Enter)이 있고, 데이터를 넣고 추출하는 OS 가 다른경우에 발생하게 됩니다.
타 OS 에서 데이터를 넣고 추출하는 경우에 왜 이런 오류가 나올까요?
먼저 OS 마다 Enter 값을 저장하는 내부 값은 다릅니다.
운영체제 | 값 | 헥사 |
Windows | CR LF (rn) | 0x0D 0x0A |
Mac | CR (r) | 0x0D |
Unix | LF (n) | 0x0A |
하나의 예를 보겠습니다.
리눅스 환경에서 Enter 값이 들어간 데이터를 한건 적재했습니다.
그렇게 되면 SQL Server 내부에는 0x0A 라는 값 하나만 저장되게 됩니다.
이 값을 Windows 환경에서 추출해서 확인하려고 하면, 0x0D 0x0A 값이 Enter 이기 때문에
정규화 시키겠냐는 메시지가 나오게 되는 것 입니다.
(매우중요) 이런 경우에 정규화를 하게 되면 어떻게 될까?
정규화를 하는 경우 데이터가 변경되는 경우가 있는지 확인해 보겠습니다.
리눅스 환경에서 데이터 적재
먼저 리눅스 환경에서 동일한 테이블의 스키마를 생성하고 데이터 한건을 적재해 줍니다.
이 때 줄의 마지막 부분에는 스페이스가 없이 바로 엔터로 들어가집니다.
SQL Server 에는 0x0A 라는 값만 저장이 되었습니다.
1
2
3
4
5
6
|
CREATE TABLE T1 (C1 VARCHAR(100))
CREATE TABLE T2 (C1 VARCHAR(100))
INSERT INTO T1 (C1) VALUES ('이 테스트는
Enter 가 들어갔을 때 정규화를 하면
데이터가 정확한가를 확인합니다.')
|
cs |
윈도우 환경에서 데이터 추출
Windows 환경에서 SSMS 에서 제공하는 "스크립트 생성" 기능을 이용하여 데이터를 추출합니다.
정규화를 하겠냐는 알람에 "예" 를 선택하였고 내부적으로 0x0D 0x0A 로 값을 변경하게 되었습니다.
이 값을 T2 테이블로 그대로 적재해봅니다.
1
2
3
4
5
6
|
USE [TEST]
GO
INSERT [dbo].[T1] ([C1]) VALUES (N'이 테스트는
Enter 가 들어갔을 때 정규화를 하면
데이터가 정확한가를 확인합니다.')
GO
|
cs |
테이블 2개의 데이터를 비교합니다.
0x0A 에서 0x0D 0x0A 로 변경되었기 때문에, 데이터가 달라지게 되는 것을 확인할 수 있습니다.
1
2
3
4
5
|
SELECT * FROM T1
SELECT * FROM T2
SELECT LEN(C1) FROM T1
SELECT LEN(C1) FROM T2
|
cs |
결론
정규화를 하는경우 데이터가 달라질 수 있습니다.
정규화의 선택은 SQL Server 혹은 API Server 의 OS 가 변경되는지를 확인하면서 진행해야 합니다.
정규화를 비활성화 하는 기능도 SSMS 에서 제공하고 있습니다.
1. 도구 -> 옵션으로 들어갑니다.
2. 환경 -> 문서로 들어갑니다.
3. "로드할 때 줄 끝 일관성 검사" 를 체크해제 합니다.
'SQL Server > SQL Server 기타' 카테고리의 다른 글
[MSSQL] 테이블을 인메모리(in-memory)로 사용하는 방법 (0) | 2021.04.14 |
---|---|
[MSSQL] SQL Server Profiler 의 결과를 테이블로 적재하는 방법 (0) | 2021.03.09 |
[MSSQL] TOP 절과 ROWCOUNT 의 차이 (0) | 2020.11.30 |
[MSSQL] Lock Wait, Lock Timeout 과 Average Wait Time 의 상관관계 (0) | 2020.10.11 |
[MSSQL] OPENROWSET 환경에서 sp_MSForEachDB 를 사용하는 방법 (0) | 2020.09.02 |