规范化阿拉伯语文本mysql

时间:2014-04-24 14:55:02

标签: php mysql wordpress arabic diacritics

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

display_name
أحمد

但是当我尝试用

进行查询时
SELECT * FROM wp_users WHERE display_name LIKE '%احمد%'

我尝试在查询结尾添加

collate utf8_bin

但它也没有用。我怎么能

احمد == أحمد

1 个答案:

答案 0 :(得分:9)

我没有确切的解决方案,但我可以告诉你为什么它不起作用。如果您希望这两个字符串被认为是相等的,则需要使用不同的排序规则,因为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;

This chart显示了MySQL的utf8_unicode_ci排序规则中的中东语言的字符映射,你可以看到أا字符被认为不相同,所以MySQL的默认排序规则无法解决此问题。

要解决这个问题,你有两个选择:在你的字符串到达​​MySQL之前规范化你的字符串(即在PHP中),或者扩展MySQL以提供适当的校对以完成你需要的工作。

Ar-PHP project可以帮助前者,正如sємsєм建议的那样。您应该单独存储您的真实用户名和标准化用户名,以便您可以搜索一个并显示另一个。 Another project还提供了一种重新描述阿拉伯语字符串的方法,以便在MySQL中更好地工作。

MySQL文档显示how to create a custom collation。它主要涉及编辑LDML XML文件(至少有一个BBEdit插件来帮助解决这个问题)并将其提供给MySQL。这将允许您创建一个映射,使您可以将某些字符视为等效字符。这种方法的优点是它对PHP透明,您不需要在数据库中添加任何其他列。如果您构建这样的映射,那么对于跨多种编程语言的其他阿拉伯用户而言,这将是有益的,而不仅仅是PHP。