如何在mysql中搜索以使重音字符与非重音字符相同?

时间:2012-10-18 07:59:27

标签: mysql

我想:

piščanec= mysql中的piscanec。我的意思是,我想搜索piscanec以找到piščanec。

所以č和c会相同,š和s等......

我知道可以使用regexp来完成,但这很慢:-(与LIKE有任何其他方式吗?我也在使用全文搜索。

更新

select CONVERT('čšćžđ' USING ascii) as text

不起作用。产生:?????

2 个答案:

答案 0 :(得分:2)

这不是直截了当的,但您可能最好为全文搜索创建自己的排序规则。这是一个例子:

http://dev.mysql.com/doc/refman/5.5/en/full-text-adding-collation.html

这里有更多信息:

http://dev.mysql.com/doc/refman/5.5/en/adding-collation.html

这样,您的排序逻辑完全独立于您的SQL和业务逻辑,并且您不必使用SQL解决方法做任何繁重的工作。

编辑,因为排序规则用于 所有 字符串匹配操作,这可能不是最佳方式:您将结束混淆语言上离散的字符之间的差异。

如果要为特定操作抑制这些差异,则可以考虑编写一个接受字符串的函数,并以目标方式替换为当前操作的目的而被视为相同的字符。

你可以定义一个包含你的基本字符(š,č等)的表,另一个包含等价的表。然后在你的字符串上运行REPLACE。

另一种方式只是CAST您的字符串ASCII,从而抑制所有非ASCII个字符。

e.g。

SELECT CONVERT('<your text here>' USING ascii) as as_ascii

答案 1 :(得分:2)

使用排序规则utf8_generic_ci声明列。这种整理认为š等于s,č等于c:

create temporary table t (t varchar(100) collate utf8_general_ci);
insert into t set t = 'piščanec';
insert into t set t = 'piscanec';
select * from t where t='piscanec';
+------------+
| t          |
+------------+
| piščanec   |
| piscanec   |
+------------+

如果您不想或不能对列使用utf8_generic_ci排序规则 - 也许您在列上有唯一索引并且想要考虑piščanec和piscanec不同? - 您可以使用仅在查询中进行排序规则:

create temporary table t (t varchar(100) collate utf8_bin);
insert into t set t = 'piščanec';
insert into t set t = 'piscanec';
select * from t where t='piscanec';
+------------+
| t          |
+------------+
| piscanec   |
+------------+
select * from t where t='piscanec' collate utf8_general_ci;
+------------+
| t          |
+------------+
| piščanec   |
| piscanec   |
+------------+

FULLTEXT索引应该直接使用列排序规则;您不需要定义新的排序规则。显然全文索引只能在列的存储排序规则中,因此如果您想使用utf8_general_ci进行搜索并使用utf8_slovenian_ci进行排序,则必须按顺序使用collate

select * from tab order by col collate utf8_slovenian_ci;