Frage

Ich habe eine Tabelle erstellt und stellen Sie die Sortierung zu UTF-8 , um einen eindeutigen Index auf ein Feld hinzufügen zu können. Jetzt muß ich Groß- und Kleinschreibung Suche tun, aber wenn ich durchgeführt einige Abfragen mit dem collate Schlüsselwort und ich habe:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
  

ERROR 1253 (42000): COLLATION 'utf8_general_ci' ist nicht gültig für   CHARACTER SET 'latin1'

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
  

ERROR 1267 (HY000): Illegal Mix von Sortierungen (utf8_bin, IMPLIZIT) und   (Latin1_general_ci, EXPLICIT) für den Betrieb '='

Ich bin ziemlich neu in SQL, so dass ich frage mich, ob jemand helfen könnte.

War es hilfreich?

Lösung

Eine Zeichenfolge in MySQL hat einen Zeichensatz und eine Sortierung . UTF-8 ist der Zeichensatz und utf8_bin ist eine seiner Sortierungen. Um Ihre Stringliteral zu einer UTF-8-Säule, wandelt es in UTF-8 zu vergleichen, indem sie sie mit der _charset Notation prefixing:

_utf8 'Something'

Jetzt ist eine Zusammenstellung für einige Zeichensätze nur gültig. Die Fall- sensibel Sortierung für UTF-8 erscheint utf8_bin werden, was Sie wie angeben:

_utf8 'Something' collate utf8_bin

Mit diesen Umwandlungen, sollte die Abfrage arbeiten:

select * from page where pageTitle = _utf8 'Something' collate utf8_bin

Der _charset Präfix arbeitet mit Stringliterale. Um den Zeichensatz eines Feldes zu ändern, gibt es CONVERT ... weiter verwenden. Dies ist nützlich, wenn Sie möchten, dass das Feld auf einem anderen seitentitel Zeichensatz konvertieren, wie in:

select * from page 
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'

Um den Charakter und die Sortierung für eine Spalte mit dem Namen ‚col‘ in einer Tabelle mit dem Namen ‚TAB‘ zu sehen, versuchen Sie:

select distinct collation(col), charset(col) from TAB

Eine Liste aller Zeichensätze und Kollatierungen mit zu finden:

show character set
show collation

Und alle gültigen Sortierungen für UTF-8 mit zu finden:

show collation where charset = 'utf8'

Andere Tipps

Bitte auch beachten, dass bei der Verwendung von „Collate utf8_general_ci“ oder „Collate latin1_general_ci“, das heißt „Kraft“ collate - eine solche Umwandlung von der Nutzung von vorhandenen Indizes verhindern! Dies könnte zu einem Engpass in Zukunft für die Leistung sein.

Versuchen Sie dieses, seine Arbeits für mich

SELECT * FROM users WHERE UPPER (name) = UPPER ( 'josé') utf8_bin COLLATE;

Darf ich fragen, warum Sie eine Notwendigkeit, um explizit die Sortierung zu ändern, wenn Sie eine SELECT tun? Warum nicht einfach sammeln in der Art und Weise Sie die Datensätze abrufen möchten, wenn sortiert?

Das Problem, das Sie haben mit Ihrer Suche Groß- und Kleinschreibung ist, dass Sie eine Binärsortierung haben. Versuchen Sie stattdessen die allgemeine Sortierung zu verwenden. Weitere Informationen über die Groß- und Kleinschreibung und Sortierungen, schau mal hier: Fall Empfindlichkeit in String Suchen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top