Jak zmienić zestawianie wszystkich wierszy z latin1 szwedzkiego ci na utf8 unicode Ci?
Nieświadomie używałem domyślnego kodowania znaków latin1_swedish_ci dla wszystkich wierszy varchar w mojej bazie danych podczas tworzenia i ustaliłem, że jest to główny problem z kodowaniem znaków, który miałem. Poza tym wydaje się, że większość ludzi w dzisiejszych czasach zaleca użycie 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 tylko tak Wiem jak to zrobić jest to zmiana wiersz po wierszu w phpMyAdmin, co jest naprawdę czasochłonne.
Czy istnieje szybszy sposób, taki jak zapytanie, które można uruchomić, które zmienia zestawianie wszystkich wierszy varchar / text z latin1_swedish_ci na utf8_unicode_ci?
2 answers
Jeśli kolumny używają domyślnego zestawu znaków tabeli, to konwertuje się tylko jedno zapytanie na tabelę:
ALTER TABLE t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Jeśli zestaw znaków jest ustawiany indywidualnie na każdej kolumnie, AFAIK nie ma sposobu, aby to zrobić na wszystkich kolumnach wszystkich tabel w bazie danych bezpośrednio w MySql, ale można napisać mały program w wybranym języku, który to robi.
Twój program zapyta o INFORMATION_SCHEMA.COLUMNS
tabela i spójrz na kolumnę CHARACTER_SET_NAME
:
SELECT * FROM `INFORMATION_SCHEMA.COLUMNS`
WHERE TABLE_SCHEMA = 'dbname' AND CHARACTER_SET_NAME = 'latin1'
Dla każdego wiersza wyniku jest to trywialne, aby zsyntetyzować i wykonać ALTER TABLE
zapytanie w miejscu, które odpowiednio zmienia zestaw znaków i zestawianie:
ALTER TABLE t MODIFY col TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
W powyższym zapytaniu t
, col
i TEXT
byłyby wartościami TABLE_NAME
, COLUMN_NAME
i DATA_TYPE
Kolumny z zestawu wyników INFORMATION_SCHEMA.COLUMNS
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 09:36:51
Możesz to zrobić wewnątrz MySQL, używając procedury.
Na podstawie https://stackoverflow.com/a/12718767/1612273 . używa bieżącej bazy danych, więc upewnij się, że robisz to na właściwym!
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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:15