时间:2014-03-14 15:35:38

标签: sql sql-server tsql sql-server-2012

我关注了这篇文章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。

我怎样才能让它发挥作用?

5 个答案:

答案 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