2009-06-15 62 views
1

我有以下问题(使用mysql 5.0.70)。MySQL查询与类似%..%在where子句返回不同的结果

在一个表我有一个包含某种一些,喜欢的varchar字段:

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

等整理设置为utf8_general_ci

当系统的用户试图搜索包含这个数字的一​​部分的记录时,问题就出现了。 SQL查询看起来像

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

现在,如果在LIKE部分“A”输入为Latin A,结果只包含Latin A的记录他们 - 因为它应该。而当A为Cyrillic时,结果仅为那些包含CyrillicA的行。还有许多其他字母,如E,C,B,T等等。

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

回答

1

应该转换用户输入,没有功能LOOKS LIKEMySQL :)

可以音译字符串存储与原来在一起,并用php::translit做到这一点:

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

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

是的,“看起来像”正是我正在寻找:) – mmartinov 2009-06-15 13:43:15

0

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

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

如果不是,您可能会发现与您所使用的语言或库中的Quassnoi描述(transliterate())类似的函数。用普通的MySQL你可能不太好运。即使你找到了一些你想要的功能,确保它支持你的用户将要使用的所有语言/字母 - 我不知道有多少字母有1:1的字符映射到拉丁人。

+0

数据只是包含数字,字母,甚至可能是一些破折号的字符串。没有什么像十六进制值或其他结构.. – mmartinov 2009-06-15 13:41:26

0

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

相关问题