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.