'ERROR 1071: Specified key was too long; max key length is 767 bytes' komt bij een index op een lange utf8mb4-kolom met een oud rij-formaat. Zo los je het op met DYNAMIC of een prefix-index.
Een index heeft een maximale lengte in bytes. Met het oudere InnoDB-rij-formaat COMPACT (of REDUNDANT) is dat 767 bytes. Een VARCHAR(255) in utf8mb4 kan tot 255 × 4 = 1020 bytes nodig hebben en past dan niet: de server geeft fout 1071.
Met het rij-formaat DYNAMIC of COMPRESSED is de grens 3072 bytes. In recente MySQL- en MariaDB-versies is DYNAMIC standaard, dus deze fout zie je vooral op oudere servers, oude tabellen of bij het importeren van een database van een nieuwere naar een oudere server.
Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
Kijk welk rij-formaat de tabellen nu hebben; COMPACT of REDUNDANT geeft de grens van 767 bytes.
SELECT table_name, row_format
FROM information_schema.tables
WHERE table_schema = 'databasenaam';Na een back-up kun je het rij-formaat wijzigen; daarna past een index op VARCHAR(255) in utf8mb4.
ALTER TABLE gebruikers ROW_FORMAT=DYNAMIC;Indexeer alleen het begin van de kolom. 191 tekens × 4 bytes = 764 bytes, net onder de grens. Een prefix-index kan niet voor een UNIQUE-controle over de hele waarde zorgen.
ALTER TABLE gebruikers ADD INDEX idx_email (email(191));Op oudere databaseservers zetten veel projecten de standaardlengte op 191 in de AppServiceProvider.
use Illuminate\Support\Facades\Schema;
public function boot(): void
{
Schema::defaultStringLength(191);
}Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.
Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.
Je lokale database is nieuwer en gebruikt standaard DYNAMIC. De server is ouder of heeft andere instellingen.
Liever niet: dan kun je geen emoji opslaan. Los het op met DYNAMIC of een prefix-index.
Het grootste aantal utf8mb4-tekens dat binnen 767 bytes past: 191 × 4 = 764.
Hulp nodig van een mens? Website-onderhoud · WordPress-support · Hosting en onderhoud · Alle oplossingen