WordPress i eksporty bazy: Ĺ‚ i Ä… zamiast ł i ą

Po migracji, aktualizacji lub eksporcie bazy wpisy nagle pokazują Ĺ‚ zamiast ł i Ä… zamiast ą? Dane prawie zawsze nadal tam są – tylko są czytane w złym kodowaniu. Mojibuster naprawia eksport, a przyczynę usuwasz potem w bazie.

Działa z tekstem i plikami:

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

Na przykład eksporty z Excela, zrzuty baz danych, napisy do filmów lub kod stron.

Napraw

  1. Przeciągnij plik lub wklej tekst
  2. Naprawa następuje automatycznie
  3. Skopiuj lub pobierz
albo po prostu przeciągnij plik tutaj

Jak wygląda problem

Linia ze zrzutu SQL po przeprowadzce na inny serwer

Przed

INSERT INTO wp_posts (post_title) VALUES ('Zażółć gęślą jaźń – menu na wynos');

Po

INSERT INTO wp_posts (post_title) VALUES ('Zażółć gęślą jaźń – menu na wynos');

Skąd się to bierze

WordPress zapisuje tekst w UTF-8. Wiele starszych instalacji tworzyło jednak tabele jako latin1 albo łączyło się z bazą w latin1. Dopóki zapis i odczyt popełniają ten sam błąd, nikt tego nie zauważa. Po przeniesieniu na nowy serwer, eksporcie w phpMyAdmin albo zmianie kodowania połączenia każda polska litera nagle zamienia się w dwa znaki.

  • DB_CHARSET w wp-config.php to latin1 albo nie zgadza się z tabelami.
  • Zrzut wyeksportowano jako latin1, a zaimportowano jako utf8mb4 – albo odwrotnie.
  • Wtyczka lub skrypt importujący przekonwertował już zepsuty tekst jeszcze raz. Powstaje wtedy podwójnie zakodowany tekst, np. Ĺ‚.

Naprawa eksportu

  1. Zrób kopię zapasową bazy, zanim cokolwiek zmienisz.
  2. Wyeksportuj dotknięte tabele do pliku .sql, np. w phpMyAdmin albo poleceniem mysqldump --default-character-set=utf8mb4.
  3. Upuść plik w polu powyżej. Mojibuster naprawia tylko zepsute miejsca i pokazuje każdą zmianę.
  4. Pobierz naprawiony plik i zaimportuj go w utf8mb4 do świeżej bazy testowej.
  5. Sprawdź stronę. Jeśli wszystko wygląda dobrze, zaimportuj dane do bazy produkcyjnej.

Zrzut nigdy nie jest wysyłany na serwer – a to ważne, bo zwykle zawiera konta użytkowników, adresy e-mail i komentarze. Więcej na ten temat dla firm i inspektorów ochrony danych.

Uwaga na dane serializowane

WordPress przechowuje część ustawień w wp_options i wp_postmeta jako serializowane wartości PHP, np. s:9:"KrakĂłw";. Liczba oznacza długość w bajtach. Po naprawie na s:7:"Kraków"; długość 9 już się nie zgadza, a WordPress odrzuca taką wartość. Dlatego najpierw naprawiaj tabele z treścią, takie jak wp_posts, wp_comments i wp_terms. Dla opcji lepszym narzędziem jest wp search-replace z WP-CLI, które aktualizuje długości.

Usuń przyczynę w MySQL

  • Przełącz tabele i połączenie na utf8mb4 i ustaw define('DB_CHARSET', 'utf8mb4'); w wp-config.php.
  • Jeśli kolumna latin1 zawiera bajty UTF-8, nie konwertuj jej bezpośrednio – zakodowałbyś ją po raz drugi. Zwykła droga prowadzi przez typ binarny: najpierw MODIFY … LONGBLOB, potem MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Każdą zmianę najpierw przetestuj na kopii bazy.

Najczęstsze pytania

Czy mogę naprawić całą bazę WordPressa naraz?

Tak, także duże zrzuty SQL. Uważaj jednak na dane serializowane w wp_options i wp_postmeta – WP-CLI radzi sobie z nimi lepiej.

Czy poprawne znaki w zrzucie zostaną zmienione?

Nie. Mojibuster naprawia tylko ciągi, które wyraźnie są zepsute. Poprawny tekst zostaje bez zmian.

Czym różni się utf8 od utf8mb4?

W MySQL utf8 zapisuje tylko znaki do trzech bajtów, więc emoji giną. utf8mb4 to prawdziwy UTF-8 i właściwy wybór dla WordPressa.

Czy to działa także w innych systemach niż WordPress?

Tak. Joomla, Drupal, Magento czy własna aplikacja na MySQL lub MariaDB mają ten sam problem i to samo rozwiązanie.

Więcej poradników