我有以下问题(使用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类?或者我应该在插入/更新数据库之前转换用户输入?
答案 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”是没有意义的有人进入“Я”。 因为我知道我的用户只会使用拉丁语和西里尔字符,所以我要做的是列出两个字母表中的常用字母,并在到达数据库之前转换用户输入。有点糟透,但似乎是最合适的解决方案。