mySQL mit InnoDB: key was too long Fehler bei utf8mb4
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.