Was ist los mit MySQL LIKE-Operator auf utf8_turkish_ci sorting?

Ich habe eine Tabelle wie folgt:

wordId | word --------------------------------- 1 | axxe 2 | test word 3 | another test word 

Ich versuche, die folgende Abfrage auszuführen, um die datasätze zu finden, die mit den Buchstaben "ax" beginnen.

 SELECT * FROM `words` WHERE word LIKE 'ax%' 

MySQL kann nichts finden.

Aber , wenn ich eine der Abfragen unten versuche, kann ich die korrekte Aufzeichnung (das Wort "axxe") auf den Ergebnissen sehen.

 SELECT * FROM `words` WHERE word='axxe' SELECT * FROM `words` WHERE word LIKE '%ax%' SELECT * FROM `words` WHERE word LIKE 'a%' 

Warum kann MySQL nicht den richtigen Wert für die erste Abfrage finden? Ich habe versucht, dies sowohl in der Befehlszeile und phpMyAdmin auszuführen, aber das Ergebnis ist das gleiche.

Dies ist SHOW CREATE TABLE Ausgabe:

 CREATE TABLE `words` ( `wordId` int(11) NOT NULL auto_increment, `word` text collate utf8_turkish_ci NOT NULL PRIMARY KEY (`word`) ) ENGINE=MyISAM AUTO_INCREMENT=2853 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci 

Solutions Collecting From Web of "Was ist los mit MySQL LIKE-Operator auf utf8_turkish_ci sorting?"

TL; DR:

Aktualisieren Sie Ihre MySQL-Version.


Ich habe hier eine Simulation Ihres Problems erstellt:

Tabelle erstellen:

 CREATE TABLE `turky` ( `id` int(5) NOT NULL AUTO_INCREMENT, `word` text COLLATE utf8_turkish_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci 

data insert:

 INSERT INTO `turky` (`id`, `word`) VALUES (1, 'axxe'), (2, 'test word'), (3, 'axxxxxe'), (4, 'another test word'); 

Testabfrage ausführen (das funktioniert):

 SELECT * FROM `turky` WHERE `word`='axxe' 

Ergebnis:

1, 'axxe',

Testabfrage 2 ausführen (das funktioniert):

 SELECT * FROM `turky` WHERE word LIKE '%ax%' 

Ergebnis:

1, 'axxe',
3, 'axxxxxe',

Testabfrage 3 ausführen (das funktioniert):

 SELECT * FROM `turky` WHERE word LIKE 'a%' 

Ergebnis:

1, 'axxe',
3, 'axxxxxe',
4, 'ein anderes Testwort';


Führen Sie Testabfrage 4 aus (die ursprünglich nicht funktioniert):

 SELECT * FROM `turky` WHERE `word` LIKE 'ax%' 

Ergebnis:

1, 'axxe',
3, 'axxxxxe',

Dies funktioniert in MySQL mit PHPMyAdmin.

Versionen :
MySQL: 5.6.35
PHPMyAdmin: 4.6.6


Das aktuelle türkische Alphabet enthält nicht den Buchstaben "x", so dass diese Tatsache ( wahrscheinlich nicht ) zu einer obskuren Störung des SQL-Sortierprozesses führen kann (wie in einem Mangel an Sprachführung bei der search nach diesem character).

Web-search Türkisch Bugs in MySQL und während es ein halbes Dutzend keine von ihnen scheinen für Ihre spezifische Instanz zu sein.

Aber die einzige Möglichkeit, die ich aus meinen eigenen Tests (oben) sehen kann, ist, dass Sie eine ältere Version von MySQL haben, die einige türkische Bugs enthält.


Wenn Ihre MySQL-Version aktuell ist

(oder zumindest, neuer als meine)

Dann scheint das Problem spezifisch für Ihr Setup und Ihre data zu sein. :-( bezweifle ich sehr, dass wir dieses Problem finden und reproduzieren können :-(


Mehr Diagnosematerial :
Wie von Jacob H kommentiert, sehen Sie, ob dieses Problem nach dem Casting in binary immer noch auftritt:

 SELECT * FROM `turky` WHERE BINARY `word` LIKE CONCAT(BINARY 'ax','%'); 

Ergebnis:

1, 'axxe',
3, 'axxxxxe',