在SQL表中存储Emojis

时间:2016-12-19 21:56:03

标签: sql-server unicode emoji nvarchar

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

1 个答案:

答案 0 :(得分:0)

我们所知道的是基于问题的详细信息和对该问题的评论

  1. 列为NVARCHAR
  2. 通过存储过程从VB.NET应用程序插入值
  3. 在SQL Server 2008上运行的应用程序(在Windows 2008 Server上运行)存储表情符号字符,但“将其转换为外观怪异的框”
  4. 击中SQL Server 2012的相同应用代码可以很好地存储相同的表情符号字符

我们不知道的地方:

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

  • 您是在应用程序中还是在SSMS中查看它?
  • 如果在SSMS中,您是否使用在相同计算机上运行的相同 SSMS连接到SQL Server 2008 2012?还是使用的是每个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 Face    World Map    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年前)。