Skocz do zawartości
"Idzie nowe..." - o zmianach i nie tylko ×
Przeniesienie zakupów z IPS Marketplace / Moving bought items from IPS Marketplace ×

Przerabianie bazy kodowanej w latin1 na utf8


matma4u

Rekomendowane odpowiedzi

Aby przerobić bazę z kodowania latin1 na utf8 należy:

- wykonać kopię zapasową bazy

- za pomocą edytora tekstu (lub innych narzędzi korzystając z poleceń konsoli Linuksa) należy podmienić wszystkie wpisy:

collate latin1_general_ci na collate utf8_general_ci

CHARSET=latin1 na CHARSET=utf8

COLLATE=latin1_general_ci na COLLATE=utf8_general_ci

- uruchomić plik konwerter.php

Zawartość pliku konwerter.php

    <?php
              $krzaki = array('¡', 'Æ', 'Ê', '£', 'Ñ', 'Ó', '¦', '¯', '¬', '±', 'æ', 'ê', '³', 'ñ', 'ó', '¶', '¿', '¼');
              $ogonki = array( 'Ä„', 'Ć', 'Ę', 'Å', 'Ń', 'Ó', 'Åš', 'Å»', 'Ź', 'Ä…', 'ć', 'Ä™', 'Å‚', 'Å„', 'ó', 'Å›', 'ż', 'ź');

               $file = "nowyplikbazy.sql";   
               $test = file_exists($file);
               if ($test)
                {
                echo "Skasuj plik nowyplikbazy.sql na serwerze i ponownie uruchom skrypt konwerter.php";
                }
                else
                {
               $fp = @fopen("plikbazy.sql", "r");
               if ($fp) {
                     while (!feof($fp)) {
                     $buffer = fgets($fp, 4096);
                     $buffer =  str_replace( $krzaki, $ogonki, $buffer );
                     flock($fp, 2);
                     $fp2 = fopen($file, "a");
                     fputs($fp2, $buffer); 
                     flock($fp, 3); 
                                        }
                        }
                                    fclose  ($fp);
                        fclose  ($fp2);
                        echo "Koniec konwersji";
                         }

            ?>

Objaśnienia:

plikbazy.sql - to plik bazy, który trzeba przekonwertować (musi znajdować się w tym samym katalogu co plik konwerter.php)

nowyplikbazy.sql - plik o tej nazwie zostaje automatycznie utworzony i w nim znajduję się przekonwertowana zawartość pliku plikbazy.sql

- stworzyć nową pustą bazę pamiętając o tym by była kodowana w UTF-8

- do tak przygotowanej bazy wgrać przetworzony plik bazy

- podłączyć skrypt forum pod nową bazę (zmienić wpisy dotyczące bazy danych w pliku conf_global.php)

Autorem tutoriala jest matma4u. Zabrania się kopiowania i rozpowszechniania bez zgody autora.

  • Lubię to 2

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

Powiem Ci tak, że skrypt w zasadzie można dostosować do każdego kodowania. Robisz to tak, że na oryginalnej bazie np w latin1 tworzysz temat a w treści wpisujesz tylko i wyłącznie polskie ogonki tzn: ą, ę, ć, ó Ą Ę itd (duże i małe litery). Następnie w bazie szukasz tego tematu i sprawdzasz jak te ogonki są zakodowane i wpisujesz te znaki do tablicy $krzaki.

Potem sprawdzasz np jak te same ogonki (wpisujesz w takiej samej kolejności jak w bazie latin1) ą, ę, ć, ó Ą Ę itd kodowane są np. w utf8 i wpisujesz to do tablicy $ogonki.

Robisz konwersje i po sprawie. Musisz jeszcze potem lub przed zmienić collate_ i charset.

Co do testów to tak ostatnio przerobiliśmy bazę około 30MB na utf8 i wszystko pięknie działa. Ja testowałem ten skrypt na swojej bazie około 100MB i skrypt też nie robił problemów. (z latin2 na utf 8)

  • Lubię to 1
  • Smutny 1

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

  • Manager

W tym skrypcie warto też tuż za <?php wstawić ten kod:

set_time_limit(0);

Czyli ma to wyglądać:

<?php
set_time_limit(0);
//dalsza część kodu

intermedia - profesjonalne rozwiązania Invision Power Board

---

Chcesz uzyskać szybko i sprawnie pomoc? Uzupełnij wersję i adres w profilu.

Odnośnik do komentarza
Udostępnij na innych stronach

- za pomocą edytora tekstu (lub innych narzędzi korzystając z poleceń konsoli Linuksa) należy podmienić wszystkie wpisy:

collate latin1_general_ci na collate utf8_general_ci

CHARSET=latin1 na CHARSET=utf8

COLLATE=latin1_general_ci na COLLATE=utf8_general_ci

Tego punktu nie rozumiem. Gdzie te wpisy należy podmienić?

Moje forum komputerowe ForumPC.pl korzysta z hostingu w Progreso.pl - w trakcie zamówienia serwera podaj kod FORUMPC a otrzymasz miesiąc abonamentu gratis.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 8 miesięcy temu...

