sql-server - 在 SQL 表中存储表情符号

标签 sql-server unicode emoji nvarchar

我正在 Windows 2008 Server 上使用 SQL Server 2008 数据库。每当我尝试在表格中存储表情符号时,它都会将其转换为一个看起来很奇怪的盒子。当我尝试在 SQL Server 2012 中存储相同的表情符号时,它可以很好地存储表情符号。 SQL Server 2008 中是否无法正确存储表情符号?我现在确实无法更新,所以这不是一个选择。

最佳答案

根据问题的详细信息和对问题的评论我们所知道的:

  1. 列是 NVARCHAR
  2. 值是通过存储过程从 VB.NET 应用插入的
  3. 应用程序访问 SQL Server 2008(在 Windows 2008 Server 上运行)会存储表情符号字符,但“将其转换为看起来很奇怪的框”
  4. 相同的应用代码命中 SQL Server 2012 可以存储相同的表情符号字符

我们不知道的事情:

如何检索字符以确定其存储是否正确?

  • 您是在应用程序还是 SSMS 中查看它?
  • 如果在 SSMS 中,您是否使用在相同计算机上运行的相同 SSMS 连接到 SQL Server 20082012?或者您是否使用每个版本的 SQL Server 附带的 SSMS 版本(因此它们不是同一个程序,即使在同一台计算机上)?

基于上述:

很可能是字体问题。我这么说是因为:

  1. 如果是不支持 Unicode 的问题,那么您会看到两个问号 ??(每个代理字符一个),而不是一个方框。
  2. 表情符号没什么特别的。它们只是补充字符。目前(截至 Unicode v 12.0)定义了 72,457 个补充字符(以及另外 976,119 个的插槽)。
  3. 补充字符(表情符号或其他字符)可以毫无问题地存储在 NCHARNVARCHARNTEXT 列中,且无需考虑列或当前数据库的排序规则。

为了测试这一点,我在默认排序规则为 SQL_Latin1_General_CP1_CI_AS 的数据库中执行了以下命令,因此那里肯定没有“补充字符支持”。

SELECT NCHAR(0xD83D) + NCHAR(0xDE31) AS [ScreamingFace],
       NCHAR(0xD83D) + NCHAR(0xDDFA) AS [WorldMap],
       NCHAR(0xD83D) + NCHAR(0xDF08) AS [Alchemical Symbol for Aqua Vitae];

它返回:

ScreamingFace    WorldMap    Alchemical Symbol for Aqua Vitae
😱              🗺          🜈

我在不同的区域看到不同的东西,这都是由于字体的差异。下图显示了我所看到的内容:

LOCATION        FONT            Screaming     World     Alchemical Symbol
                                Face          Map       for Aqua Vitae
------------    ------------    ----------    ------    ----------------------------
Text Editor     Consolas        Yes           Yes       Square box w/ question mark
Grid Results    Code2003        Yes           Yes       Yes
Text Results    Courier New     Yes           Yes       Empty square box

您很可能使用两个不同版本的 SSMS,或者至少在两台不同的计算机上使用 SSMS。在任何一种情况下,您可能都会将不同的字体映射到网格结果,或者甚至在一个上使用网格结果,在另一个上使用文本结果。

最后,如果你想知道数据是否正确存储,你需要检查存储的字节。为此,只需将字符串列转换为 VARBINARY(MAX):

SELECT CONVERT(VARBINARY(MAX), string_column)
FROM schema.table;

并比较 2008 年和 2012 年系统之间的结果。他们很可能是(或者“曾经”)相同的,因为这已经是近 2.5 年前的事了。


有关 SQL Server 中的各种字符串数据类型实际可以存储哪些字符(从 SQL Server 7.0 到至少 SQL Server 2019)的更多信息,请阅读我的以下文章:

How Many Bytes Per Character in SQL Server: a Completely Complete Guide

关于sql-server - 在 SQL 表中存储表情符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231666/

相关文章:

sql - 将 LIMIT 和 OFFSET 应用于 MS SQL Server 2008 查询

php - 如何从涉及两个表的查询中获取单行。 2 外键在子表的一项中重复

sql - 根据二叉树的祖先向左或向右

ios - 在单词或字符边界处截断包含表情符号或 unicode 字符的字符串

javascript - 有些表情符号与我的仅表情符号正则表达式不匹配

sql - 解析逗号分隔的字符串以生成Where子句中的IN字符串列表

python - 发生连接错误时Python Redis中的UnicodeDecodeError

c# - 在 C# 中将转义的 unicode 更改为字符串

android - 如何在支持/渲染非英语语言的Android项目中做出贡献?

powershell - 如何使用 PowerShell 从文件名中删除表情符号?