在where子句中返回不同结果的类似%..%的mysql查询

时间:2009-06-15 12:41:47

标签: mysql sql-like

我有以下问题(使用mysql 5.0.70)。

在一个表格中,我有一个varchar字段,其中包含某种数字,例如:

"0303A342", "21534463", "35663CE3"

等。排序规则设置为utf8_general_ci

当系统用户尝试搜索包含此号码部分的记录时,会出现问题。 SQL查询看起来像

...
WHERE 'number' LIKE '%0303A%'

现在,如果LIKE部分中的'A'作为Latin A输入,则结果仅包含其中包含Latin A的记录 - 应该如此。当A为Cyrillic时,结果只会是那些包含Cyrillic A的行。还有许多其他字母,如E,C,B,T等。

现在我的问题是,如果有一种方法可以修改我的SQL查询,那么它会返回与LIKE '%0303A%'部分匹配的所有行,但是对于那里的所有A类?或者我应该在插入/更新数据库之前转换用户输入?

3 个答案:

答案 0 :(得分:1)

你应该转换用户输入,LOOKS LIKE中没有函数MySQL:)

您可以将音译字符串与原始字符串一起存储,然后使用php::translit执行此操作:

id data    trans_data
1  Москва  MOSKVA
2  София   SOFIA
SELECT  *
FROM    table
WHERE   trans_data LIKE CONCAT('%', ?, '%')

mysqli->bind_param('s', strtoupper(transliterate('Москва')));

答案 1 :(得分:0)

一些字母在几个字母表中看起来很相似的事实并不能使它们相同。事实上,他们看起来很相似甚至可能取决于用于显示它们的字体。

您的示例数据看起来像十六进制值。如果不了解您的问题的上下文,是否可以让用户以十进制格式输入数据(只使用数字)?另一种可能性是用于输入搜索条件的自定义控件。它必须是自由文本还是可能有几个选项的列表框就足够了?

如果没有,您可能会在您使用的语言或库中找到类似Quassnoi描述的函数(transliterate())。使用简单的MySQL你可能会运气不好。即使你找到了一些你想做的功能,也要确保它支持你的用户将要使用的所有语言/字母 - 我不知道有多少字母表有他们的字符的1:1映射到拉丁人。

答案 2 :(得分:0)

我无法使用php translit - 我正在处理的数据(我称之为“数字”)是某种标识符,所以搜索“IA”是没有意义的有人进入“Я”。 因为我知道我的用户只会使用拉丁语和西里尔字符,所以我要做的是列出两个字母表中的常用字母,并在到达数据库之前转换用户输入。有点糟透,但似乎是最合适的解决方案。