2 Stimmen

Welche Kollation verwendet MySQL standardmäßig für ORDER BY?

Diese Abfragen liefern beide das erwartete Ergebnis:

SELECT sex
FROM ponies
ORDER BY sex COLLATE latin1_swedish_ci ASC

SELECT sex
FROM ponies
ORDER BY CONVERT(sex USING utf8) COLLATE utf8_general_ci ASC

| f |
| f |
| m |
| m |
+---+

Aber diese Abfrage liefert ein unterschiedliches Ergebnis:

SELECT sex FROM ponies ORDER BY sex ASC

| m |
| m |
| f |
| f |
+---+

Hier sind die Einstellungen:

SHOW VARIABLES LIKE 'collation\_%'

| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

Die Tabellenkollation ist latin1_swedish_ci.

MySQL Server ist 5.5.16.

2voto

Ian Clelland Punkte 41301

Tabellenkollationen

Standardkollationen werden auf Tabellenebene gespeichert. Es gibt eine serverseitige Voreinstellung, die jedoch auf die Tabelle zum Zeitpunkt ihrer Erstellung angewendet wird.

Um die Kollation für eine bestimmte Tabelle zu finden, führen Sie diese Abfrage aus:

SHOW TABLE STATUS LIKE 'ponies'\G

Sie sollten eine Ausgabe wie diese sehen:

*************************** 1. Zeile ***************************
           Name: ponies
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 8
 Avg_row_length: 20
    Data_length: 160
Max_data_length: 5629499534213119
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2012-02-27 10:16:25
    Update_time: 2012-02-27 10:17:40
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

Und Sie können die Collation-Einstellung in diesem Ergebnis sehen.

Spaltenkollationen

Sie können auch Kollationseinstellungen für bestimmte Spalten innerhalb einer Tabelle überschreiben. Eine CREATE TABLE-Anweisung wie diese würde eine Tabelle mit latin1_swedish_ci erstellen, mit einer Spalte utf8_polish_ci:

CREATE TABLE ponies (
    sex CHAR(1) COLLATE utf8_polish_ci
) CHARACTER SET latin1 COLLATE latin1_swedish_ci;

Die beste Möglichkeit, die Ergebnisse auszusehen, ist wie folgt:

SHOW FULL COLUMNS FROM ponies;

Ausgabe:

+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type    | Collation      | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
| sex   | char(1) | utf8_polish_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+---------+----------------+------+-----+---------+-------+---------------------------------+---------+
1 row in set (0.00 sec)

0voto

wallyk Punkte 55322

Die Dokumentation sagt, dass standardmäßig ein Fall-unempfindlicher Zeichenvergleich verwendet wird. Ich verstehe jedoch nicht, warum Sie nicht dieses Ergebnis erhalten.

Die Dokumentation schlägt auch vor, den binary Qualifikator für einen fallunempfindlichen Vergleich zu verwenden. Ich frage mich, ob das Ihr Ergebnis beeinflussen würde:

SELECT Geschlecht FROM Ponys ORDER BY BINARY Geschlecht ASC

0voto

AndreKR Punkte 30092

Dieses Verhalten kann beobachtet werden, wenn Geschlecht ein ENUM ist, in welchem Fall es normalerweise nach der numerischen Position in der ENUM-Definition sortiert wird. Nur wenn explizit eine Kollation angegeben ist, wird es alphabetisch sortiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X