规范化阿拉伯文本的MySQL

9

我在mysql中搜索阿拉伯文本时遇到了问题。我在数据库中有一个包含一条记录的行。

display_name
أحمد

但是当我尝试进行一次查询时,遇到了问题。
SELECT * FROM wp_users WHERE display_name LIKE '%احمد%'

我试图在查询的末尾添加

collate utf8_bin

但是它仍然没有起作用。我该怎么办?
احمد == أحمد

1
在你的SELECT语句之前加上 $con->set_charset("utf8"); --- $con 是一个数据库连接变量。将其更改为你正在使用的变量。这样可能/应该会起作用。 - Funk Forty Niner
在WordPress中,您没有连接变量。您通过WordPress数据库API访问数据库。 - Ahmed
好的,我对WordPress几乎一无所知。我已经为您的问题添加了相关标签。 - Funk Forty Niner
1
我认为没有其他方法可以先将这些名称规范化存储。或者在搜索之前,您应该设置一个类似字符的列表,例如 اأإآ 并从字符串开头删除它们,然后使用 like。但是,这仅适用于字符串开头或结尾的字母的有限解决方案。 - SaidbakR
1
@Ahmed 你需要查看 http://www.ar-php.org/。 - SaidbakR
显示剩余4条评论
1个回答

11

我没有确切的解决方案,但我可以告诉你为什么它不起作用。如果您想要将这两个字符串视为相等,则需要使用不同的排序规则,因为utf8_bin会比较精确的代码点,而从那个角度考虑,这两个字符串显然不相同。通常MySQL的utf8_general_ci排序规则可以提供音译和规范化,例如以下所有内容都匹配:

SELECT 'a'='A' COLLATE utf8_general_ci;
SELECT 'ü'='u' COLLATE utf8_general_ci;
SELECT 'ß'='ss' COLLATE utf8_general_ci;

但在你的情况下,它不起作用,更准确的 utf8_unicode_ci 校对也是如此:

SELECT 'احمد'='أحمد' COLLATE utf8_general_ci;
SELECT 'احمد'='أحمد' COLLATE utf8_unicode_ci;

这个图表 显示了MySQL的 utf8_unicode_ci collation 中用于中东语言的字符映射。您可以看到,أا 字符不被视为相等,因此MySQL的默认collations无法解决此问题。

要解决此问题,您有两个选择:在字符串输入MySQL之前(即在PHP中)对它们进行归一化,或扩展MySQL提供适当的排序规则以满足您的需求。

如sємsєм所建议的那样,Ar-PHP 项目 可以帮助您完成前者。您应该分别存储真实用户名和已标准化的用户名,以便您可以搜索一个并显示另一个。另一个项目 还提供了一种重新构造阿拉伯语字符串以更好地在MySQL中使用的方法。

MySQL文档显示如何创建自定义排序规则。它基本上涉及编辑LDML XML文件(至少有一个BBEdit插件可帮助完成此操作)并将其提供给MySQL。这将使您能够创建一种映射,让您将某些字符视为等效字符。这种方法的优点是它对PHP透明,并且您不需要在数据库中添加任何其他列。如果您构建这样的映射,则对于其他阿拉伯语用户跨多种编程语言,而不仅仅是PHP,将是有益的。


3
我已经创建了一个自定义排序规则utf8_arabic,如果其他人遇到同样的问题,请参考https://gist.github.com/ahmednasir91/0cf805b5843b295e8959。 - Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接