Normalisieren Sie arabischen Text mysql

Lesezeit: 3 Minuten

Ahmeds Benutzeravatar
Ahmed

Ich habe Probleme bei der Suche nach arabischem Text in MySQL. Ich habe in der Datenbank eine Zeile mit einem Datensatz

display_name
أحمد

Aber wenn ich versuche, eine Abfrage mit zu machen

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

Ich habe versucht, am Ende der Abfrage hinzuzufügen

collate utf8_bin

Aber es hat auch nicht funktioniert. Wie kann ich haben

احمد == أحمد

  • Kurz vor Ihrem SELECT setzen $con->set_charset("utf8");$con ist eine DB-Verbindungsvariable. Ändern Sie es in das, das Sie verwenden. Das könnte/sollte funktionieren.

    – Funk Forty-Niner

    24. April 2014 um 14:57 Uhr


  • Ich verwende WordPress. $wpdb->get_results()

    – Ahmed

    24. April 2014 um 14:58 Uhr


  • Was ist Ihre DB-Verbindungsvariable? Ich benutze zum Beispiel $con = new mysqli(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB);

    – Funk Forty-Niner

    24. April 2014 um 14:59 Uhr

  • Ich denke, es gibt keine andere Möglichkeit, diese Namen zuerst normal zu speichern. Oder Sie sollten vor der Suche eine Liste ähnlicher Zeichen erstellen, z اأإآ und entfernen Sie sie vom Anfang der Zeichenfolge und verwenden Sie dann like. Dies ist jedoch eine begrenzte Lösung für nur Buchstaben am Anfang oder am Ende der Zeichenfolge.

    – SaidbakR

    24. April 2014 um 23:28 Uhr

  • @Ahmed Du musst es dir ansehen ar-php.org

    – SaidbakR

    24. April 2014 um 23:45 Uhr

Ich habe keine genaue Lösung, aber ich kann Ihnen sagen, warum es nicht funktioniert. Wenn Sie möchten, dass diese beiden Zeichenfolgen als gleich angesehen werden, müssen Sie seitdem eine andere Sortierung verwenden utf8_bin vergleicht genaue Codepunkte, und diese beiden Zeichenfolgen sind eindeutig nicht identisch, wenn sie so betrachtet werden. Normalerweise MySQL utf8_general_ci Die Sortierung würde eine Transliteration und Normalisierung bieten, zum Beispiel passen alle diese zusammen:

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

aber in Ihrem Fall funktioniert es nicht und das genauere auch nicht utf8_unicode_ci Kollation:

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

Dieses Diagramm zeigt die Zeichenzuordnung für nahöstliche Sprachen in MySQL utf8_unicode_ci Sortierung, und Sie können sehen, dass die أ und ا Zeichen werden nicht als gleich angesehen, daher werden die Standardsortierungen von MySQL dieses Problem nicht lösen.

Um dies zu umgehen, haben Sie zwei Möglichkeiten: Normalisieren Sie Ihre Strings, bevor sie auf MySQL treffen (dh in PHP), oder erweitern Sie MySQL, um eine geeignete Sortierung bereitzustellen, um das zu tun, was Sie benötigen.

Das Ar-PHP-Projekt kann bei ersterem helfen, wie sємsєм vorgeschlagen hat. Sie sollten Ihren echten Benutzernamen und den normalisierten separat speichern, damit Sie auf dem einen suchen und den anderen anzeigen können. Ein weiteres Projekt bietet auch eine Möglichkeit, arabische Zeichenfolgen umzuformulieren, damit sie in MySQL besser funktionieren.

MySQL-Dokumente zeigen So erstellen Sie eine benutzerdefinierte Sortierung. Es geht im Wesentlichen darum, eine LDML-XML-Datei zu bearbeiten (es gibt mindestens ein BBEdit-Plugin, das dabei hilft) und sie an MySQL zu übergeben. Auf diese Weise können Sie eine Zuordnung erstellen, mit der Sie einige Zeichen als Äquivalente behandeln können. Der Vorteil dieses Ansatzes besteht darin, dass er für PHP transparent ist und Sie keine zusätzlichen Spalten in Ihrer Datenbank benötigen. Wenn Sie eine solche Zuordnung erstellen, wäre dies für andere arabische Benutzer in mehreren Programmiersprachen von Vorteil, nicht nur für PHP.

1390820cookie-checkNormalisieren Sie arabischen Text mysql

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy