我正在 Windows 2008 Server 上使用 SQL Server 2008 数据库。每当我尝试在表格中存储表情符号时,它都会将其转换为一个看起来很奇怪的盒子。当我尝试在 SQL Server 2012 中存储相同的表情符号时,它可以很好地存储表情符号。 SQL Server 2008 中是否无法正确存储表情符号?我现在确实无法更新,所以这不是一个选择。
最佳答案
根据问题的详细信息和对问题的评论我们所知道的:
- 列是
NVARCHAR
- 值是通过存储过程从 VB.NET 应用插入的
- 应用程序访问 SQL Server 2008(在 Windows 2008 Server 上运行)会存储表情符号字符,但“将其转换为看起来很奇怪的框”
- 相同的应用代码命中 SQL Server 2012 可以存储相同的表情符号字符
我们不知道的事情:
如何检索字符以确定其存储是否正确?
- 您是在应用程序还是 SSMS 中查看它?
- 如果在 SSMS 中,您是否使用在相同计算机上运行的相同 SSMS 连接到 SQL Server 2008和2012?或者您是否使用每个版本的 SQL Server 附带的 SSMS 版本(因此它们不是同一个程序,即使在同一台计算机上)?
基于上述:
这很可能是字体问题。我这么说是因为:
- 如果是不支持 Unicode 的问题,那么您会看到两个问号
??
(每个代理字符一个),而不是一个方框。 - 表情符号没什么特别的。它们只是补充字符。目前(截至 Unicode v 12.0)定义了 72,457 个补充字符(以及另外 976,119 个的插槽)。
- 补充字符(表情符号或其他字符)可以毫无问题地存储在
NCHAR
、NVARCHAR
和NTEXT
列中,且无需考虑列或当前数据库的排序规则。
为了测试这一点,我在默认排序规则为 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/