如何使用UTF-8排序规则SQL Server数据库?(How to Use UTF-8 Colla

2019-06-18 05:24发布

我已经使用UTF8迁移从MySQL到SQL Server数据库(政治),原来的MySQL数据库。

现在我读https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collat​​ion-charset的SQL Server 2008不支持UTF8,这是一个笑话?

在SQL Server托管多个数据库,主要是拉丁美洲编码。 由于迁移DB是用于网络发布,我想保持UTF8编码的。 我错过了什么或者我需要ENC / DEC在应用程序级?

Answer 1:

没有! 这可不是说笑。

看看这里: http://msdn.microsoft.com/en-us/library/ms186939.aspx

,它们或者固定长度的字符数据类型,nchar或可变长度,为nvarchar,Unicode数据并使用UNICODE UCS-2字符集。

和这里: http://en.wikipedia.org/wiki/UTF-16

旧的UCS-2(2字节通用字符集)是一个由UTF-16在Unicode标准的版本2.0在1996年7月取代了类似的字符编码。



Answer 2:

UTF-8是不是一个字符集,它是一个编码。 为UTF-8字符集是Unicode。 如果你想存储Unicode文本使用nvarchar数据类型。

如果数据库将使用UTF-8来存储文本,你仍然不会得到文本出来为UTF-8编码的数据,你会得到它作为解码的文本。

您可以轻松地在数据库中存储UTF-8编码的文本,但你不把它保存为文本,将其存储为二进制数据( varbinary )。



Answer 3:

看起来这将在SQL Server 2019中最后支持! SQL服务器2019 -什么新内容?

从BOL:

UTF-8支持

为广泛使用的UTF-8字符编码作为进口或出口的编码,或作为数据库级别或列级排序规则将文本数据的完全支持。 UTF8是允许在CHARVARCHAR数据类型,以及创建或更改对象的整理与归类当启用UTF8后缀。

例如, LATIN1_GENERAL_100_CI_AS_SCLATIN1_GENERAL_100_CI_AS_SC_UTF8 。 UTF-8是仅适用于支持增补字符,如SQL Server 2012中引入的Windows排序规则NCHARNVARCHAR允许UTF-16编码只,并保持不变。

此功能可以提供显著节省存储空间,这取决于所使用的字符集。 例如,更改现有的列数据以ASCII字符串从类型NCHAR(10)CHAR(10)使用UTF-8启用整理,转换成在存储需求减少近50%。 这种降低是因为NCHAR(10)需要用于存储22个字节,而CHAR(10)要求对于相同的Unicode字符串12个字节。



Answer 4:

请注意,如Microsoft SQL Server 2016,UTF-8是由支持bcpBULK_INSERTOPENROWSET

附录2016年12月21日:SQL服务器2016 SP1现在允许Unicode压缩(和其他大多数企业以前只拥有)的MS SQL的所有版本,包括标准和快速。 这是不一样的UTF-8支持,但它产生类似的好处,如果我们的目标是磁盘西方字母空间减少。



Answer 5:

其实,有使用UTF8,通过创建SQLCLR UDF,你可以从微软下载的代码没有问题。 检查此链接: http://technet.microsoft.com/en-us/library/ms160893(v=sql.90).aspx



Answer 6:

两个UDF以应对T-SQL UTF-8:

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


文章来源: How to Use UTF-8 Collation in SQL Server database?