Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana Kodowania Bazy
Forum PHP.pl > Forum > Bazy danych > MySQL
alkesz1718
Witam,
Mam do was pytanie odniśnie tego w jaki sposób całkowicie i bezpiecznie zmienić kodowanie bazy danych wraz z polskimi znakami z kodowania iso-8859-2 (latin2) na utf-8 gdzie baza jest na prawdę bardzo duża (liczona w GB)

Do tej pory robiłem to w ten sposób:
1. Pobierałem całość bazy lub pojedyncze tabele (w zależności od pojemności bazy) (kodowanie iso-8859-2)
2. Za pomocą programu notepad++:
- edytowałem te pliki,
- zmieniałem kodowanie na iso (by były wszystkie polskie znaki)
- kopiowałem całość,
- zmieniałem kodowanie pliku na utf-8
- całość podmieniałem za to co miałem skopiowane (czasem robiły się krzaki po konwertacji)
- Zmieniałem w pliku linijki gdzie było napisane kodowanie latin2 na utf8
3. Po zapisaniu zmian wgrywam z powrotem tabele lub całość bazy już z kodowaniem utf-8

Ogólnie to przy małych bazach danych ten sposób problemów nie ma bo jakoś zawsze udawało mi się przekonwertować z polskimi znakami lecz jak przychodzi mi konwertować duże bazy danych gdzie liczy się nie kb a MB/GB to dosyć często pojawiają się "krzaczki" lub polskie znaki zmieniają się na znaki zapytania.

Ogólnie to nie jestem zbyt zaawansowany z bazami danych i możliwe że mój sposób jest błędy dlatego pytam się was czy macie lepsze metody na to.
trzczy
Spróbuj tak w terminalu linuksa, ale zbackupuj wszytko najpierw, bo nie mam pewności:
  1. mysqldump -uroot -pmypass --default-character-set=latin2 --skip-set-charset mydatabase > dump.sql
  2. iconv -f iso-8859-2 -t utf-8 dump.sql > dump2.sql
  3. sed -i 's/latin2/utf8/g' dump2.sql
  4. mysql -u root -pmypass -e "DROP DATABASE mydatabase"
  5. mysql -u root -pmypass -e "CREATE DATABASE mydatabase CHARACTER SET utf8 COLLATE utf8_general_ci;
  6. GRANT ALL PRIVILEGES ON mydatabase.* TO mydatabase@localhost IDENTIFIED BY 'mypass2'"
  7. mysql -u root -pmypass --default-character-set=utf8 mydatabase < dump2.sql

Założenia:
hasło roota mypass
Tworzony jest user mydatabase.
hasło usera mydatabase mypass2
nazwa bazy danych mydatabase

Sprawdź, czy działa iconv wcześniej.

edit
1. linia kodu
alkesz1718
Hmmm jak w terminalu linuksa to bym musiał mieć dostęp do całego serwera... a ja sobie tego nie będę robił lecz komuś gdzie dostęp będę miał tylko do phpmyadmin i ftp
trzczy
W sumie wszystko można zrobić poza linuksem, oprócz tego:
  1. iconv -f iso-8859-2 -t utf-8 dump.sql > dump2.sql

Znaczy się, to też można, ale trzeba poszukać odpowiednika iconv dla windows.

mysqldump niby wersja na windows jest... Wyślij mi dump tej bazy danych na priv.
Crozin
Jedna mała acz bardzo, bardzo istotna uwaga. W MySQL kodowanie UTF8 to utf8mb4, nie utf8 - o tym ostatnim należałoby właściwie zapomnieć. smile.gif
alkesz1718
Cytat(Crozin @ 30.01.2018, 07:08:52 ) *
W MySQL kodowanie UTF8 to utf8mb4, nie utf8 - o tym ostatnim należałoby właściwie zapomnieć. smile.gif


Ale to i tak niezbyt dużo mi pomoże skoro wychodzą krzaki. Ta strona działała i nadal działa na bardzo starym silniku (oprogramowaniu) oraz php 5.3 Teraz właściciel tego serwisu zgłosił się do mnie bym zrobił mu aktualizację strony i zmienić kodowanie iso na utf8 i nie chcę tak dużej strony po prostu rozwalić. Ograniczony mam dostęp do zasobów bo tylko FTP i phpmyadmin i nawet jakbym miał wykonać te komendy wyżej podane to musiałbym się jakoś połączyć z linuksem a tego nie potrafię
Pyton_000
Jedna z dróg jaka Ci chyba pozostaje to zgrac cały dump bazy, pozmieniać kodowanie w całym pliku i wgrać.

Dla ułatwienia warto wgrywać plik mniejszymi partiami żeby nie zabić bazy.
Ważna uwaga to żeby w instrukcjach SQL zawrzeć "DROP IF EXEIST;" i "CREATE DATABASE" dzięki tem nie będzie większych problemów.

Inna to zrobienie dumpu, przekonwertowanie i wgranie jako nowa baza a potem tylko zmiana nazwy w pliku config aplikacji.

Jeszcze inna to np: https://github.com/nicjansma/mysql-convert-latin1-to-utf8

Jest miliard sposobów smile.gif
trzczy
Jeśli idzie o zapamiętywanie emoji lub w ogóle różnych ikonek w tekstach w bazie danych, to trzeba zrobić tak, jak napisał Crozin. W zaistniałej sytuacji poprawiłem kod:

  1. mysqldump -u root -prootpass --default-character-set=latin2 --skip-set-charset charsetgame > dump.sql
  2. iconv -f iso-8859-2 -t utf-8 dump.sql > dump2.sql
  3. sed -i 's/latin2/utf8mb4/g' dump2.sql
  4. mysql -u root -prootpass -e "
  5. DROP DATABASE mydatabase
  6. CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  7. GRANT ALL PRIVILEGES ON mydatabase.* TO mydatabase@localhost IDENTIFIED BY 'mypass'"
  8. mysql -u root -prootpass --default-character-set=utf8mb4 mydatabase < dump2.sql


Założenia:
hasło roota rootpass
nazwa bazy danych mydatabase
Tworzony jest user mydatabase z prawami do bazy danych mydatabase.
hasło usera mydatabase mypass

Uwaga: Nie należy wklejać kodu mechanicznie, tylko trzeba dostosować do własnej konfiguracji. Zaleca się wcześniejsze wykonanie backupu.
alkesz1718
Cóż zapiszę sobie wasze propozycje bo przydadzą się w przyszłości biggrin.gif
Ostatecznie skorzystałem z mojego sposoby gdyż po konwertacji "krzaczków" dużo nie było jedynie gdzieś tam unicode ale to masowo udało się pozmieniać tak że jak pojawią się gdzieś tam literówki to będzie ich tak mało że nikt nie zauważy a nawet jeśli to właściciel portalu sobie poradzi.
sazian
Jakiś czas temu robiłem taką operację i nie trzeba nic pobierać oraz konwertować...
Wystarczyło zmienić kodowanie bazy, tabel i kolumn. Mysql sam przekonwertował znaki.

W moim przypadku była to zmiana na utf8_polish_ci i wyglądało to tak
  1. ALTER TABLE `tabela` DEFAULT CHARACTER SET utf8 COLLATE utf8_polish_ci;
  2. ALTER TABLE `tabela` CHANGE `kolumna` `kolumna` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL;

I tak z każdą tabela/kolumną.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.