✦ Oplossingen · Database (MySQL/MariaDB)

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

'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.

Waarom gebeurt dit?

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.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Controleer het rij-formaat van de tabel

    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';
  2. Zet de tabel om naar DYNAMIC

    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;
  3. Of gebruik een prefix-index

    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));
  4. Bij Laravel: standaardlengte van strings

    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);
    }

Lukt het niet? Wij helpen

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.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Waarom werkt de import op mijn computer wel?

Je lokale database is nieuwer en gebruikt standaard DYNAMIC. De server is ouder of heeft andere instellingen.

Moet ik terug naar utf8 (utf8mb3)?

Liever niet: dan kun je geen emoji opslaan. Los het op met DYNAMIC of een prefix-index.

Wat is 191 precies?

Het grootste aantal utf8mb4-tekens dat binnen 767 bytes past: 191 × 4 = 764.