我关注了这篇文章How do I perform an accent insensitive compare (e with è, é, ê and ë) in SQL Server?,但它对“ş”,“ţ”字符没有帮助。
如果城市名称为“iaşi”,则不返回任何内容:
SELECT *
FROM City
WHERE Name COLLATE Latin1_general_CI_AI LIKE '%iasi%' COLLATE Latin1_general_CI_AI
如果城市名称是“iaşi”(注意LIKE模式中的外来ş
),这也不会返回任何内容:
SELECT *
FROM City
WHERE Name COLLATE Latin1_general_CI_AI LIKE '%iaşi%' COLLATE Latin1_general_CI_AI
我正在使用SQL Server Management Studio 2012 我的数据库和列排序规则是“Latin1_General_CI_AI”,列类型是nvarchar。
我怎样才能让它发挥作用?
答案 0 :(得分:2)
您指定的字符不属于Latin1代码页,因此无法以Latin1_General_CI_AI
中的序数进行任何其他方式的比较。事实上,我认为在给定的整理中它们根本不起作用。
如果您只使用一种排序规则,只需使用正确的排序规则(例如,如果您的数据是土耳其语,请使用Turkish_CI_AI
)。如果您的数据来自许多不同的语言,则必须使用unicode和正确的排序规则。
然而,还有一个问题。在罗马尼亚语或土耳其语等语言中,ş
不是重音s
,而是完全独立的字符 - 请参阅http://collation-charts.org/mssql/mssql.0418.1250.Romanian_CI_AI.html。与例如对比。 š
这是s
的重音形式。
如果您确实需要ş
等于s
,则可以手动替换原始字符。
此外,当您使用unicode列(nvarchar和一堆)时,请确保您还使用unicode 文字,即。使用N'%iasi%'
而不是'%iasi%'
。
答案 1 :(得分:1)
我猜是不是最整洁的解决方案,但如果您知道问题只是“ş”和“ţ”字符,那么替换是否可以接受?
SELECT *
FROM City
WHERE replace(replace(Name,'ş','s'),'ţ','t') LIKE COLLATE Latin1_general_CI_AI '%iasi%' COLLATE Latin1_general_CI_AI
答案 2 :(得分:1)
在SQL Server 2008归类中,版本为100 were introduced。
整理Latin1_General_100_CI_AI
似乎可以满足您的要求。
以下方法应该起作用:
SELECT * FROM City WHERE Name LIKE '%iasi%' COLLATE Latin1_General_100_CI_AI
答案 3 :(得分:0)
您需要在操作之前更改name
字段的排序规则。检查下面的测试代码
DECLARE @city TABLE ( NAME NVARCHAR(20) )
INSERT INTO @city
VALUES ( N'iaşi' )
SELECT *
FROM @city
WHERE name LIKE 'iasi'
--No return
SELECT *
FROM @city
WHERE name COLLATE Latin1_general_CI_AI LIKE '%iasi%'
--Return 1 row
答案 4 :(得分:0)
这个问题困扰了我一段时间,直到现在,当我终于想通了。 假设您的表或列是SQL_Latin1_General_CP1_CI_AS排序规则,如果您这样做:
update
set myCol = replace(myCol , N'ș', N's')
from MyTable
和
update
set myCol = replace(myCol,N'ț',N't')
from MyTable
替换功能将找不到这些字符,因为键盘(罗马尼亚标准键盘)制作的“ş”与数据库中的“ş”或“ţ”不同。 作为比较:ţţ和şş - 你可以看到它们不同,因为重音更接近“s”或“t”字符。
相反,你必须这样做:
update
set myCol = replace(myCol , N'ş', N's')
from MyTable
和
update
set myCol = replace(myCol,N'ţ',N't')
from MyTable