Python에서 검색된 SQL Server VARCHAR 열의 인코딩 문제


10

최근 SQL Server에서 varchar (120)로 저장되는 필드와 관련된 인코딩 문제가있었습니다. SSMS에서 varchar는 다음과 같이 나타납니다.

"누가 JonBen을 죽였습니까?"

그러나 파이썬으로 가져 오면 다음과 같이 나타납니다.

여기에 이미지 설명을 입력하십시오

나는 이것을 파이썬 측에서 연구했으며 이상한 일이 일어나지 않습니다. 내 이론은 SQL Server의 varchar가 SSMS와 다르게 파이썬으로 표시되는 UTF-8 문자를 허용한다는 것입니다. SQL Server의 인코딩에 익숙하지 않습니다. 누군가 다음을 알려주십시오.

  • SSMS에서 varchar의 인코딩을 보는 방법이 있습니까? 예를 들어 현재 SSMS에서 쉼표를 표시하는 대신 \ x82를 참조하십시오.
  • SQL Server 2008을 사용하고 있습니다. 가져 오기 / 내보내기 도구를 사용하거나 플랫 파일로 덤프하지 않고 UTF-8 문자의 인코딩을 ASCII 문자로 변경하는 방법이 있습니까? 즉, 쿼리를 통해이 변환을 수행 할 수 있습니까?
  • 쿼리를 통해 문제가있는 레코드를 프로그래밍 방식으로 식별 할 수있는 방법이 있습니까 (ASCII를 통해 지원되지 않는 UTF-8 문자로 정의되는 문제)?

미리 감사드립니다!

사용 sp_help N'table_name';나는이의 정렬 발견 VARCHAR열은 다음과 같습니다 SQL_Latin1_General_CP1_CI_AS.


해당 VARCHAR열 은 어떤 데이터 정렬을 사용합니까?
Solomon Rutzky

@SolomonRutzky 데이터 정렬을 어떻게 확인합니까? 그게 무슨 뜻인지 잘 모르겠습니다
Eric

내가 생각하는 가장 빠른 방법은 다음과 같습니다 sp_help N'table_name';. "name"을 기준으로 열을 확인한 다음 "collation_name"열을 확인하십시오.
Solomon Rutzky

@SolomonRutzky 해당 필드에 대한 데이터 정렬은 'SQL_Latin1_General_CP1_CI_AS 데이터'입니다
에릭

답변:


17

SQL Server는 어떤 상황에서도 UTF-8을 저장하지 않습니다. 을 통해 NVARCHAR( NCHAR및 포함 NTEXT하지만 사용하지는 않음 )을 통해 UTF-16 Little Endian (LE) NTEXTXML코드 페이지를 기반으로 VARCHAR( CHAR및 포함 TEXT하지만 사용하지는 않음 TEXT) 8 비트 인코딩을 얻 습니다. .

여기서 문제는 코드가 UTF-8이라고 생각하면서 0x82 문자를 잘못 번역하고 있지만 그렇지 않다는 것입니다. 값이 0x82 인 UTF-8 "문자"는 없으므로 "알 수 없음"/ 대체 기호 " "가 표시됩니다. 1 바이트 0x82의 문자가 없음을 보여주는 다음 UTF-8 테이블을 참조하십시오.

UTF-8 인코딩 테이블

OP에 명시된 바와 같이, 해당 열의 데이터 정렬은입니다. SQL_Latin1_General_CP1_CI_AS즉, 8 비트 인코딩은 Windows Latin 1 (ANSI) 인 코드 페이지 1252를 사용하고 있습니다. 그리고 해당 차트를 확인하면 (문자 이름이 있으므로 맨 아래 차트까지 아래로 스크롤) 값 0x82 ( "코드 포인트"열에서 "82"찾기)는 실제로 SSMS에 표시 되는 단일 낮은 따옴표 입니다. UTF-8의 해당 문자는 3 바이트 시퀀스 E2 80 9A입니다.

이 수단의 모든 의미 : 코드 페이지 1252에 SQL Server 연결을위한 클라이언트 인코딩 중 하나 세트 파이썬 코드를 요구하거나 / 변경해야 반환 된 문자열의 인코딩을 변환 에서 코드 페이지 1252 UTF-8.

물론 이것이 웹 페이지에 표시되는 경우 선언 된 페이지의 문자 집합을로 변경할 Windows-1252 있지만 UTF-8 문자가 이미있는 경우 페이지의 다른 문자를 방해 할 수 있습니다.


솔로몬, 감사합니다. 잘못된 번역에 대해 알려주십시오. 이것은 꽤 까다로운 문제이며 어디서부터 시작 해야할지 모르겠습니다.
Eric

와우, 놀라운 세부 사항, @ 솔로몬! 나는 다른 Python + MS SQL 문제를 찾고 여기에 왔지만 너무 많이 배우기 때문에 계속 읽었습니다. :-P
Mike Williamson

1
@MikeWilliamson 칭찬을 공유해 주셔서 감사합니다 :). 또한 C # .NET md5와 다른 TSQL md5 해시 (SO), 히브리어 악센트 표시를 제거하는 방법 (여기서는 DBA.SE) 및 Collations.Info에 관심이있을 수 있습니다. 즐겨!
Solomon Rutzky

감사! 라틴어 이외의 언어를 사용하는 사람 은 미국 / 영국에서 행복하게 일하는 사람보다이 내용을 훨씬 잘 알고 있다고 생각 합니다. :)
Mike Williamson

1
참고 사항 : MS SQL Server 2019는 VARCHAR / CHAR 데이터 유형에서 UTF-8을 기본적으로 지원합니다.
그레고리 아 레니 우스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.