2016-05-22 16 views
2

Ich habe meine kleine MySQL-Tabelle abgeladen (manuell zu lokalisieren, das Problem reduziert), es zu zeigen hier:MySQL: zwei verschiedene Werte in MySQL-Tabellen werden als gleich behandelt (nicht eindeutige Schlüssel gesetzt) ​​

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8mb4 */; 



CREATE TABLE `symb` (
    `smb` varchar(200) NOT NULL, 
    `trtmnt` varchar(200) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


INSERT INTO `symb` (`smb`, `trtmnt`) VALUES 
('і', 'ty'), 
('ї', 'hr'); 


/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 

Wenn Sie die MySQL-Tabelle oben erstellen und diese Abfrage ausführen

select * from symb where smb = 'ї'; 

oder diese ein (Abfragen unterschiedlich sind - finden Sie in der 'ї' Symbole vs 'і')

select * from symb where smb = 'і'; 

Dann können Sie sehen, dass Sie zwei Zeilen ausgewählt haben statt einer, wie ich es erwarten würde.

Um noch einmal zu betonen, diese beiden oben ausgewählten Abfragen sind unterschiedlich - das Symbol "ї" unterscheidet sich von "і" (beide sind kyrillische Symbole, "і" ist hier NICHT lateinisch).

Collation chosen was utf8_general_ci 

Irgendwelche Gründe, warum ‚і‘ und ‚ї‘ wie die gleichen Symbole behandelt und was ist der richtige Weg, es anders zu machen? Ich muss die genaue Zeile auswählen, nicht zwei.

Die obigen Abfragen wurden in phpMyAdmin und HeidiSQL getestet, was bedeutet, dass es sich um das MySQL-Problem (Kollation?) Handelt und nicht um das Programm, das zum Ausführen von Abfragen verwendet wird. Jedes unterschiedliche Symbol sollte als ein anderes Symbol behandelt werden und die Tabelle sollte Groß- und Kleinschreibung beachten. Was stimmt nicht mit der obigen Tabelle? Als Ergebnis kann ich keinen eindeutigen Schlüssel für diese Zeile festlegen.

Vielen Dank.

Hinzugefügt nur auf Basis von Kommentaren: Was zeigt Ihnen SHOW TABLE STATUS LIKE 'symb'? Es zeigt mir:

Name symb 
Engine InnoDB 
Version 10 
Row_format Compact 
Rows 2 
Avg_row_length 8192 
Data_length 16384 
Max_data_length 0 
Index_length 0 
Data_free 0 
Auto_increment NULL 
Create_time 22.05.16 12:11 
Update_time NULL 
Check_time NULL 
Collation utf8_general_ci 
Checksum NULL 
Create_options 
Comment 
+1

Was bedeutet SHOW TABLE STATUS LIKE ‚symb'' Show verwenden Du? –

+0

make utf8_general_ci in jeder Spalte –

+0

@TimBiegeleisen, Ich habe die Antwort auf Ihre Frage mit meinen Ergebnissen meiner Tabelle am Ende meiner Frage geschrieben. Vielen Dank. – Haradzieniec

Antwort

2

Da Ihre SELECT-Anweisung beide Datensätze zurückgibt, scheint es, dass Ihre Daten bereits falsch in UTF-8 codiert wurden. Das Ändern der smb-Spalte von Latin1 in UTF-8 wird also nicht funktionieren. Eine Option wäre für Sie die Datenbank binäre Dump und dann wieder importieren sie als UTF-8:

mysqldump --add-drop-table your_database | replace CHARSET=latin1 CHARSET=utf8 | 
    iconv -f latin1 -t utf8 | mysql your_database 

lesen here und here für weitere Informationen.

3

Das ist die Art und Weise ist, wie die Sortierung von Ihnen gewählten funktioniert. Sie können hier nach weiteren Informationen suchen: https://stackoverflow.com/a/1036459/4099089

+0

Vielen Dank für den Link. Habe ich Recht, sollte die empfohlene Tabelle utf8_unicode_ci sein? Habe ich recht, ich sollte eine VOLLSTÄNDIG neue Tabelle erstellen, ohne die vorhandene Tabelle zu konvertieren? Haben beide Fragen die empfohlene Antwort JA? Vielen Dank. – Haradzieniec

+1

Michał, ich habe deine Empfehlungen befolgt - von Null angefangen mit utf8_unicode_ci. Das Problem mit 'ї' gegen 'і' gelöst. Ein anderes ähnliches Problem erschien - das gleiche Problem mit ґ vs г. Irgendwelche Ideen wie das zu beheben? Vielen Dank. – Haradzieniec

+0

Es tut mir leid, aber ich weiß es nicht. Ich würde mir andere Kollatierungen ansehen und versuchen, online zu überprüfen, ob es keine Empfehlungen für die beste Sortierung für Ihre Sprache gibt. – michaJlS

1

Welche möchten Sie?

D197  1111=x0457 [ї] L CYRILLIC SMALL LETTER YI 
C3AF  239=x00EF [ï] L LATIN SMALL LETTER I WITH DIAERESIS 

Wenn Sie SELECT col, HEX(col) ... tun Sie sollten entweder D197 oder C3AF für eine korrekt gespeichert YI oder i-umlaut erhalten. Das ist der beste Weg zu sagen, ob es korrekt als utf8 (oder utf8mb4) gespeichert wurde.

Sie sehen gleich aus, aber sie werden anders behandelt. Alle Sortierungen von utf8/utf8mb4 sortieren alle kyrillischen Buchstaben nach allen lateinischen Buchstaben.

Die "beste" "allgemeine" Sortierung ist utf8mb4_unicode_520_ci. (utf8, anstelle von utf8mb4, ist in Ordnung, wenn du kein Chinesisch oder Emoji brauchst.)

Here ist meine Zusammenfassung der wie westeuropäischen Zeichen in verschiedenen utf8/utf8mb4 Kollationen vergleichen. Zum Beispiel ist utf8_spanish2_ci der einzige, der ll als "separates Zeichen" behandelt, nach allen anderen l Werten. utf8_latvian_ci behandelt Ķ und Ļ als separate Buchstaben. Usw.

SHOW TABLE STATUS zeigt die Standard für die Tabelle; Sie müssen SHOW CREATE TABLE betrachten, um zu sehen, ob irgendeine Spalte diesen Standard überschreibt.

+0

Vielen Dank für Ihren Beitrag. Ich habe utf8_bin gewählt und es sieht so aus, als wäre das eine akzeptable Lösung für meinen Fall. – Haradzieniec

0

ich gelöst habe * dieses Problem auf folgende Weise:

1) Sortierungs Tabelle ändern

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci 

Auf diese Weise können Sie alle Buchstaben in der ukrainischen Alphabet einfügen utf8mb4_unicode_520_ci Ausnahme ґ. Dies ermöglicht Ihnen auch, Briefe so zu sortieren, wie sie sollen.

2) Spalte Änderung Sortierung utf8mb4_bin Sie Zeichen einfügen ґ

ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; 

Dies ermöglicht.

* Der einzige Nachteil dieses Ansatzes besteht darin, dass beim Sortieren Sie

SELECT * FROM table_name ORDER BY column_name COLLATE utf8mb4_unicode_520_ci ASC 

Aber noch, es wird nicht sortieren DESC