91

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

现在我读到https://dba.stackexchange.com/questions/7346/sql-server-2005-2008-utf-8-collat ​​ion-charset 说 SQL Server 2008 不支持 utf8,这是在开玩笑吗?

SQL Server 托管多个数据库,大部分是拉丁编码的。由于迁移的数据库是用于网络发布的,所以我想保留 utf8 编码。我错过了什么还是需要在应用程序级别进行编码/解码?

4

5 回答 5

36

UTF-8 不是字符集,它是一种编码。UTF-8 的字符集是 Unicode。如果要存储 Unicode 文本,请使用nvarchar数据类型。

如果数据库使用 UTF-8 存储文本,您仍然不会将文本作为编码的 UTF-8 数据取出,而是将其作为解码的文本取出。

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

于 2015-08-20T21:23:27.697 回答
27

不!这可不是说笑。

看看这里: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 字节通用字符集)是一种类似的字符编码,在 1996 年 7 月的 Unicode 标准 2.0 版中被 UTF-16 取代。

于 2012-09-20T13:45:14.647 回答
27

看起来这最终会在 SQL Server 2019 中得到支持! SQL Server 2019 - 有什么新功能?

来自 BOL:

UTF-8 支持

完全支持广泛使用的 UTF-8 字符编码作为导入或导出编码,或作为文本数据的数据库级或列级排序规则。CHAR和数据类型中允许使用 UTF-8 VARCHAR,并且在创建对象的排序规则或将其更改为带有UTF8后缀的排序规则时启用。

例如,LATIN1_GENERAL_100_CI_AS_SCLATIN1_GENERAL_100_CI_AS_SC_UTF8。UTF-8 仅适用于支持补充字符的 Windows 排序规则,如 SQL Server 2012 中引入的那样。NCHAR并且NVARCHAR仅允许 UTF-16 编码,并且保持不变。

此功能可能会显着节省存储空间,具体取决于使用的字符集。例如,将具有 ASCII 字符串的现有列数据类型从启用 UTF-8 的排序规则更改NCHAR(10)CHAR(10)使用启用了 UTF-8 的排序规则,这意味着存储需求减少了近 50%。这种减少是因为NCHAR(10)需要 22 个字节来存储,而CHAR(10)相同的 Unicode 字符串需要 12 个字节。

2019-05-14 更新:

文档现在似乎已更新,并在“排序规则和 Unicode 支持”部分解释了我们在 MSSQL 2019 中的选项。

2019-07-24 更新:

Pedro Lopes 的文章- Microsoft 高级项目经理关于为 Azure SQL 数据库引入 UTF-8 支持的文章

于 2018-09-24T13:26:00.770 回答
7

在 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
于 2018-11-24T14:33:06.760 回答
4

请注意,从 Microsoft SQL Server 2016 开始,UTF-8 受bcpBULK_INSERT和支持OPENROWSET

附录 2016-12-21:SQL Server 2016 SP1 现在为所有版本的 MS SQL (包括 Standard 和 Express)启用 Unicode 压缩(以及大多数其他以前仅限企业的功能)。这与 UTF-8 支持不同,但如果目标是减少西方字母的磁盘空间,它会产生类似的好处。

于 2016-07-19T21:57:32.013 回答