Skocz do zawartości


Zdjęcie

Konwersja bazy danych ISO na UTF-8 i odwrotnie


  • Zaloguj się, aby dodać odpowiedź
3 odpowiedzi w tym temacie

#1 makensis

makensis

    Naczelny

  • 5 036 postów

Napisano 19 04 2012 - 20:14

Przedstawiam sposób na konwersję bazy danych w zależności od wielkości bazy danych:


mała baza danych < 50 MB

W tym wypadku wystarczy nam:
  • dostęp do phpMyAdmin
  • gżegżółka
  • Notepad++
Kroki:
  • Zapisujemy bazę danych na dysk twardy poprzez panel phpMyAdmin, pamiętamy aby w opcjach eksportu ustawić prawidłowe kodowanie pliku(latin2 to jest inaczej ISO-88859-2)
  • Uruchamiamy gżegżółkę i w opcjach programu wybieramy kodowanie pliku oraz kodowanie docelowe pliku
  • Uruchamiamy Notepad++ klikamy Ctrl+H i zamieniamy: CHARSET=latin2 na CHARSET=utf-8 czy inne kodowanie jakie mamy mieć docelowo w bazie danych
  • Zapisujemy zmiany i wrcaamy do panelu phpMyAdmin, tworzymy nową bazę danych o kodowaniu takim jak skonwertowany plik z kopią bazy.
  • Wchodzimy do nowoutworzonej bazy danych i wybieramy zakładkę: Importuj. Oprócz nazwy pliku podajemy kodowanie pliku, na takie jakie ustaliliśmy podczas konwersji
  • Podłączamy bazę danych do pliku konfugracyjnego naszego forum czy portalu, którego dokonaliśmy konwersji. Niektóre z CMSów korzystają z cachowania, które trzeba koniecznie opróżnić po konwersji. W przypadku forum IPB opis znajdziesz na końcu poradnika.
  • Jeśli w efekcie widzimy, że część zawartości wyświetla się poprawnie, a część nie może to oznaczać, że mieliśmy różne kodowanie znaków wewnątrz tabeli. Wtedy pozostaje nam wrócić do kopii zapasowej pliku bazy danych wykonanej przez gżegżółkę i ręcznie zamienić wszystkie znaki programem Notepad++. Ręcznie oznacza - ustawienie kodowania pliku w Notepad++ na takie jakie powinno być docelowe i metodą Ctrl+H "kod-znaku-litera" docelowy znak - zamienić wszystkie niepasujace do reszty znaki specjalne.
Średnia baza danych < 250 MB

Jeśli mamy dostęp do shell to wykonujemy kroki jak przy dużej bazie danych w przeciwnym wypadku jak do małej z tą różnicą, że porcjujemy zawartość bazy na więcej niż jeden plik, tak aby nie przekroczyć limitów nałożonych przez hostingodawcę.

Duża baza danych > 250 MB

W tym wypadku potrzebne będą:
  • dostęp do phpMyAdmin
  • dostęp do shell np. przez Putty
  • EditPad Lite
Kroki:
  • Logujemy się do serwera np. programem Putty
  • Zrzucamy bazę danych na serwer(trzeba zadbać o odpowiednią ilość wolnego miejsca) komendą: mysqldump -uuser -ppassword nazwa_bazy_danych > dump.sql
    przy czym -uuser to nie błąd -u[nazwa_uzytkownika]
  • Zmieniamy kodowanie tabel na docelowe komendą: perl -pi -w -e 's/CHARSET=latin2/CHARSET=utf8/g;' dump.sql
  • Konwertujemy znaki w locie poleceniem: iconv -f iso-8859-2 -t UTF-8 dump.sql > dump-utf8.sql
  • Wczytujemy plik do uprzednio stworzonej bazy danych o kodowaniu = tym po konwersji, komenda: mysql --default-character-set=utf8 -uuser -ppassword nowa_baza_danych < dump-utf8.sql
  • Jeśli wystąpią błędy w trakcie wczytywania jak np. brak inkrementacji to pozostaje nam je naprawić, albo wyczyścić niefrasobliwą tabelę z rekordów poleceniem z TRUNCATE tabela_z_problemami . Polecenie te wywołujemy np. z poziomu phpMyAdmin
  • Podłączamy bazę danych do pliku konfugracyjnego naszego forum czy portalu, którego dokonaliśmy konwersji. Niektóre z CMSów korzystają z cachowania, które trzeba koniecznie opróżnić po konwersji. W przypadku forum IPB opis znajdziesz na końcu poradnika.
  • W razie problemów z kodowaniem wewnątrz bazy danych czeka nas długa droga do sukcesu. W tym wypadku przyda się EditPad Lite, który radzi sobie z odczytem plików o wielkości nawet kilkunastu gigabajtów. Nie pobiera zbyt wiele pamięci. Ręcznie ustawienie kodowania pliku w EditPad na takie jakie powinno być docelowe i następnie metodą Ctrl+H "kod-znaku-litera" docelowy znak - zamienić wszystkie niepasujace do reszty znaki specjalne.

Konwersja forum IPB z ISO-8859-2 na UTF-8:
  • Najszybciej wykonujemy konwersję metodą dla dużych baz danych.
  • Po konwersji powinniśmy otrzymać komunikat: FATAL ERROR Your settings could not be read by IP.Board. This is a fatal error and IP.Board cannot function while this issue persists. W tym wypadku ściągamy paczkę forum z IPS-u i wypakujemy zawartość folderu /Tools.
  • Wrzucamy na serwer do /admin folder /upgradeFinish
  • W przeglądarce wpisujemy adres www naszego forum z końcówką: /admin/upgradeFinish pojawi nam się instalator IPB, który przebuduje zawartość cache forum
  • Wchodzimy do panelu ACP i ustawiamy w zakładce System -> Ustawienia -> Server Enviroment kodowanie na takie jakiego dotyczyła konwersja.


  • 0

#2 Macsch15

Macsch15

    Profesjonalista

  • 3 705 postów

Napisano 28 07 2013 - 13:53

Do zmiany kodowania z UTF-8 można też użyć tego: http://community.invisionpower.com/files/file/2929-character-set-converter/



  • 0

#3 makensis

makensis

    Naczelny

  • 5 036 postów

Napisano 28 07 2013 - 16:50

A jak to chodzi w praktyce? Wiadomo, że wszystko robione przez skrypt ma określony czas wykonywania.


  • 0

#4 Macsch15

Macsch15

    Profesjonalista

  • 3 705 postów

Napisano 13 12 2013 - 16:57

Ok powstał kolejny: http://community.invisionpower.com/files/file/6823-ips-utf8-database-converter-beta/

Może być uruchamiany poprzez CLI więc problem ograniczonego czasu wykonywania znika.



  • 0

Zobacz więcej tematów z tagiem: IPB CMS vBulletin IP.Board



Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych