【发布时间】:2019-07-14 02:04:47
【问题描述】:
我正在使用 SQL Server 2017 进行一些测试。
我正在尝试将任意 Unicode 代码点存储在 NVARCHAR 列中。
我尝试了不同的排序规则。
我对 Unicode 的 BMP 平面中的常用字符没有问题。
对于更多奇特的符号,例如,如果我尝试存储“????”字符(U+1D33),会发生以下情况:
- 如果我在 Management Studio 中执行此操作,我只会看到臭名昭著的方形符号。但 Management Studio 具有正确的字体,因为我可以将其粘贴到查询编辑器中。
- 如果我从 Visual Studio 发送文本,我在 Management Studio 中看到的值是“??”,这也是我在执行查询后从 Visual Studio 检索到的值。
我的理解是,对于非补充字符排序规则,UCS-2 子集之外的字符不应被正确解释,因为NCHAR 字段被限制为 2 个字节。
但是,我在数据库级别和列级别都尝试了Latin1_General_100_CS_AS_KS_WS_SC,但它似乎也不起作用。
有什么想法吗? 谢谢
【问题讨论】:
-
SQL Server 2017 使用 UTF16,而不是 UCS2。您是如何尝试插入和检索文本的?你是如何确定有问题的?除非您更改
Console.Output.Encoding设置,否则控制台窗口不会显示 UTF8 文本。 Visual Studio 的输出控制台也有类似的问题。您看到 two?表示该单个字符的事实意味着 UTF16 序列已存储但在显示期间无法转换 -
BTW SO 本身是一个 ASP.NET 应用程序,将其数据存储在 SQL Server 数据库中。可以看到
????,说明角色本身没有问题 -
SSMS 的 grid 可能也无法显示所有字符,无论字体如何。这并不意味着有问题。当我在 SSMS 中尝试这个
create table #tc(name nvarchar(20)); insert into #tc values (N'????'); select name,len(name),DATALENGTH(name) from #tc;时,我得到了???? 2 4。等待!我看到了一个正方形!但是,当我在评论中复制该方块时,出现了正确的字形
标签: sql-server tsql unicode ssms collation