【问题标题】:Unicode characters in Sql tableSql表中的Unicode字符
【发布时间】:2010-11-10 13:09:57
【问题描述】:

我正在使用 Sql Server 2008 R2 Enterprise。我正在编写一个能够从 Sql 表中插入、更新、删除和选择记录的应用程序。当涉及到包含 特殊字符(例如 ć、č š、đ 和 ž)的记录时,应用程序会出错。

发生了什么:

命令:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1'

插入一条新记录,但名称字段为Boris Borenovic,因此字符ć 更改为c

命令:

SELECT * FROM Account 
WHERE Name = 'Boris Borenović'

返回正确的记录,因此字符ć 再次被c 替换并返回记录。

问题:

  1. 是否可以让Sql Server 保存前面提到的ć 和其他特殊字符
  2. 如果前面的问题解决了,是否还有可能让Sql 能够返回Boris Borenović 记录,即使查询要求Boris Borenovic

所以,当保存记录时,我希望 Sql 准确地保存给定的内容,但在检索记录时,我希望它能够忽略 特殊字符。感谢所有的帮助。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    1) 确保列的类型是 nvarchar 而不是 varchar(或 nchar 代表 char)

    2) 在包含此类字符串的字符串文字的开头使用N',例如N'Boris Borenović'

    3) 如果您使用客户端库(例如 ADO.Net),它应该处理 Unicode 文本,只要再次将参数标记为 nvarchar/nchar 而不是 varchar/char

    4) 如果你想查询和忽略重音符号,那么你可以在你的选择中添加一个 COLLATE 子句。例如:

    SELECT * FROM Account 
    WHERE Name = 'Boris Borenovic' COLLATE Latin1_General_CI_AI
    

    其中 _CI_AI 表示不区分大小写、不区分重音,应返回所有行末尾带有“c”的所有变体的所有行。

    5) 如果表中的列是 UNIQUE/PK 约束的一部分,并且您需要它同时包含“Boris Borenović”和“Boris Borenovic”,则将 COLLATE 子句添加到列定义中,但这次使用末尾带有“_AS”的排序规则,表示它对重音敏感。

    【讨论】:

    • 感谢您的回答。我的 Sql 表中的字段 Name 的类型是 nvarchar(50),所以问题还是一样。至于整理,我认为这应该可以解决第二个问题,但是,在我解决 ć 和其他缺失字符之前,我被卡住了。我检查了代码中的 Sql 命令文本,它看起来很正常(意味着它包含那些讨厌的字符)。是否还有其他任何东西阻止保存这些角色?为什么 SELECT 语句也将 ć 转换为 c(我没有使用 COLLATE)?
    • @Boris - 就像我说的(第 2 点),如果您有字符串文字(如您发布的示例中所示),则需要在开头引号前加上“N” , 否则字符串将在到达表格之前转换为另一种形式。
    • 好的,我明白了!我应该将 N 放在每个字段值的前面吗?
    【解决方案2】:

    要允许 SQL Server 存储特殊字符,请使用 nvarchar 而不是 varchar 作为列类型。

    检索时,您可以强制使用不区分重音的排序规则,以便它忽略不同的 C:

    WHERE Name = 'Boris Borenović' COLLATE Cyrillic_General_CI_AI
    

    这里,CI 代表不区分大小写,AS 代表不区分重音。

    【讨论】:

      【解决方案3】:

      我也遇到过同样的问题,经过一番研究:

      https://dba.stackexchange.com/questions/139551/how-do-i-set-a-sql-server-unicode-nvarchar-string-to-an-emoji-or-supplementary

      What is the difference between varchar and nvarchar?

      我更改了所需字段的类型:

      ALTER TABLE [table_name] ALTER COLUMN column_name [nvarchar] 
      GO
      

      而且它有效!

      【讨论】:

        猜你喜欢
        • 2010-09-17
        • 2015-05-14
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 2021-12-07
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多