MySQL Unique-Index Groß- und Kleinschreibung

Letzt musste ich feststellen das MySQL bei VARCHAR Feldern keine Unterscheidung zwischen Groß-und Kleinschreibung macht. Aufgefallen ist mir das als ich einen INSERT in eine Tabelle ausführen wollte.

Diese Tabelle hat neben dem Feld ID das als INT NOT NULL AUTO_INCREMENT angelegt ist und als PRIMARY Key dient, ein weiteres Feld, Name, das vom Typ VARCHAR(50) NOT NULL ist. Dieses Feld hat aber anstelle des PRIMARY Constraint, einem UNIQUE Constraint und soll für eindeutige Textwerte sorgen. Genau bei diesem Feld liegt auch das Problem...

Die folgende Auflistung zeigt den aktuellen Zustand der Tabelle.

  1. +---------+---------+
  2. | Id | Name |
  3. +---------+---------+
  4. | 1 | abc |
  5. | 2 | cbd |
  6. +---------+---------+

Als ich nun versuchte
INSERT INTO `TableName` (`Name`) values ('ABC');
auszuführen, bekam ich eine SQL Error (1062): Duplicate entry 'ABC' for key 'Name' Fehlermeldung...

Ok. Für mich sind 'ABC', 'aBc', 'abc', und so weiter alles unterschiedliche Werte. Anscheinend nicht für MySQL.
Nach ein wenig Recherche, stellt sich heraus das ich mit meiner Annahme richtig lag. MySQL unterscheidet standardmäßig nicht zwischen Groß-und Kleinschreibung und ist somit Case-Insenitive...

Die erste Lösung die mir einfiel, war eine Änderung an der Serverkonfiguration. Allerdings wollte ich dieses Risiko nicht eingehen, da ich die Seiteeffekte nicht einschätzen konnte.
Mein zweiter Gedanke war, einfach das Attribut in der Tabelle zu ändern. Die Frage war nur, welchen Datentyp man alternativ verwenden sollte, der eben Case-Sensitve ist...

Ich entschied mich für VARBINARY. VARBINARY speichert die Daten im Binären Format ab und kann somit zwischen Groß- und Kleinschreibung unterscheiden.

Nach dem ich also

  1. ALTER TABLE `TableName`
  2. CHANGE COLUMN `Name` `Name` VARBINARY(50) NOT NULL;

abgesetzt hatte, wurden die vorhandenen Daten brav ins Binäre Format konvertiert.
Auch der oben beschriebene Insert lief danach ohne Fehler.

Somit war auch dieses Problem gelöst. :)

Hinweis:
Man sollte aber nach dieser Änderung unbedingt seine Programmierung anschauen, ob die Binären Daten korrekt geladen werden!

Tags: 

Neuen Kommentar schreiben