1

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

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

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

等排序规则设置为utf8_general_ci

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

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

现在,如果 LIKE 部分中的“A”作为LatinA 输入,则结果仅包含其中带有LatinA 的记录——正如它应该的那样。而当 A 为 时Cyrillic,结果再次只是那些包含CyrillicA 的行。还有许多其他字母,如 E、C、B、T 等。

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

4

3 回答 3

1

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

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

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

mysqli->bind_param('s', strtoupper(transliterate('Москва')));
于 2009-06-15T12:45:33.263 回答
0

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

于 2009-06-19T11:46:00.003 回答
0

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

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

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

于 2009-06-15T13:10:36.917 回答