Jak opravit poškozené tabulky a zkontrolovat kódování databáze
Jak v phpMyAdmin opravit tabulku s chybou „is marked as crashed“ a jak zjistit a sjednotit kódování na utf8mb4, aby se správně zobrazovala diakritika.
4 minuty čtení 8 kroků
Obsah návodu
Poškozená tabulka se projeví chybou při načítání webu nebo chybějícími daty, špatné kódování zase rozbitou diakritikou. Obojí opravíte v phpMyAdmin bez zásahu podpory. Před každým zásahem si ale databázi exportujte podle návodu Jak exportovat databázi?, protože opravu nelze vrátit.
Příznaky poškozené tabulky
- Web zobrazuje chybu
Table './databaze/wp_options' is marked as crashed and should be repaired. - Některé stránky, příspěvky nebo komentáře náhle chybí, i když nikdo nic nemazal.
- WordPress hlásí „Chyba při navazování spojení s databází“, přestože jsou údaje ve
wp-config.phpsprávně. - Ve phpMyAdmin má tabulka ve sloupci Řádků nebo Velikost hodnotu používá se nebo chybovou hlášku.
Oprava tabulek v phpMyAdmin
- Přihlaste se do phpMyAdmin (viz Jak se přihlásit do phpMyAdmin a základní orientace) a v levém panelu klikněte na název databáze.
- V záložce Struktura zaškrtněte poškozené tabulky, nebo pod seznamem klikněte na Zaškrtnout vše.
- V rozbalovacím seznamu Zaškrtnuté: pod seznamem tabulek vyberte Zkontrolovat tabulku. Ve výsledku vidíte u každé tabulky stav;
OKznamená v pořádku. - Vraťte se, tabulky znovu zaškrtněte a vyberte Opravit tabulku.
- Nakonec stejným způsobem spusťte Optimalizovat tabulku, která tabulky zkomprimuje a přeuspořádá.
Totéž zvládnete v záložce SQL dotazy (název tabulky upravte):
CHECK TABLE wp_options;
REPAIR TABLE wp_options;
OPTIMIZE TABLE wp_options;
REPAIR TABLE funguje u tabulek typu MyISAM. Tabulky typu InnoDB se opravují samy při startu serveru; pokud u nich přetrvává chyba, obnovte je ze zálohy nebo kontaktujte podporu. Typ tabulky vidíte ve sloupci Typ v záložce Struktura.
Kódování a porovnávání
Kódování určuje, jak databáze ukládá znaky, porovnávání (collation) pak, jak je řadí a porovnává. Doporučené nastavení pro české weby je kódování utf8mb4 a porovnávání utf8mb4_unicode_ci. Zvládne diakritiku, emoji i speciální znaky. Rozbitá diakritika (například ž místo ž nebo otazníky místo písmen) vzniká, když se liší kódování tabulky, spojení a aplikace.
Jak zjistit aktuální kódování
- V levém panelu klikněte na název databáze a otevřete záložku Struktura.
- Ve sloupci Porovnávání vidíte porovnávání každé tabulky. Pod seznamem se zobrazuje i výchozí porovnávání databáze.
- Kliknutím na tabulku a záložku Struktura zjistíte porovnávání jednotlivých textových sloupců.
Jak změnit kódování tabulky
V záložce SQL spusťte pro každou tabulku:
ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Příkaz převede tabulku i všechny její textové sloupce. Výchozí porovnávání celé databáze pro nově vytvářené tabulky změníte v záložce Operace u databáze v části Porovnávání. Alternativně můžete v záložce Operace u tabulky změnit porovnávání a zaškrtnout Změnit porovnávání všech sloupců.
Nastavení v aplikaci
Aplikace musí s databází komunikovat ve stejném kódování. U WordPressu ve wp-config.php zkontrolujte řádky:
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
U vlastního kódu nastavte kódování hned po připojení, například mysqli_set_charset($spojeni, 'utf8mb4'); nebo v PDO parametrem charset=utf8mb4 v připojovacím řetězci.
Převod kódování neopraví data, která už jsou uložená špatně. Pokud se diakritika rozbila při importu, je spolehlivější databázi znovu naimportovat ze správně zakódovaného souboru (viz Jak naimportovat databázi?) a v importu zvolit kódování souboru utf-8.
Řešení problémů
- Oprava skončila chybou nebo se tabulka poškozuje opakovaně. Obnovte tabulku ze zálohy a kontaktujte podporu na podpora@datahost.cz.
- Diakritika je rozbitá jen u starých záznamů. Data byla uložena v jiném kódování; nové záznamy jsou v pořádku. Řešením je export, převod souboru a nový import.
- ALTER TABLE hlásí příliš dlouhý index. Zkraťte délku indexovaného sloupce, u
utf8mb4jsou znaky delší než uutf8.