Chyba Row size too large při updatu na MySQL InnoDB
- TomasHalasz
- Bronze Partner | 79
Ahoj,
prosím o radu. Setkal jste se někdo s touto chybou na MySQL?
SQLSTATE[42000]: Syntax error or access violation: 1118 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
Děje se to při updatu tabulky, na které je v jednom formuláři 16 blobů s delším textem.
Našel jsem, že pomůže přepnutí innodb na formát Baracuda , ale to mi moc nepomůže, protože webhosting kde jsem tohle neumí.
Napadlo mě, že by se dal update tabulky rozdělit na více částí třeba po 4 polích, ale radši se nejdřív zeptám jesti to někdo dřív neřešil.
díky moc
- TomasHalasz
- Bronze Partner | 79
Tím rozdělením jsem si moc nepomohl… Vzal jsem to přibližně napůl a vznikl mi tento update:
UPDATE `rounds`
SET `id`='49', `games_id`='12', `code2im_cs`=NULL, `code2im_en`=NULL, `code2im_de`=NULL,
`code2im_ru`=NULL, `help_cs`=?, `help_en`=?, `help_de`=?, `help_ru`=?
WHERE (`id` = '49')
kde všechny pole jsou BLOB. V okamžiku kdy v posledních čtyřech polích chci mít text o délce 392 znaků v každém z nich tak dostanu chybu
Row size too large (> 8126)
Proč když 4×392 není ani zdaleka větší než 8126?
- Pavel Macháň
- Člen | 282
TomasHalasz napsal(a):
Tím rozdělením jsem si moc nepomohl… Vzal jsem to přibližně napůl a vznikl mi tento update:
UPDATE `rounds` SET `id`='49', `games_id`='12', `code2im_cs`=NULL, `code2im_en`=NULL, `code2im_de`=NULL, `code2im_ru`=NULL, `help_cs`=?, `help_en`=?, `help_de`=?, `help_ru`=? WHERE (`id` = '49')
kde všechny pole jsou BLOB. V okamžiku kdy v posledních čtyřech polích chci mít text o délce 392 znaků v každém z nich tak dostanu chybu
Row size too large (> 8126)
Proč když 4×392 není ani zdaleka větší než 8126?
Překlady bych si hodil do jine tabulky co překlad pro danej jazyk = novej zaznam s ID jazyka
- TomasHalasz
- Bronze Partner | 79
EIFEL napsal(a):
TomasHalasz napsal(a):
Tím rozdělením jsem si moc nepomohl… Vzal jsem to přibližně napůl a vznikl mi tento update:
> UPDATE `rounds` > SET `id`='49', `games_id`='12', `code2im_cs`=NULL, `code2im_en`=NULL, `code2im_de`=NULL, > `code2im_ru`=NULL, `help_cs`=?, `help_en`=?, `help_de`=?, `help_ru`=? > WHERE (`id` = '49')
>
kde všechny pole jsou BLOB. V okamžiku kdy v posledních čtyřech polích chci mít text o délce 392 znaků v každém z nich tak dostanu chybu
> Row size too large (> 8126)
>
Proč když 4×392 není ani zdaleka větší než 8126?
Překlady bych si hodil do jine tabulky co překlad pro danej jazyk = novej zaznam s ID jazyka
V tomhle případě se to nehodí, protože každý text pro cizí jazyk je
dlouhý a nikde jinde není využitelný než právě na jednom záznamu
v této tabulce.
Navíc bych rád věděl jak to vyřešit systémově, protože v jiné
aplikaci můžu potřebovat ukládat také více delších textů do jedné
tabulky a nemusí jít jen o překlady.
- mystik
- Člen | 320
TomasHalasz napsal(a):
Row size too large (> 8126)
Proč když 4×392 není ani zdaleka větší než 8126?
Jde o velikost celého řádku a taky počítej že v UTF znak nerovná se byte.
Problém ale nebudou TEXT nebo BLOB sloupce – na ty se v row ukládá jen reference. Jak vypadá schéma té tabulky? Nemáš tam nějaké VARCHAR?
Jinak tím, že update rozdělíš si nepomůžeš. Problém je velikost řádku v DB (databáze má na každý řádek vyhrazenu určitou max délku) ne velikost jednoho dotazu. Pokud je příčinou VARCHAR tak řešením je ho vyměnit právě za typ TEXT nebo CLOB/BLOB, který se neukládá do row.
Editoval mystik (27. 5. 2014 18:57)
- TomasHalasz
- Bronze Partner | 79
mystik napsal(a):
TomasHalasz napsal(a):
> Row size too large (> 8126)
>
Proč když 4×392 není ani zdaleka větší než 8126?
Jde o velikost celého řádku a taky počítej že v UTF znak nerovná se byte.
Problém ale nebudou TEXT nebo BLOB sloupce – na ty se v row ukládá jen reference. Jak vypadá schéma té tabulky? Nemáš tam nějaké VARCHAR?
Jinak tím, že update rozdělíš si nepomůžeš. Problém je velikost řádku v DB (databáze má na každý řádek vyhrazenu určitou max délku) ne velikost jednoho dotazu. Pokud je příčinou VARCHAR tak řešením je ho vyměnit právě za typ TEXT nebo CLOB/BLOB, který se neukládá do row.
VARCHAR tam sice byly, ale jen čtyři po 30 znacích. Změnil jsem je na TEXT, bohužel bez úspěchu. Trochu jsem experimentoval a zjistil, že k problému dojde jedině když vložím do 5ti BLOBů obrázky o velikosti celkem cca 1.8 MB pak už nemůžu ukládat nic dalšího… Do pěti TEXT polí jsem uložil 5× 5800znaků v UTF-8 by to mělo být 5×5800×3 = 87kB tzn., daleko přes ten ROW limit 8kB. Tak netuším kde je problém..
- TomasHalasz
- Bronze Partner | 79
mystik napsal(a):
Jak vypadá schéma celé té tabulky? Nemáš tam nějak moc sloupců?
Sloupců jsem tam měl asi 40, z toho 5 BLOBů. A tu chybu dělaly právě ty BLOBy, když jsem do nich poslal obrázky každý cca 500kB tak to padalo.
Už jsem to vyřešil tak, že jsem na obrázky udělal novou tabulku kde je v jednom záznamu jen jeden obrázek a z původní tabulky na ně odkazuju přes jejich ID.
- mystik
- Člen | 320
TomasHalasz napsal(a):
mystik napsal(a):
Jak vypadá schéma celé té tabulky? Nemáš tam nějak moc sloupců?
Sloupců jsem tam měl asi 40, z toho 5 BLOBů. A tu chybu dělaly právě ty BLOBy, když jsem do nich poslal obrázky každý cca 500kB tak to padalo.
Už jsem to vyřešil tak, že jsem na obrázky udělal novou tabulku kde je v jednom záznamu jen jeden obrázek a z původní tabulky na ně odkazuju přes jejich ID.
To je vážně divný. Ve výchozím nastavení by BLOB měl zabírat vždycky jen pár bytes. BLOB je ze své podstaty jen pointer na data nikoli data samotná. O jakou jde verzi MySQL?
EDT: Už to vidím je to na konci té původní exception co jsi postoval v prvním příspěvku. Máš SQL nastavené tak, aby u BLOB ukládalo začátek dat v řádku.
... In current row format, BLOB prefix of 768 bytes is stored inline
Tj každý blob ti zabere až 768 bytes. Nejjednoduší by mělo být změnit v nastavení MySQL formát ukládání BLOB pokud k tomu máš přístup.
Editoval mystik (28. 5. 2014 12:17)
- TomasHalasz
- Bronze Partner | 79
mystik napsal(a):
To je vážně divný. Ve výchozím nastavení by BLOB měl zabírat vždycky jen pár bytes. BLOB je ze své podstaty jen pointer na data nikoli data samotná. O jakou jde verzi MySQL?
Dělalo mi to na locale s MySQL 5.5.32 i na hostingu savana.cz kde je taky MySQL 5.5.32
- TomasHalasz
- Bronze Partner | 79
mystik napsal(a):
... In current row format, BLOB prefix of 768 bytes is stored inline
Tj každý blob ti zabere až 768 bytes. Nejjednoduší by mělo být změnit v nastavení MySQL formát ukládání BLOB pokud k tomu máš přístup.
Aha, to bohužel na hostingu nenastavím..