Как изменить таблицу MySQL на UTF-8? - PullRequest
24 голосов
/ 25 мая 2010

Я знаю, что есть много настроек языка для таблицы и базы данных.

Я уже создал базу данных. Я полагаю, что когда я его создал, это был default / LATIN. Я хочу изменить все - я имею в виду ... и таблицу, и базу данных, на UTF-8 .

Как я могу это сделать? спасибо.

Ответы [ 5 ]

51 голосов
/ 18 сентября 2014
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8;
4 голосов
/ 25 мая 2010

Ответ aioobe говорит, как изменить набор символов базы данных, таблицы или столбца. Вы должны иметь в виду, что

  • установка набора символов для таблицы просто указывает набор символов по умолчанию для новых столбцов в этой таблице. Это не меняет набор символов для уже существующих столбцов; Вы должны сделать эти столбцы по отдельности, ИЛИ, если вы хотите изменить каждый столбец строкового типа в таблице на тот же набор символов, есть команда, которую вы можете использовать для этого: «изменить таблицу ... преобразовать в набор символов» ( http://dev.mysql.com/doc/refman/5.1/en/alter-table.html)

  • если у вас уже есть данные, которые неправильно закодированы в столбце, то использование «alter table ... modify» для изменения столбца не решит проблему. Например, если вы сохраняете данные UTF-8 в столбце Latin1 и изменяете набор символов непосредственно с Latin1 на UTF-8, впоследствии он все равно будет неправильно закодирован. Это можно обойти путем преобразования из Latin-1 в UTF-8 через двоичный файл.

4 голосов
/ 25 мая 2010

Посмотрите на Использование команды alter для изменения набора символов .

Еще одна полезная ссылка: http://dev.mysql.com/doc/refman/5.0/en/charset-table.html

Общая форма

ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

и для определенного столбца в таблице

ALTER TABLE column COLLATE utf8_general_ci

0 голосов
/ 01 декабря 2017

1) Набор символов и сопоставление базы данных по умолчанию:

SELECT @@character_set_database, @@collation_database;

Изменено: ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

2) Набор символов и сопоставление таблицы по умолчанию:

SELECT T.table_name, CCSA.character_set_name 
FROM information_schema.TABLES T, information_schema.COLLATION_CHARACTER_SET_APPLICABILITY CCSA 
WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "YOUR_DB";`

Изменено: ALTER TABLE [table_name] CHARACTER SET utf8 COLLATE utf8_general_ci

3) Набор символов и сопоставление столбцов:

SELECT c.TABLE_NAME, c.COLUMN_NAME, c.CHARACTER_SET_NAME, c.COLLATION_NAME 
FROM information_schema.COLUMNS c
WHERE c.table_schema = "YOUR_DB";`

Изменено: ALTER TABLE [table_name] CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci

Третий требует, чтобы вы отключили проверку внешних ключей для преобразования данных. Итак, все это вместе:

DELIMITER //
CREATE PROCEDURE migrate_charset_to_utf8()
  BEGIN
    DECLARE done TINYINT DEFAULT 0;
    DECLARE curr_table VARCHAR(64);

    DECLARE table_cursor CURSOR FOR
    SELECT T.table_name
      FROM information_schema.TABLES T
      WHERE T.TABLE_TYPE = 'BASE TABLE' AND
        T.TABLE_SCHEMA = 'YOUR_DB';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    OPEN table_cursor;

    table_loop: LOOP
      FETCH table_cursor INTO curr_table;
      IF done THEN
        LEAVE table_loop;
      END IF;

      # Convert table data(columns) charset
      SET @sql_str1 = CONCAT("ALTER TABLE ", curr_table, " CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt1 FROM @sql_str1;
      EXECUTE stmt1;
      DEALLOCATE PREPARE stmt1;

      # Set table's default charset e.g for new columns added
      SET @sql_str2 = CONCAT("ALTER TABLE ", curr_table, " CHARACTER SET utf8 COLLATE utf8_general_ci");
      PREPARE stmt2 FROM @sql_str2;
      EXECUTE stmt2;
      DEALLOCATE PREPARE stmt2;

    END LOOP table_loop;

    CLOSE table_cursor;
  END//

DELIMITER ;


SET @@FOREIGN_KEY_CHECKS = 0;
CALL migrate_charset_to_utf8();
SET @@FOREIGN_KEY_CHECKS = 1;

ALTER DATABASE CHARACTER SET utf8 COLLATE utf8_general_ci;

РЕДАКТИРОВАТЬ: смотрите здесь вместо

0 голосов
/ 25 мая 2010

Добавьте в my.cnf это:

[mysqld]
character-set-server=utf8
default-collation=utf8_unicode_ci

И перезапустите mysqld deamon.

ДОБАВЛЕНО:

ALTER DATABASE your_base_name CHARACTER SET utf8 COLLATE utf8_unicode_ci;

и my.cnf

SET collation_connection     = utf8_unicode_ci;
SET character_set_results    = utf8;
SET character_set_connection = utf8;
SET character_set_client     = utf8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...