Sql表中的Unicode字符
我使用的是SQLServer2008R2企业版。我正在编写一个能够从Sql表中插入、更新、删除和选择记录的应用程序。当涉及到包含特殊字符(如ć、ć、đ和ž)的记录时,应用程序正在出错 下面是发生的情况: 命令: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ć' 插
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
,并返回记录
问题:
ć
和其他特殊字符李>
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
放在每个字段值的前面吗?