SQL Server 데이터베이스에서 UTF-8 데이터 정렬을 사용하는 방법은 무엇입니까?
UTF8을 사용하여 mysql에서 SQL Server (정치), 원래 mysql 데이터베이스로 데이터베이스를 마이그레이션했습니다.
이제 SQL Server 2008에서 utf8을 지원하지 않는다는 https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collation-charset 을 읽었습니다 . 농담입니까?
SQL Server는 대부분 라틴으로 인코딩 된 여러 데이터베이스를 호스팅합니다. 마이그레이션 된 db는 웹 게시 용이므로 utf8 인코딩을 유지하고 싶습니다. 내가 놓친 것이 있거나 애플리케이션 수준에서 enc / dec가 필요합니까?
아니! 농담이 아닙니다.
여기를보십시오 : http://msdn.microsoft.com/en-us/library/ms186939.aspx
고정 길이, nchar 또는 가변 길이, nvarchar, 유니 코드 데이터이고 UNICODE UCS-2 문자 집합을 사용하는 문자 데이터 형식입니다.
또한 여기 : http://en.wikipedia.org/wiki/UTF-16
이전 UCS-2 (2 바이트 범용 문자 집합)는 1996 년 7 월 유니 코드 표준 버전 2.0에서 UTF-16으로 대체 된 유사한 문자 인코딩입니다.
UTF-8은 문자 집합이 아니라 인코딩입니다. UTF-8의 문자 집합은 유니 코드입니다. 유니 코드 텍스트를 저장하려면 nvarchar
데이터 유형 을 사용합니다 .
데이터베이스가 UTF-8을 사용하여 텍스트를 저장하는 경우에도 텍스트를 인코딩 된 UTF-8 데이터로 가져 오지 않고 디코딩 된 텍스트로 가져옵니다.
UTF-8로 인코딩 된 텍스트를 데이터베이스에 쉽게 저장할 수 있지만 텍스트로 저장하지 않고 바이너리 데이터 ( varbinary
) 로 저장합니다 .
이것이 SQL Server 2019에서 마침내 지원 될 것 같습니다! SQL Server 2019-새로운 기능
BOL에서 :
UTF-8 지원
가져 오기 또는 내보내기 인코딩으로 널리 사용되는 UTF-8 문자 인코딩 또는 텍스트 데이터에 대한 데이터베이스 수준 또는 열 수준 데이터 정렬을 완벽하게 지원합니다. UTF-8은
CHAR
및VARCHAR
데이터 유형 에서 허용되며 객체의 데이터 정렬을UTF8
접미사 가있는 데이터 정렬로 만들거나 변경할 때 활성화됩니다 .예를 들어,
LATIN1_GENERAL_100_CI_AS_SC
에LATIN1_GENERAL_100_CI_AS_SC_UTF8
. UTF-8은 SQL Server 2012에 도입 된 보조 문자를 지원NCHAR
하고NVARCHAR
UTF-16 인코딩 만 허용하며 변경되지 않은 상태로 유지 되는 Windows 데이터 정렬에만 사용할 수 있습니다 .이 기능은 사용중인 문자 집합에 따라 상당한 저장 공간을 절약 할 수 있습니다. 예를 들어 ASCII 문자열이있는 기존 열 데이터 유형을 UTF-8 지원 데이터 정렬
NCHAR(10)
을CHAR(10)
사용하는 것으로 변경하면 스토리지 요구 사항이 거의 50 % 감소합니다. 이 감소는NCHAR(10)
저장에 22 바이트가CHAR(10)
필요한 반면 동일한 유니 코드 문자열에는 12 바이트가 필요 하기 때문 입니다.
2019-05-14 업데이트 :
문서는 지금 업데이트 된 것으로 보이며 " 데이터 정렬 및 유니 코드 지원 " 섹션에서 MSSQL 2019의 옵션에 대해 설명합니다 .
2019-07-24 업데이트 :
Pedro Lopes의 기사 -Azure SQL Database에 대한 UTF-8 지원 소개에 대한 Microsoft의 선임 프로그램 관리자
마이크로 소프트 SQL 서버 2016로, UTF-8에 의해 지원됩니다 bcp
, BULK_INSERT
하고 OPENROWSET
.
부록 2016-12-21 : SQL Server 2016 SP1은 이제 Standard 및 Express를 포함한 모든 버전의 MS SQL에 대해 유니 코드 압축 (및 이전의 대부분의 다른 엔터프라이즈 전용 기능)을 활성화합니다. 이것은 UTF-8 지원과 동일하지 않지만, 목표가 서양 알파벳의 디스크 공간 감소 인 경우 유사한 이점을 제공합니다.
T-SQL에서 UTF-8을 처리하는 두 개의 UDF :
CREATE Function UcsToUtf8(@src nvarchar(MAX)) returns varchar(MAX) as
begin
declare @res varchar(MAX)='', @pi char(8)='%[^'+char(0)+'-'+char(127)+']%', @i int, @j int
select @i=patindex(@pi,@src collate Latin1_General_BIN)
while @i>0
begin
select @j=unicode(substring(@src,@i,1))
if @j<0x800 select @res=@res+left(@src,@i-1)+char((@j&1984)/64+192)+char((@j&63)+128)
else select @res=@res+left(@src,@i-1)+char((@j&61440)/4096+224)+char((@j&4032)/64+128)+char((@j&63)+128)
select @src=substring(@src,@i+1,datalength(@src)-1), @i=patindex(@pi,@src collate Latin1_General_BIN)
end
select @res=@res+@src
return @res
end
CREATE Function Utf8ToUcs(@src varchar(MAX)) returns nvarchar(MAX) as
begin
declare @i int, @res nvarchar(MAX)=@src, @pi varchar(18)
select @pi='%[à-ï][€-¿][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
while @i>0 select @res=stuff(@res,@i,3,nchar(((ascii(substring(@src,@i,1))&31)*4096)+((ascii(substring(@src,@i+1,1))&63)*64)+(ascii(substring(@src,@i+2,1))&63))), @src=stuff(@src,@i,3,'.'), @i=patindex(@pi,@src collate Latin1_General_BIN)
select @pi='%[Â-ß][€-¿]%',@i=patindex(@pi,@src collate Latin1_General_BIN)
while @i>0 select @res=stuff(@res,@i,2,nchar(((ascii(substring(@src,@i,1))&31)*64)+(ascii(substring(@src,@i+1,1))&63))), @src=stuff(@src,@i,2,'.'),@i=patindex(@pi,@src collate Latin1_General_BIN)
return @res
end
실제로 SQLCLR UDF를 생성하여 UTF8 사용에 문제가 없으며 Microsoft에서 코드를 다운로드 할 수 있습니다. 이 링크를 확인하십시오 : http://technet.microsoft.com/en-us/library/ms160893(v=sql.90).aspx
https://cloudblogs.microsoft.com/sqlserver/2018/12/18/introducing-utf-8-support-in-sql-server-2019-preview/ 이제 MSSQL 2019에서 Uft-8이 지원됩니다.
참고URL : https://stackoverflow.com/questions/12512687/how-to-use-utf-8-collation-in-sql-server-database
'Development Tip' 카테고리의 다른 글
Android 치명적인 신호 11 (0) | 2020.10.27 |
---|---|
html 양식 태그의 목적은 무엇입니까 (0) | 2020.10.27 |
가져올 진행률 표시기를 업로드 하시겠습니까? (0) | 2020.10.27 |
로컬 Maven 프록시 저장소 (Nexus)를 사용하기 위해 sbt를 얻으려면 어떻게해야합니까? (0) | 2020.10.27 |
HttpRequest를 HttpRequestBase 개체로 어떻게 변환합니까? (0) | 2020.10.26 |