Det accepterade svaret är felaktigt (eller åtminstone ganska åsiktsfullt) - jag vill personligen inte att data lagras utanför min databas, eftersom det skapar komplikationer när det gäller säkerhetskopieringsprocedurer och transaktionsfrågor.
Som andra har påpekat, säger manualen upprepade gånger att kolumner BLOB och TEXT inte räknas mot den totala radstorleken, men tyvärr, med standardkonfigurationsinställningarna, är det inte sant, och det slutar med att du får detta felmeddelande. (Felmeddelandet är inte vettigt, eftersom det säger åt dig att använda TEXT istället för VARCHAR för att lösa problemet - vilket du redan är.)
Anledningen till denna begränsning är standardlagringsmekanismen, Antelope , som lagrar de första 768 byten av kolumner med variabel längd i raden - och en möjlig lösning är att använda INNODB och byta din lagringsmekanism till alternativet Barracuda lagringsmekanism:
SET GLOBAL innodb_file_format=Barracuda;
Detta kommer inte att ha någon omedelbar effekt, eftersom den här inställningen är standard för nya databasfiler - så du måste släppa och återskapa hela din databas.
Alternativt kan du byta till Barracuda (enligt ovan) och sedan (utöver det) byta till fil-per-bord-strategin:
SET GLOBAL innodb_file_per_table=ON;
Återigen kommer detta inte att ha någon omedelbar effekt, eftersom båda inställningarna är standardinställningar för nya tabeller - så återigen måste du släppa och återskapa tabellen.
Om du tittar i MySQL-datamappen efter att ha gjort detta kan du bekräfta att separata filer skapats, t.ex. för en databas med namnet "data" och en tabell med namnet "test", bör du se en fil med namnet "data/test/bigtable.ibd".
Om du ogillar att ändra de globala inställningarna i MySQL, prova SET SESSION
istället för SET GLOBAL
, t.ex. omedelbart innan du kör din CREATE TABLE
uttalanden.