2014-04-24 120 views
7

我无法在mysql中搜索阿拉伯语文本。我在数据库中包含正常化阿拉伯语文本mysql

display_name 
أحمد 

但是,当我尝试做一个查询与

SELECT * FROM wp_users WHERE display_name LIKE '%احمد%' 

我试着在查询的末尾添加一条记录的行

collate utf8_bin 

但它也没有工作。我怎么能

احمد == أحمد 
+1

就在你放入SELECT之前把'$ con> set_charset(“utf8”);'---'$ con'是一个DB连接变量。将其更改为您正在使用的那个。这可能/应该工作。 –

+0

我正在使用wordpress。 $ wpdb-> get_results() – Ahmed

+0

什么是您的数据库连接变量?我使用例如'$ con = new mysqli(MYSQL_SERVER,MYSQL_USER,MYSQL_PASSWORD,MYSQL_DB);' –

回答

8

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

+1

我已经创建了一个自定义校对utf8_arabic,如果其他人在同一个问题中运行https://gist.github.com/ahmednasir91/0cf805b5843b295e8959 – Ahmed

+1

太棒了,很高兴解决了! – Synchro