Nespustí se dlouhý INSERT příkaz
Database management in a single PHP file
Brought to you by:
jakubvrana
Pokud do 'SQL přikaz' zadám dlouhý INSERT příkaz (např. data z exportu z lokální databáze - cca 20kB, většina typu TEXT), nespustí se. Nespustí se ani při odeslání přes soubor. Pokud se ho pokusím spustit s ostatními příkazy, spustí se všechny příkazy před ním, ale za ním nic (včetně onoho INSERT), nenapíše se ani žádná chyba, prostě jakoby víc příkazů neexistovalo. Pokud se pokusím odeslat samotný příkaz INSERT, dostanu okamžitě chybu prohlížeče "Připojení bylo ukončeno vzdáleným serverem".
Nedaří se mi to reprodukovat. Zkontrolujte prosím velikost konfigurační direktivy max_allowed_packet a zkuste příkaz spustit také přímo z MySQL konzole.
max_allowed_packet = 1M
Ten stejný příkaz lze bez problému spustit v MySQL konzoli i v phpMyAdmin.
V Admineru ale stále nic, ani na desátý pokus v úplně jiném prohlížeči.
Ale zjistil jsem, že tento problém přetrvává pouze u mě na lokálním serveru, na vzdáleném se příkaz normálně spustí. Nemůže jít o nějaký problém s rozdílnou verzí MySQL nebo PHP? Na lokálním serveru mám MySQL 5.1.30, kdežto na vzdáleném 5.0.51a. Na lokálním také běží PHP 5.3, na vzdáleném 5.2.10.
Jak jsem psal o tom, že se nespustí ostatní příkazy, dokonce se ani nevykreslí zbytek stránky. Jak Adminer dojde k tomu dlouhému příkazu, prostě ukončí spojení s prohlížečem a zbytek stránky už nepošle.
Zkuste prosím zjistit maximální délku příkazu, který se ještě provede. Třeba nás to někam navede.
Zjistil jsem, že nejde o délku příkazu, ale pokud se pokusím do sloupce datového typu TEXT vložit hodnotu, která je větší než 8kB přesně (8192 bytů) - např. více než 4096 znaků v UTF-8.
Špatně se chová např. tento sql soubor:
http://leteckaposta.cz/572902041
Pokud příkazy spustím pomocí nahrání souboru, provedou se příkazy do prvního INSERTU včetně, pokud příkazy do textového pole nakopíruju z notepadu, neprovede se ani ten první INSERT.
Díky za funkční ukázku, chybu jsem opravil v SVN.
Já bych řekl, že může souviset nejenom s velikostí, ale i použitím zpětného lomítka v příkazu.
V mém případě (localhost, EasyPHP 3.1) chybu neoznámí Adminer, ale Apache - a sice "Spojení přerušeno".
Je dost pravděpodobné, že to bude souviset se zpětnáým lomítkem, možná bude i chyba v mysqli. Ale i když jsem stáhl poslední verzi z SVN, moc to nepomohlo. Daný příklad prikaz.sql sice funguje, ale stačí INSERT o jedno \a prodloužit a zase mi to vrací chyby.
prikaz2.sql: http://leteckaposta.cz/125666245
Díky za důslednost. Doufám, že se to podařilo vyřešit pomocí ungreedy RE, ale na pravou příčinu problému jsem po pravdě řečeno nepřišel.
Je mi to líto, ale stále vám nemůžu dát pokoj. Je pravda, že mou uvedený prikaz2.sql už funguje. Ale stále nemůžu rozchodit i úplně triviální příkazy, např:
http://leteckaposta.cz/107435172
(obsahuje jen šestkrát sekvenci \r\n, jinak znaky x a mezeru, prostě běžná data typu TEXT)
Díky za trpělivost. Vzdal jsem to a celé jsem to předělal. Díky tomu jsem navíc objevil chybu, ke které docházelo při neuzavřeném /*.