Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmiana Kodowania Bazy
alkesz1718
post 29.01.2018, 18:55:38
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trzczy
post 30.01.2018, 05:44:56
Post #2





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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

Ten post edytował trzczy 30.01.2018, 06:03:27
Go to the top of the page
+Quote Post
alkesz1718
post 30.01.2018, 05:49:29
Post #3





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trzczy
post 30.01.2018, 05:55:46
Post #4





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trzczy 30.01.2018, 06:02:00
Go to the top of the page
+Quote Post
Crozin
post 30.01.2018, 07:08:52
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
alkesz1718
post 30.01.2018, 16:40:29
Post #6





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

Ostrzeżenie: (0%)
-----


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ę
Go to the top of the page
+Quote Post
Pyton_000
post 30.01.2018, 16:57:19
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
trzczy
post 31.01.2018, 01:03:28
Post #8





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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.

Ten post edytował trzczy 31.01.2018, 01:06:47
Go to the top of the page
+Quote Post
alkesz1718
post 31.01.2018, 22:29:05
Post #9





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
sazian
post 2.02.2018, 19:52:15
Post #10





Grupa: Zarejestrowani
Postów: 1 043
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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ą.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.04.2024 - 23:49