2012-06-12 23 views
5

Ich weiß, es gibt viele ähnliche Fragen zu SF, aber ich denke, meins ist anders genug, um eine neue Frage zu rechtfertigen. Ich habe eine Tabelle, die eine einzige Spalte als utf8 mit utf8_unicode_ci hat. Es hat auch einen eindeutigen Schlüssel in dieser Spalte zusammen mit einer anderen Spalte, die einen Sprachcode markiert. Die Daten in der Spalte sind in vielen verschiedenen Schriften (Latein mit verschiedenen Akzenten, Chinesisch und Russisch, unter anderem).MySQL Case Insensitive, aber Akzent Sensitive UTF8 Unique Key

Das Problem ist, dass ich manchmal zwei Wörter mit unterschiedlichen Bedeutungen eingeben möchte, die sich nur durch ein diakritisches unterscheiden (d. H. Spanisch ano vs año). Da utf8_unicode_ci sowohl case- als auch accent-unempfindlich ist, denkt es, dass diese gleich sind und lässt mich nur eins eingeben. Das ist Scheiße. Im Idealfall würde ich die ganze Spalte einfach auf eine Kollatierung umstellen, die zwar insensitiv aber akzentsensitiv ist, aber das scheint nicht zu existieren. Viele verschiedene Sachen benutzen diese Spalte, daher würde ich die Standard-Kollatierung der Spalte lieber nicht in utf8_bin ändern, aus Angst, Dinge mit Groß-/Kleinschreibung zu vertauschen.

Also, all das sagte, ich brauche eine Lösung, die die Standard Groß-und Kleinschreibung in den vielen vorhandenen Abfragen nicht beeinflussen wird, die diese Spalte treffen, aber lassen Sie mich Wörter hinzufügen, die sich nur durch ein diakritisches unterscheiden. Ideen? Ich werde nur die eindeutige Schlüsseleinschränkung zu utf8_bin wechseln, wenn es sein muss, aber ich möchte lieber nicht, weil ich nie zwei Dinge in der Tabelle haben möchte, die sich nur in Groß- und Kleinschreibung unterscheiden.

Antwort

0

Das einzige, was ich mir vorstellen kann (ohne eine Kollatierung zu finden, die Ihren Anforderungen entspricht), ist etwas auf der Anwendungsebene (außerhalb von MySQL) zu ändern, die sich um die Differenzierung kümmert.

Zum Beispiel, weil Sie nicht auf Groß-/Kleinschreibung achten, können Sie etwas programmgesteuert tun, um die Groß-/Kleinschreibung aller Zeilen in der Datenbank zu verringern. Ändern Sie dann die Sortierung in utf8_bin.

Dann können Sie in der Anwendung alles in Kleinbuchstaben konvertieren, bevor es in die Datenbank eingeht (ich vermute, dies wird die diakritischen Zeichen nicht beeinflussen). Auf diese Weise erhalten Sie immer noch Fehler, wenn Benutzer versuchen, mehrere Fälle einzugeben. Sie sollten nur einige Codezeilen ändern, um die in die Tabelle eingehenden Vorbedingungen zu korrigieren, und Sie haben kein diakritisches Problem.

+1

Einige Großbuchstaben haben keinen Kleinbuchstaben. Einige haben mehrere Kleinbuchstaben. Es ist eine Art Chaos. –

0

Hier müssen Sie die Reifenpanne (das Rad neu erfinden) nicht neu erfinden.

Es gibt zwei spanischsprachige Sortierungen in MySQL:

utf8_spanish_ci (modernes Spanisch) und utf8_spanish2_ci (traditionelle spanische)

Diese kennen die Sprache gut genug, um zu wissen, dass N und n soll zusammen gesammelt werden , aber das Ñ und ñ sind verschiedene Buchstaben zwischen N und O. Im Spanischen ist das Ñ eigentlich ein anderer Buchstabe, kein Akzent.

Stellen Sie Ihre Spaltensortierung auf utf8_spanish_ci ein und alles funktioniert wie Sie möchten.

+0

Danke, aber wie ich schon sagte, es ist nicht nur Spanisch, um das ich mir Sorgen mache. Es gibt Sachen in verschiedenen Sprachen. – Eli

+0

Hmm. Die Leute, die sich Unicode-Kollatierungen ausgedacht haben, sind exzellente Linguisten. Wenn es eine universelle Lösung gäbe, die für alle Sprachen des lateinischen Alphabets das Richtige getan hätte, hätten sie es implementiert. Abhängig von der Sprache Ihres Benutzers müssen Sie möglicherweise einige sprachabhängige Abfragen durchführen. Sie können eine COLLATE-Klausel in eine WHERE-Anweisung einfügen. –