Od razu ostrzegam: nie jest łatwo. Nie jest łatwo, jeżeli założyłeś bloga w oparciu o wersję silnika starszą niż 2.2. Problem polega na tym, że w poprzednich odsłonach WordPress zakładał swoje tabele w oparciu o kodowanie zapożyczane wprost z bazy danych. MySQL używa standardowo kodowania latin1, dlatego też większość baz wordpressowych wygląda tak: kodowanie tabeli – latin1 (w polskich bazach – latin2), tekst w polach – niby UTF-8. „Niby”, bo aplikacja koduje to sobie przy użyciu funkcji utf_encode() i utf_decode(), co dodatkowo pogarsza sprawę, bo „zamyka” UTF8 wewnątrz ISO8859-1. Przy próbie zgrania tego via phpMyAdmin dostajemy sieczkę zamiast polskich znaków.
Różni ludzie różne na tą przypadłość proponowali rady. Temat jest znany od dawna, można go podobno łatwo rozwiązać, za pomocą skryptu PHP lub nawet wtyczki typu „fire-and-forget”. Piszę „podobno”, bo u mnie to nie zadziałało.
Jest jednak łatwy sposób na obejście problemu. Sposób jest łatwy, pod jednym warunkiem: wasz provider musi sporządzać automatyczne kopie bezpieczeństwa bazy danych (opróczy tych „na żądanie”).
Taka funkcjonalność jest dostępna użytkownikom systemu cPanelX, chyba najpopularniejszego wśród firm hostingowych. Różnica między kopią robioną „od ręki” (dzięki phpMyAdmin) a tą automatyczną, dzienną, jest taka, że ta druga korzysta z programu mysqldump a nie z PHP. Nie wiem szczerze powiedziawszy, czy tak się po prostu złożyło że „mój” (livenetowy) mysqldump był uruchamiany z opcją –default-character-set utf8, czy też jest na tyle sprytny, że potrafi rozpoznać UTF-8 „zawinięte” w ISO8859-1, ale sprezentował mi to, o co od początku chodziło – wynikowy plik SQL z poprawnym kodowaniem wewnątrz.
Skąd go zatem wziąć? Po zalogowaniu do panelu zaglądamy do opcji „Kopie zapasowe” i klikając na odpowiednią bazę pobieramy spakowany gzipem plik. Na docelowym serwerze na czysto instalujemy WordPressa (ważne, dzięki temu będziemy mieli od razu tabele z kodowaniem UTF-8) po czym kopiujemy wtyczki, tematy i co tam jeszcze mamy na starej lokacji.
Czas przenieść bazę, ale nie tak od razu. Musimy zrobić przynajmniej dwie rzeczy – zaktualizować wszystkie odnośniki oraz odpowiednie opcje „zaszyte” wewnątrz a także zmienić kodowanie tabel na utf8. Użytkownicy Linuksa powinni to zadanie polecić sed-owi (na marginesie: podczas przenosin miałem okazję przysiąść do tego edytora i powiem jedno – potęga!). Ja to zrobiłem tak:
sed -e 's/http:\/\/byte.livenet.pl/http:\/\/bytowisko.pl/g' foo.sql > foofoo.sql
sed -e 's/DEFAULT CHARSET=latin2/DEFAULT CHARSET=utf8/g' foofoo.sql > foofoofoo.sql
Przy takich okazjach procentuje nawyk używania względnych ścieżek przy wstawianiu grafiki. Ja się klepnąłem w czoło gdzieś po roku prowadzenia blogusia, więc musiałem dodatkowo rzucić zaklęciem:
sed -e 's/img src=\"http:\/\/byte.livenet.pl\/grafika/img src=\"grafika/g' foofoofoo.sql > final.sql
Nie polecam otwierania pliku w zwykłym edytorze, chyba że jest (ten plik, nie edytor) naprawdę niewielki. Dump generuje zrzut o bardzo, naprawdę bardzo długich liniach, co z miejsca mordowało każdy program, który próbował to odczytać. sed prześlizgnął się po moich sześciu megabajtach w dwie, może trzy sekundy. Szczęka mi opadła i została w tym położeniu czas jakiś.
OK, skoro mamy już odpowiednio spreparowany plik SQL, to czas nakarmić nim nową bazę. Najpierw proponuję spakować go gzipem, bo mało kto zapewne ma synchronicznego DSL-a pod ręką. Takim archiwum częstujemy phpMyAdmin-a albo, jeżeli mamy zdalną konsolę, wykonujemy:
mysql -u uzyszkodnik -p nazwa_bazy < final.sql
Koniec manewrów. Można się logować na nowy adres i wszystko jest tak, jak na adresie starym. Przynajmniej powinny być, o ile pamiętaliśmy o przekopiwaniu wszystkich plików. Baza w każdym razie jest idealną kopią oryginału, w dodatku od tej pory całkowicie przenośną, bo opartą w pełni na UTF-8.
Mam nadzieję, że pomogłem.

bycik, weź no znajdź jakiś przepis na przewalenie bazy sqlite w utf. ja nic kompletnie z tych bazodanowych zabaw nie jarzę i takie krok po kroku byłoby dla mnie pięknym rozwiązaniem.
no weź, tak cię proooooszę :)
27.6.2007 @ 16:41 #miałem podobne problemy kiedyś: urzenia.net/206/test-utf-eaeno-eaeno
27.6.2007 @ 17:32 #Skrypt ciągle leży, ale obawiam się że już teraz się co nieco zdezaktualizował :)
Zawodowo grzebię się w tych bazach danych i powiem Wam, że nic mnie już nie zdziwi. W pracy mamy 4.0 a prawie wszędzie jest 4.1 i 5.x. Nie musze mówić ile problemów jest przy przenoszeniu baz w obie strony. W ruch idzie sed, iconv, „Gżegżółka”. Sam miód…
BTW, w przypadku baz 4.1 i wyżej niesamowicie sytuację ratuje dopisanie do dumpa na początku polecenia: „SET NAMES latin2″ (lub utf8 wedle uznania). Po trzech godzinach widzenia „znaków zapytania” w bazie potrafi człowieka oświecić. :)
27.6.2007 @ 18:27 #CoSTa:
Wiesz, ja w SQLite nigdy nie robiłem. Musiałbym mieć przedmiotową bazę u siebie, obejrzeć ją i tak dalej… Chcesz, to wysyłaj :)
27.6.2007 @ 20:58 #Edytor wbudowany w mc świetnie radzi sobie z długimi liniami i replace (tak apropo moich przenosin ;)
27.6.2007 @ 22:13 #A używanie względnych ścieżek do grafik w przypadku przenosin procentuje, ale nie przy rss/atomach? Zobacz jak Garfield wygląda w czytniku ;)
Wallace:
Fakt, zapomniałem… Od dziś wstawiam jak w książkach pisali.
27.6.2007 @ 22:25 #A jak się komuś nie chce bawić w takie tricki to wystarczy zakomentować w wp-config.php dwie linijki:
#define(‚DB_CHARSET’, ‚utf8′);
#define(‚DB_COLLATE’, ”);
i WordPress działa sobie jak dawniej na bazie latin1 :)
28.6.2007 @ 09:49 #[...] przenoszenie to było jedno wielkie piekło, super przygotowany opis Byta nie sprawił że pl-literki się przeniosły, i po dwóch dniach walki osiągnąłem to, że notki [...]
26.7.2007 @ 09:05 #