mySQL mit InnoDB: key was too long Fehler bei utf8mb4

28. April 2016 code 0

Bei der Arbeit an einem kleinen Web Projekt wollte ich eine Tabelle in mySQL (genauer gesagt MariaDB) anlegen. Als Zeichensatz dafür habe ich `utf8mb4` verwendet, um alle nur möglichen Zeichen abzudecken. Hier der zum Erzeugen der Tabelle verwendete SQL Befehl:

CREATE TABLE csrm_users 
(id INT AUTO_INCREMENT NOT NULL, 
 username VARCHAR(255) NOT NULL,
 password VARCHAR(255) NOT NULL, 
 fullname VARCHAR(255) NOT NULL, 
 email VARCHAR(255) DEFAULT NULL, 
 role ENUM('ROLE_ADMIN', 'ROLE_USER'), 
 is_active TINYINT(1) DEFAULT '1' NOT NULL, 
 last_login DATETIME DEFAULT NULL,
 UNIQUE INDEX UNIQ_3B197B0BF85E0677 (username),
 UNIQUE INDEX UNIQ_3B197B0BE7927C74 (email),
 PRIMARY KEY(id))
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
ENGINE = InnoDB

Führt man diesen aus, erhält man den Fehler

Specified key was too long; max key length is 767 bytes

Die Lösung ist relativ simpel, muss man aber erst mal drauf kommen:
Bei `utf8mb4` belegt jedes Zeichen eines `Varchar` Feldes 4 bytes. `Innodb` hat ein Limit von 767 bytes für Keys, welches nicht überschritten werden darf.

Wir müssen also die Länge der Felder username und email auf `767 / 4` Zeichen verringern, was nach Rundung 191 Zeichen entspricht.