WordPress a exporty databáze: Ä› a ÄŤ místo ě a č

Po migraci, aktualizaci nebo exportu databáze vaše příspěvky najednou ukazují Ä› místo ě a ÄŤ místo č? Data jsou skoro vždy stále na místě – jen se čtou se špatným kódováním. Mojibuster export opraví, příčinu pak odstraníte v databázi.

Funguje s textem a soubory:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Například exporty z Excelu, výpisy databází, titulky nebo kód webových stránek.

Opravit

  1. Přetáhněte soubor nebo vložte text
  2. Oprava proběhne automaticky
  3. Zkopírujte nebo stáhněte
nebo soubor jednoduše přetáhněte sem

Jak problém vypadá

Řádek z SQL dumpu po přestěhování na jiný server

Před

INSERT INTO wp_posts (post_title) VALUES ('Příliš žluťoučký kůl – nabídka na víkend');

Po

INSERT INTO wp_posts (post_title) VALUES ('Příliš žluťoučký kůl – nabídka na víkend');

Odkud se to bere

WordPress ukládá text v UTF-8. Mnoho starších instalací ale vytvořilo tabulky jako latin1 nebo se k databázi připojovalo v latin1. Dokud zápis i čtení dělají stejnou chybu, nikdo si ničeho nevšimne. Po přesunu na nový server, exportu přes phpMyAdmin nebo změně kódování spojení se každé české písmeno najednou změní na dva znaky.

  • DB_CHARSET v wp-config.php je latin1 nebo nesouhlasí s tabulkami.
  • Dump byl exportován jako latin1 a importován jako utf8mb4 – nebo naopak.
  • Plugin nebo importní skript převedl už poškozený text ještě jednou. Vzniká tak dvojitě zakódovaný text jako Ä›.

Oprava exportu

  1. Před jakoukoli změnou zazálohujte databázi.
  2. Exportujte postižené tabulky do souboru .sql, například v phpMyAdminu nebo příkazem mysqldump --default-character-set=utf8mb4.
  3. Přetáhněte soubor do pole výše. Mojibuster opraví jen poškozená místa a ukáže každou změnu.
  4. Stáhněte opravený soubor a naimportujte ho jako utf8mb4 do nové testovací databáze.
  5. Zkontrolujte web. Pokud vše vypadá správně, naimportujte data do ostré databáze.

Dump se nikdy nenahrává na server – a to je důležité, protože obvykle obsahuje uživatelské účty, e-mailové adresy a komentáře. Více pro firmy a pověřence pro ochranu osobních údajů.

Pozor na serializovaná data

WordPress ukládá část nastavení v wp_options a wp_postmeta jako serializované hodnoty PHP, například s:6:"ÄŚaj";. Číslo udává délku v bajtech. Po opravě na s:4:"Čaj"; už délka 6 nesouhlasí a WordPress takovou hodnotu zahodí. Proto nejprve opravujte tabulky s obsahem, jako wp_posts, wp_comments a wp_terms. Pro volby je lepším nástrojem wp search-replace z WP-CLI, který délky aktualizuje.

Odstranění příčiny v MySQL

  • Přepněte tabulky i spojení na utf8mb4 a nastavte define('DB_CHARSET', 'utf8mb4'); v wp-config.php.
  • Pokud sloupec latin1 obsahuje bajty UTF-8, nepřevádějte ho přímo – zakódovali byste ho podruhé. Obvyklá cesta vede přes binární typ: nejdřív MODIFY … LONGBLOB, potom MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Každou změnu nejdřív vyzkoušejte na kopii databáze.

Časté otázky

Můžu opravit celou databázi WordPressu najednou?

Ano, i velké SQL dumpy. Pozor ale na serializovaná data v wp_options a wp_postmeta – WP-CLI si s nimi poradí lépe.

Změní se správné znaky v dumpu?

Ne. Mojibuster opravuje jen řetězce, které jsou jasně poškozené. Správný text zůstává, jak je.

Jaký je rozdíl mezi utf8 a utf8mb4?

V MySQL ukládá utf8 jen znaky do tří bajtů, takže emoji se ztrácejí. utf8mb4 je skutečné UTF-8 a pro WordPress správná volba.

Funguje to i pro jiné systémy než WordPress?

Ano. Joomla, Drupal, Magento nebo vlastní aplikace nad MySQL či MariaDB mají stejný problém a stejné řešení.

Další návody