2

我想要:

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

所以 č 和 c 将是相同的, š 和 s 等...

我知道可以使用正则表达式来完成,但这很慢 :-( 任何其他的 LIKE 方式?我也经常使用全文搜索。

更新:

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

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

4

2 回答 2

2

这并不简单,但您最好为 fulltrext 搜索创建自己的排序规则。这是一个例子:

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

更多信息在这里:

http://dev.mysql.com/doc/refman/5.5/en/adding-collat​​ion.html

这样,您的排序逻辑就完全独立于您的 SQL 和业务逻辑,而且您不必为自己的 SQL 变通办法做任何繁重的工作。

编辑:由于排序规则用于所有字符串匹配操作,这可能不是最好的方法:您最终会混淆语言上离散的字符之间的差异。

如果您想抑制特定操作的这些差异,那么您可以考虑编写一个函数,该函数接受一个字符串并以有针对性的方式替换字符,就当前操作而言,这些字符被认为是相同的。

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

另一种方法是将CAST您的字符串添加到ASCII,从而抑制所有非ASCII字符。

例如

SELECT CONVERT('<your text here>' USING ascii) as as_ascii
于 2012-10-18T08:03:14.793 回答
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;
于 2012-10-18T08:59:25.957 回答