MS SQL Server는 다른 RDBMS에 비해 UTF-8을 제대로 지원하지 않기 때문입니다.
MS SQL Server는 Windows 자체에서 사용되는 "좁은"문자열 ( char
C ++ CHAR
또는 VARCHAR
SQL)이 레거시 "코드 페이지" 로 인코딩 되는 규칙을 따릅니다 . 코드 페이지의 문제점은 문자 수가 제한되어 있으며 (대부분은 1 바이트 인코딩으로 보고서를 256 자로 제한 함) 단일 언어 (또는 비슷한 알파벳을 가진 언어 그룹)를 중심으로 설계되었다는 것입니다. 이로 인해 다국어 데이터를 저장하기가 어렵습니다. 예를 들어 러시아어는 코드 페이지 1251 을 사용하고 히브리어는 코드 페이지 1255를 사용 하므로 러시아어 및 히브리어 데이터를 모두 저장할 수 없습니다 .
유니 코드 는 세계의 모든 언어를 표현할 수있을만큼 백만 개 이상의 문자를 수용 할 수있는 공간이있는 하나의 거대한 코드화 된 문자 세트를 사용하여이 문제를 해결합니다. 몇 가지 유니 코드 인코딩 체계가 있습니다. 마이크로 소프트는 사용하는 것을 선호 UTF-16 에 대한 역사적인 이유 . UTF-16은 기존의 8 비트 대신 16 비트 코드 단위 시퀀스로 문자열을 나타내므로 별도의 문자 유형이 필요합니다. MSVC ++에서 이것은입니다 wchar_t
. 그리고 MS SQL에서는 NCHAR
또는 NVARCHAR
입니다. 은 N
"국가"의 약자 유니 코드에 대해 때문에 나에게 뒤로 보이는, 간 -nationalization하지만은 ISO 용어입니다.
다른 SQL 구현에서는 UTF-8 텍스트를 VARCHAR
열에 저장할 수 있습니다 . UTF-8은 가변 길이 (문자 당 1-4 바이트) 인코딩으로 데이터가 대부분 기본 라틴 범위 (ASCII와 문자 당 1 바이트로 표시됨) 인 경우에 최적화되어 있지만 모든 유니 코드 문자 따라서 bwalk2895에서 언급 한 "두 배의 공간"문제를 피할 수 있습니다.
불행히도 MS SQL Server 는 UTF-8을 지원하지 않으므로VARCHAR
대신 UTF-16을 사용하고 (ASCII 텍스트를위한 공간을 낭비) 유니 코드가 아닌 코드 페이지를 사용하고 외래 문자를 표현할 수있는 능력을 상실해야합니다. 또는 UTF-8을 BINARY
열에 저장하십시오 (SQL 문자열 함수가 제대로 작동하지 않거나 GUI DB 관리자에서 데이터를 16 진 덤프로보아야하는 것과 같은 불편을 처리 함 ).