【问题标题】:UTF-8 characters get saved as ?? on insert, but gets saved correctly on updateUTF-8 字符被保存为 ??在插入时,但在更新时正确保存
【发布时间】:2016-12-07 10:07:23
【问题描述】:

我在 MS SQLServer 上有一个带有 nVarchar 列的表。我正在使用插入语句保存 UTF-8 字符。它被保存为???。如果我通过更新语句使用相同的值更新同一列,它将被正确保存。

关于这里的问题有什么提示吗?使用的排序规则是:SQL_Latin1_General_CP1_CI_AS

【问题讨论】:

    标签: sql-server sql-server-2008 utf-8


    【解决方案1】:

    显示您的插入语句。有 - 很可能 - 缺少一个 N

    DECLARE @v NVARCHAR(100)='Some Hindi from Wikipedia मानक हिन्दी';
    SELECT @v;
    

    结果:Some Hindi from Wikipedia ???? ??????

    SET @v=N'Some Hindi from Wikipedia मानक हिन्दी';
    SELECT @v;
    

    结果:Some Hindi from Wikipedia मानक हिन्दी

    字符串文字前面的N 告诉SQL-Server 将内容解释为unicode(准确地说是ucs-2)。否则会被视为1字节编码的扩展ASCII,无法处理所有字符...

    【讨论】:

    • 感谢您的快速回复...但是对于具有类似结构和排序规则的另一个表,它可以正确插入而没有 N 前缀。我想知道这可能是什么原因。
    • @Supriya 简单的回答:不要这样做!如果您依靠系统的能力来正确阅读您的文本,它可能会工作,但下次就不行了。 . 处理NVARCHAR 应该总是使用带有N'Some string' 的文字来完成。否则就是赌博……
    • 再次感谢您的快速回答...我创建了有问题的表的精确副本,并且插入语句在那里运行良好。然后我检查了架构上的其他几个表(所有 nvarchar),它们也以一致的方式工作正常。所以我不明白这个特定表的特殊问题是什么?我明白你的观点,我们需要在 N 前面加上前缀。但我正在尝试从 java 中插入,但它仍然让我觉得它在其他表上的工作方式始终如一。 insert 语句插入到 table1 (c1,c2,c3) 值 ('','','') 中,其中值设置为希腊字符。
    • @Supriya,请发布(简化)表的定义和插入语句。可能是触发因素?任何类型的函数,它可能会在赋值之前操纵值?
    • @Shungo,Bingo... 有一个带有特定逻辑的插入触发器导致问题...非常感谢您的帮助!
    猜你喜欢
    • 2019-08-08
    • 2020-08-08
    • 2012-12-19
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多