Frage Charaktere "í" und "ی" und der Unterschied in Persisch - Mysql


Ich arbeite an einer persischen UTF-8-Website mit integrierter MySQL-Datenbank. Alle Inhalte auf der Website werden über ein Admin-Panel importiert und alles ist persisch.

Wie Sie vielleicht wissen, hat die arabische Sprache die gleichen Buchstaben wie persisch, außer einigen. Das Problem ist, wenn eine Person versucht, auf einer Tastatur mit arabischem Layout zu tippen, schreibt sie "ì" als ein Zeichen und wenn er versucht, durch eine Tastatur mit persischem Layout zu tippen, tippt es "ی" als Zeichen ein.

Wenn also eine Person nach 'بازی' sucht, findet die Mysql 'بازي' nicht als Ergebnis.

Wichtiger Hinweis: 'ی' ist nicht das einzige Zeichen mit dieser Eigenschaft, es gibt viele davon und sie sind sich sehr ähnlich.

Wie kann ich dieses Problem beheben?

Eine einfache naive Lösung scheint alle "ı" durch "ی" zu ersetzen, bevor die Daten in die Datenbank importiert werden, aber ich suche nach einer besseren robusten Lösung als diese.


37
2018-04-11 01:52


Ursprung


Antworten:


Lieber EBAG, wir haben eine Single Arabisch blockieren Unicode das enthält sowohl Arabisch und persisch Figuren.

06CC ist Perser ی und 064A ist Arabisch ي

Standard-Windows-Tastatur verwendet code page 1256 für arabische Zeichen, die setzen 064A als Standard ي Sowohl für persische als auch für arabische Benutzer, denn arabische Benutzer sind viel mehr als Persisch.

ISIRI eine Standardtastatur erstellen ISIRI 9147 und legte sowohl Arabisch als auch Persisch Yeh darauf aber Perisan ی ist die Standardzeichen. Persische Benutzer, die die Standardtastatur benutzen, werden Standard-Persisch verwenden (und verwenden) ی‍ while the rest of them use arabic"."

Wie Sie normalerweise gesagt haben, während wir Daten in der Datenbank speichern, ändern wir arabisch ي zu Persisch ‍ی und wenn wir davon lesen, gehen wir einfach für Persisch, also ist alles wahr.

Der zweite Ansatz besteht darin, eine JavaScript-Datei in einer Webanwendung zu verwenden, um Benutzereingaben zu steuern. Die meisten persischen Websites verwenden diesen Ansatz, um Zeichen in der Datenbank zu speichern. Bei dieser Methode muss der Benutzer kein Tastaturlayout für persische oder arabische Tastatur installieren. Er / sie legte einfach die Tastatur auf English und dann JavaScript Dateientwickler prüfen, welcher Charakter für ihn geeignet ist. Hier du kannst finden ISIRI 9147 javascript für die Webanwendung und einen Persischen Guid, um es zu verwenden.

Der dritte Ansatz besteht darin, eine Bildschirmtastatur zu verwenden, die genauso wie die vorherige mit einer Benutzerschnittstelle arbeitet und normalerweise gut für diese ist, die nicht mit der persischen Tastatur vertraut sind.

Der vierte Ansatz besteht darin, beide Dialekte zu suchen. Wie Sie bei der Installation wissen MySql oder SQL Server du kannst das einstellen collation Außerdem haben Sie die Möglichkeit, Dialekt (und Fallsensitivität) zu unterstützen. Wenn Sie die arabische Sortierung mit dem Dialekt aktivieren, können Sie für beide Ergebnisse erhalten, was normalerweise gut funktioniert sql server Ich teste es nicht in MySql. Dies ist die beste Lösung bisher.

aber wenn ich du wäre, würde ich ein einfaches implementieren sql function welche bekommen nvarchar und zurück nvarchar. dann rufe ich es an, wenn ich Daten schreiben wollte. und wann immer Sie lesen möchten, können Sie sich für den Standard entscheiden.

Sorry für den langen Schwanz.


28
2018-05-31 10:17



update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,NCHAR(1610),NCHAR(1740))

oder

update TABLENAME set COLUMNNAME=REPLACE(COLUMNNAME,'ي',N'ی')

9
2017-08-05 07:20



