2013-08-26 8 views
16

Nieświadomie użyłem domyślnego kodowania znaków latin1_swedish_ci dla wszystkich wierszy varchar w mojej bazie danych podczas programowania i stwierdziłem, że jest to podstawa problemów z kodowaniem znaków, które miałem. Poza tym wydaje się, że większość osób zaleca używanie utf8_unicode_ci.Jak zmienić sortowanie wszystkich wierszy z latin1_swedish_ci na utf8_unicode_ci?

Chciałbym przekonwertować kodowanie znaków dla wszystkich wierszy w mojej bazie danych z latin1_swedish_ci na utf8_unicode_ci, ale jedyny sposób, jaki wiem, jak to zrobić to zmienić wiersz po rzędzie w phpMyAdmin, co jest naprawdę czasochłonne .

Czy istnieje szybszy sposób, taki jak zapytanie, które można uruchomić, które zmienia sortowanie wszystkich wierszy varchar/text z latin1_swedish_ci na utf8_unicode_ci?

Odpowiedz

35

Jeśli kolumny są za pomocą znaku domyślny tabeli zamieszczonej to tylko jedno zapytanie na stole do konwersji:

ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Jeżeli zestaw znaków ustalany jest indywidualnie na każdej kolumny, AFAIK nie ma sposobu, aby to zrobić na wszystkich kolumnach wszystkich tabel w bazie danych bezpośrednio w MySql, ale możesz napisać mały program w wybranym języku, który to robi.

Twój program będzie kwerendy tabeli INFORMATION_SCHEMA.COLUMNS i spojrzeć na kolumnę CHARACTER_SET_NAME:

SELECT * FROM `INFORMATION_SCHEMA.COLUMNS` 
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1' 

dla każdego wyniku row to trywialne do syntezy i wykonać ALTER TABLE zapytanie na miejscu, które zmieniają zestaw znaków i sortowania odpowiednio:

ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

W powyższym zapytania t, col i TEXT byłby wartości TABLE_NAMECOLUMN_NAME i DATA_TYPE kolumn z zestawu wyników.

+0

Dziękujemy! to działało świetnie i zaoszczędziło mi ogromną ilość czasu! – Nate

+0

Dobra odpowiedź. O ile mi wiadomo, 'utf8_unicode_ci' powinien być użyty zamiast' utf8_general_ci', ponieważ 'utf8_unicode_ci' jest dokładniejszy. Dlatego zaleca się użycie 'utf8_unicode_ci'. http://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci –

+0

@Sudarshan_SMD masz rację, nie wiesz, dlaczego użyłem generała zamiast unicode, szczególnie biorąc pod uwagę, że pytanie jest ogólne, a teraz było już za długo. Dzięki za złapanie! – Jon

9

Możesz to zrobić wewnątrz MySQL, używając procedury.

Na podstawie https://stackoverflow.com/a/12718767/1612273. Korzysta z bieżącej bazy danych, więc upewnij się, że robisz to na właściwej!

delimiter // 

DROP PROCEDURE IF EXISTS convert_database_to_utf8 // 

CREATE PROCEDURE convert_database_to_utf8() 
BEGIN 
    DECLARE table_name VARCHAR(255); 
    DECLARE done INT DEFAULT FALSE; 

    DECLARE cur CURSOR FOR 
     SELECT t.table_name FROM information_schema.tables t WHERE t.table_schema = DATABASE() AND t.table_type='BASE TABLE'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 
     tables_loop: LOOP 
      FETCH cur INTO table_name; 

      IF done THEN 
       LEAVE tables_loop; 
      END IF; 

      SET @sql = CONCAT("ALTER TABLE ", table_name, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci"); 
      PREPARE stmt FROM @sql; 
      EXECUTE stmt; 
      DROP PREPARE stmt; 
     END LOOP; 
    CLOSE cur; 
END // 

delimiter ; 
call convert_database_to_utf8(); 
Powiązane problemy