Wypali również taki skrypt do przerobienia collate_ i charset.

   <?php
              $krzaki = array('collate latin1_general_ci', 'CHARSET=latin1', 'COLLATE=latin1_general_ci');
              $ogonki = array( 'collate utf8_general_ci ', 'CHARSET=utf8 ', 'COLLATE=utf8_general_ci');

               $file = "nowyplikbazy.sql";   
               $test = file_exists($file);
               if ($test)
                {
                echo "Skasuj plik nowyplikbazy.sql na serwerze i ponownie uruchom skrypt konwerter.php";
                }
                else
                {
               $fp = @fopen("plikbazy.sql", "r");
               if ($fp) {
                     while (!feof($fp)) {
                     $buffer = fgets($fp, 4096);
                     $buffer =  str_replace( $krzaki, $ogonki, $buffer );
                     flock($fp, 2);
                     $fp2 = fopen($file, "a");
                     fputs($fp2, $buffer); 
                     flock($fp, 3); 
                                        }
                        }
                                    fclose  ($fp);
                        fclose  ($fp2);
                        echo "Koniec konwersji";
                         }

            ?>

Edytowane przez Łukasz
Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 miesiące temu...

Dziś postanowiłem powrócić ponownie do tego tematu. Przemyślałem sobie dobrze sprawę i doszedłem do wniosku że cały proces można jeszcze bardziej uprościć.

<?php

               $file = "nowyplikbazy.sql";   
               $test = file_exists($file);
               if ($test)
                {
                echo "Skasuj plik nowyplikbazy.sql na serwerze i ponownie uruchom skrypt konwerter.php";
                }
                else
                {
               $fp = @fopen("plikbazy.sql", "r");
               if ($fp) {
                     while (!feof($fp)) {
                     $buffer = fgets($fp, 4096);
                     $buffer =  iconv("ISO-8859-2","UTF-8",$buffer);
                     flock($fp, 2);
                     $fp2 = fopen($file, "a");
                     fputs($fp2, $buffer); 
                     flock($fp, 3); 
                                        }
                        }
                                    fclose  ($fp);
                        fclose  ($fp2);
                        echo "Koniec konwersji";
                         }

            ?>

Całą robotę wykonuje tu polecenie php: iconv("ISO-8859-2","UTF-8",$buffer);, za pomocą którego możemy z dowolnie przekodowywać tekst.

Oczywiście przed użyciem konwertera należy wykonać wszystkie wcześniejsze kroki.

Edytowane przez matma4u

46279b204b.png

Rozwiążemy dla Ciebie każde zadanie z matematyki: http://matma4u.pl

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Chce przerobić baze w IPB 3, te skrypty co podane tutaj bedą pasować ??

I jeśli dobrze zrozumialem to najpierw skrypt Łukasza:

    <?php
              $krzaki = array('collate latin1_general_ci', 'CHARSET=latin1', 'COLLATE=latin1_general_ci');
              $ogonki = array( 'collate utf8_general_ci ', 'CHARSET=utf8 ', 'COLLATE=utf8_general_ci');

               $file = "nowyplikbazy.sql";   
               $test = file_exists($file);
               if ($test)
                {
                echo "Skasuj plik nowyplikbazy.sql na serwerze i ponownie uruchom skrypt konwerter.php";
                }
                else
                {
               $fp = @fopen("plikbazy.sql", "r");
               if ($fp) {
                     while (!feof($fp)) {
                     $buffer = fgets($fp, 4096);
                     $buffer =  str_replace( $krzaki, $ogonki, $buffer );
                     flock($fp, 2);
                     $fp2 = fopen($file, "a");
                     fputs($fp2, $buffer); 
                     flock($fp, 3); 
                                        }
                        }
                                    fclose  ($fp);
                        fclose  ($fp2);
                        echo "Koniec konwersji";
                         }

            ?>

potem matmy4u

<?php

               $file = "nowyplikbazy.sql";   
               $test = file_exists($file);
               if ($test)
                {
                echo "Skasuj plik nowyplikbazy.sql na serwerze i ponownie uruchom skrypt konwerter.php";
                }
                else
                {
               $fp = @fopen("plikbazy.sql", "r");
               if ($fp) {
                     while (!feof($fp)) {
                     $buffer = fgets($fp, 4096);
                     $buffer =  iconv("ISO-8859-2","UTF-8",$buffer);
                     flock($fp, 2);
                     $fp2 = fopen($file, "a");
                     fputs($fp2, $buffer); 
                     flock($fp, 3); 
                                        }
                        }
                                    fclose  ($fp);
                        fclose  ($fp2);
                        echo "Koniec konwersji";
                         }

            ?>

Edytowane przez XQS
Odnośnik do komentarza
Udostępnij na innych stronach

  • 5 tygodni później...

Zrobiłem konwersje. Ale pojawił sie bład.


Fatal error: Uncaught exception 'Exception' with message 'Could not initiate the registry, the settings cache is empty or missing' in /home/xqs/domains/forum.csns.pl/public_html/admin/sources/base/ipsRegistry.php:1822 Stack trace: #0 /home/xqs/domains/forum.csns.pl/public_html/admin/sources/base/ipsRegistry.php(507): ipsRegistry->setUpSettings() #1 /home/xqs/domains/forum.csns.pl/public_html/admin/sources/base/ipsController.php(77): ipsRegistry::init() #2 /home/xqs/domains/forum.csns.pl/public_html/admin/sources/base/ipsController.php(64): ipsController->init() #3 /home/xqs/domains/forum.csns.pl/public_html/admin/index.php(26): ipsController::run() #4 {main} thrown in /home/xqs/domains/forum.csns.pl/public_html/admin/sources/base/ipsRegistry.php on line 1822

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę.