【问题标题】:Inserting UTF-32 characters插入 UTF-32 字符
【发布时间】:2014-08-12 08:04:13
【问题描述】:

我正在使用 SQL Server (2008 R2, 10.5) 测试 UTF-32 字符(特别是表情符号),在这个阶段我正在检查服务器是否支持给定的代码

对于这种情况,我将:rose 与以下查询一起使用

SELECT '' + nchar(0x1F339) + 'test'

在 Management Studio 中返回 (NULL)

我需要什么格式对字符进行编码以使其在 SQL Server 中不返回 null

【问题讨论】:

    标签: sql sql-server encoding utf emoji


    【解决方案1】:

    SQL Server 仅支持 UCS-2,目前(几乎)与 UTF-16 相同。所以每个字符正好 2 个字节等等。

    【讨论】:

    • 投反对票,因为目前 SqlServer 确实支持 SC-collat​​ions,这个答案已经过时了。
    • 即使写出来也已经过时了; UTF-16 表情符号使用 4 个字节,而不是 2 个。?
    【解决方案2】:

    一个想法,如果可以的话。您可以将数据存储在不关心编码的 BINARY 或 VARBINARY 数据字段中。然后,您可以使用映射表或外部脚本将二进制文件解析为文本字段,将 0x1F339 替换为 :rose: 或您自己的自定义格式。

    【讨论】:

      【解决方案3】:

      由于是UTF-32,所以有两个写成两个UTF-16字符:

      -- Returns: ?test
      SELECT '' + nchar(0xD83C) + nchar(0xDF39) + 'test'
      

      您可以在“UTF-16 Hex (C Syntax)”标题下找到此代码,点击您的链接。

      另外我也不得不推荐这篇文章,因为对调查很有帮助:Unicode Escape Sequences Across Various Languages and Platforms (including Supplementary Characters)

      为那些正在寻找答案的人提供几个选项:

      SQL Server 在技术上没有字符转义序列,但是 您仍然可以使用字节序列或代码创建字符 点使用 CHAR() 和 NCHAR() 函数。我们只关心 这里使用 Unicode,所以我们将只使用 NCHAR()。

      所有版本:

      BMP 代码点的 NCHAR(0 - 65535)(使用整数/十进制值)

      BMP 代码点的 NCHAR(0x0 - 0xFFFF)(使用二进制/十六进制值)

      NCHAR(0 - 65535) + NCHAR(0 - 65535) 用于代理对/两个 UTF-16 代码单元

      NCHAR(0x0 - 0xFFFF) + NCHAR(0x0 - 0xFFFF) 代表一对/两个 UTF-16 代码单元

      CONVERT(NVARCHAR(size), 0xHHHH) 用于 UTF-16 中的一个或多个字符 Little Endian(“HHHH”是一组或多组 4 个十六进制数字)

      从 SQL Server 2012 开始:

      如果数据库的默认排序规则支持补充字符 (排序规则名称以 _SC 结尾,或以 SQL Server 2017 名称开头 包含 140 但不以 _BIN* 结尾,或以 SQL Server 开头 2019名称以_UTF8结尾但不包含_BIN2),则NCHAR()可以 获得补充字符代码点:

      十进制值最高可达 1114111

      十六进制值最高可达 0x10FFFF

      从 SQL Server 2019 开始:

      “_UTF8”排序规则允许 CHAR 和 VARCHAR 数据使用 UTF-8 编码:

      CONVERT(VARCHAR(size), 0xHH) 用于 UTF-8 中的一个或多个字符(“HH” 是 1 组或多组 2 个十六进制数字)

      注意:CHAR() 函数不适用于此目的。它只能 产生单个字节,而 UTF-8 仅是值 0 的单个字节 – 127 / 0x00 – 0x7F。

      【讨论】:

      • 首先,你的答案来得太晚了 6 年。其次,问题中所述的 SQL Server 版本(2008 R2)不支持 SC 感知排序规则,它们仅在 2012 年出现。它也不支持任何容量的 UTF-8。当然,您可以将 UTF-32 字符拆分为 2 个 UTF-16 字符(可能?)并将它们按原样存储,但在任何不支持 SC 的客户端应用程序中,它们看起来像象形文字或类似文字。你真的尝试过你对 2008 R2 的建议吗?
      • @RogerWolf 您是否建议为每个提出问题的软件版本复制整个 stackoverflow?这个问题是“sqlserver utf-32”的第一个谷歌结果,我至少需要这个答案。
      • 在这种情况下,人们通常会在答案的开头添加注释,例如“对于希望使用当前版本解决此问题的任何人......”,或类似的内容。并且绝对不是对在撰写本文时正确的问题的所有其他答案投反对票的理由(当然,如果这是您的投反对票)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      • 2016-05-21
      • 2013-05-05
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多