2014-04-24 140 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