Dies wird als Kollatierung bezeichnet. Es ist das, was MySQL verwendet, um zwei verschiedene Charaktere zu vergleichen. Ich fürchte, ich weiß nichts über Persisch oder Arabisch, aber das Konzept ist das gleiche. Im Wesentlichen haben Sie zwei Zeichen, die auf den gleichen Basiswert abgebildet werden. Sie müssen eine Kollatierung finden, die ì zu maps abbildet. Ich fürchte, das ist so hilfreich wie ich sein kann, ohne mehr über die Sprache zu wissen.


3
2018-04-11 02:43



Der erste Buchstabe ()) ist Yā' im arabischen Alphabet. Der zweite Buchstabe (ی) ist ye im perso-arabischen Alphabet.

Mehr zum perso-arabischen Alphabet hier: http://en.wikipedia.org/wiki/Perso-Arabic_alphabet

"Zwei Punkte werden im letzten ye (ی) entfernt. Arabisch unterscheidet das finale yā' mit den zwei Punkten und dem alif maqsura (außer im ägyptischen Arabisch), das wie ein abschließendes y'' ohne zwei Punkte geschrieben ist.

Weil der Perser im letzten Jahr die zwei Punkte abwirft, kann der Alif-Maqsura nicht vom normalen End-Ye unterschieden werden. Zum Beispiel wird der Name Musâ (Moses) مویی geschrieben. Im letzten Brief in Musâ unterscheidet der Perser nicht zwischen ye oder alif maqsura. "

Scheint ein interessantes Problem zu sein ...


3
2018-05-30 17:40



Ich hatte mit der ähnlichen Situation vor 5-6 Jahren zu kämpfen, als Lucene keine Option für MySQL war und es keine Sphinx gab (Ich habe Sphinx nie versucht, dies zu tun), aber was ich getan habe, war, dass ich ziemlich viele der möglichen Alternativen gefunden habe setze sie in ein Array in PHP. Wenn also das Eingabe-Schlüsselwort eines dieser Zeichen enthielt, generierte ich alle möglichen Alternativen dazu.

Also hätte ich für die Eingabe von 'بازی' {'بازي', 'بازی'} generiert und dann würde ich MySQL für beide Fragen abfragen, wie die einfachste Abfrage unten:

SELECT title,Describtion FROM Games WHERE Description LIKE '%بازي%' OR Description LIKE '%بازی%' 

Die primäre Liste der Alternativen ist jedoch nicht sehr lang.


2
2018-01-10 22:36



Wenn Sie die DB-Engine wechseln können, sollten Sie sich die Volltextsuchfunktion von PostgreSQL ansehen:

http://www.postgresql.org/docs/9.0/static/textsearch.html

Unter anderem können Sie sie so konfigurieren, dass sie Zeichen ohne Akzente indexiert / sucht, und Sie können alle Arten von zusätzlichen Wörterbüchern definieren (z. B. Stoppwörter, Thesaurus, Synonyme usw.).

Wenn nicht, ziehen Sie in Betracht zu verwenden Sphinx oder Lucene Anstatt von like Anweisungen für Ihre Suchanfragen.


1
2018-05-27 11:08



Ich weiß, dass die Beantwortung dieses Themas wie das Graben eines Leichnams aus seinem Grab ist, da es wirklich alt ist, aber ich möchte meine Erfahrung IMHO teilen, der beste Weg ist es, Ihre Anfrage zu verpacken und Ihren Ersatz zu beantragen. es ist tragbarer als andere Wege. Hier ist ein Java-Beispiel

public class FarsiRequestWrapper extends HttpServletRequestWrapper{

@Override
public String getParameter(String name) {
    String parameterValue = super.getParameter(name);
    parameterValue.replace("ی", "ي");       
    parameterValue.replace("\\s+", " ");
    parameterValue.replace("ک","ک");
    return parameter.trim();
}

}

dann müssen Sie nur ein Filter-Servlet einrichten

public class FarsiFilter implements Filter{

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    FarsiRequestWrapper rw = new FarsiRequestWrapper(req);
    chain.doFilter(rw, response);
}

} Obwohl dieser Ansatz nur in Java funktioniert, fand ich es einfacher und besser.


1
2017-11-13 07:57



Du musst benutzt werden "N vor dem Ersatzzeichen, zum Beispiel:
ERSETZEN (SPALTE, N 'ì', N 'ی')


0
2017-09-25 12:16