Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql表中的Unicode字符_Sql_Sql Server - Fatal编程技术网

Sql表中的Unicode字符

Sql表中的Unicode字符,sql,sql-server,Sql,Sql Server,我使用的是SQLServer2008R2企业版。我正在编写一个能够从Sql表中插入、更新、删除和选择记录的应用程序。当涉及到包含特殊字符(如ć、ć、đ和ž)的记录时,应用程序正在出错 下面是发生的情况: 命令: INSERT INTO Account (Name, Person) VALUES ('Boris Borenović', 'True') WHERE Id = '1' SELECT * FROM Account WHERE Name = 'Boris Borenović' 插

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

下面是发生的情况:

命令:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1'
SELECT * FROM Account 
WHERE Name = 'Boris Borenović'
插入新记录,但名称字段为
Boris Borenovic
,因此字符
ć
更改为
c

命令:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1'
SELECT * FROM Account 
WHERE Name = 'Boris Borenović'
返回正确的记录,因此再次将字符
ć
替换为
c
,并返回记录

问题:

  • 是否可以让Sql Server保存前面提到的
    ć
    和其他特殊字符
  • 如果前面的问题已经解决,那么即使查询请求
    Boris Borenović
    ,Sql是否仍然能够返回
    Boris Borenović记录
    因此,在保存记录时,我希望Sql能够准确地保存给定的内容,但在检索记录时,我希望它能够忽略特殊字符。谢谢你的帮助

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

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

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

    4) 如果要查询并忽略重音,则可以在select中添加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 Server存储特殊字符,对列类型使用
    nvarchar
    而不是
    varchar

    检索时,可以强制进行重音不敏感排序,以便忽略不同的C:

    WHERE Name = 'Boris Borenović' COLLATE Cyrillic_General_CI_AI
    

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

    经过一些研究,我遇到了同样的问题:

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

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

    而且它有效

    谢谢你的回答。我的Sql表中的字段名是nvarchar(50)类型,因此问题仍然存在。至于collate,我认为这应该解决第二个问题,但是,在我解决
    ć
    和其他缺少的字符之前,我一直被卡住。我已经检查了代码中的Sql命令文本,它看起来正常(意味着它包含那些讨厌的字符)。是否还有其他原因阻止保存这些字符?为什么SELECT语句也会将
    ć
    转换为
    c
    (我没有使用COLLATE)?@Boris-就像我说的(第2点),如果你有字符串文字(如你发布的示例中所示),你需要在开始引号前加一个“N”,否则字符串在进入表格之前会转换成另一种形式。好的,我得到了它!我应该把
    N
    放在每个字段值的前面吗?