Как преобразовать весь набор символов и сопоставление базы данных MySQL в UTF-8? - PullRequest
426 голосов
/ 24 мая 2011

Как я могу преобразовать весь набор символов базы данных MySQL в UTF-8 и сопоставление в UTF-8?

Ответы [ 17 ]

659 голосов
/ 24 мая 2011

Используйте команды ALTER DATABASE и ALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Или, если вы все еще используете MySQL 5.5.2 или более раннюю версию, которая нене поддерживает 4-байтовый UTF-8, используйте utf8 вместо utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
121 голосов
/ 25 мая 2011
  1. Сделайте резервную копию!

  2. Затем вам нужно установить наборы символов по умолчанию в базе данных. Это не преобразует существующие таблицы, оно только устанавливает значения по умолчанию для вновь создаваемых таблиц.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. Затем вам нужно будет преобразовать набор символов для всех существующих таблиц и их столбцов. Это предполагает, что ваши текущие данные находятся в текущем наборе символов. Если для ваших столбцов задан один набор символов, но ваши данные действительно хранятся в другом, вам необходимо проверить руководство MySQL о том, как с этим справиться.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
72 голосов
/ 09 августа 2012

В командной строке

Если вы одна из командной строки, вы можете сделать это очень быстро.Просто заполните "dbname": D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Однострочник для простого копирования / вставки

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
68 голосов
/ 10 октября 2013

Вы можете создать sql для обновления всех таблиц:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Захватите вывод и запустите его.

Ответ Арнольда Дэниелса, приведенный выше, более элегантен.

16 голосов
/ 05 января 2015

Прежде чем продолжить, убедитесь, что вы: завершили полное резервное копирование базы данных!

Шаг 1: Изменения уровня базы данных

  • Определение параметров сортировки и набора символов в вашей базе данных

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
    
  • Исправление параметров сортировки для базы данных

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Шаг 2: Изменения уровня таблицы

  • Идентификация таблиц базы данных с неправильным набором символов или сопоставлением

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
    
  • Настройка параметров сортировки столбцов таблицы и набора символов

Захватите верхний вывод sql и запустите его. (вроде следующего)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

см .: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database

7 голосов
/ 30 декабря 2014

Использовать HeidiSQL . Это бесплатный и очень хороший инструмент для работы с БД.

В меню инструментов войдите в редактор Bulk Table

Выберите полную базу данных или выберите таблицы для преобразования,

  • галочка Изменить параметры сортировки по умолчанию: utf8mb4_general_ci
  • галочка Преобразовать в кодировку: utf8

Выполнить

Конвертирует всю базу данных из латиницы в utf8 всего за несколько секунд.

Работает как шарм:)

HeidiSQL подключается по умолчанию как utf8, поэтому любые специальные символы теперь должны рассматриваться как символы (ø å), а не как закодированные при проверке данных таблицы.

Настоящая ошибка при переходе с латиницы на utf8 заключается в том, чтобы убедиться, что pdo соединяется с кодировкой utf8. Если нет, то вы получите мусорные данные, вставленные в таблицу utf8 и вопросительные знаки повсюду на вашей веб-странице, что заставит вас думать, что данные таблицы не utf8 ...

5 голосов
/ 20 марта 2015

Вдохновленный комментариями @sd, вот скрипт bash, который делает эту работу

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit
4 голосов
/ 30 января 2015

Для баз данных с большим количеством таблиц вы можете использовать простой скрипт php для обновления кодировки базы данных и всех таблиц, используя следующее:

<code>$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "
";}
4 голосов
/ 04 декабря 2014

Если данные не совпадают с набором символов, вы можете рассмотреть этот фрагмент из http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Если столбец имеет недвоичный тип данных (CHAR, VARCHAR, TEXT), его содержимое должно быть закодировано в наборе символов столбца, а не некоторые другие набор символов. Если содержимое закодировано другим символом установить, вы можете преобразовать столбец, чтобы сначала использовать двоичный тип данных, и затем в недвоичный столбец с нужным набором символов.

Вот пример:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Убедитесь, что вы выбрали правильное сопоставление, иначе вы можете получить уникальные конфликты ключей. например Элеонора и Элеонора могут считаться одинаковыми в некоторых сопоставлениях.

За исключением:

У меня была ситуация, когда определенные символы «ломались» в электронных письмах, даже если они были сохранены в базе данных как UTF-8. Если вы отправляете электронные письма с использованием данных utf8, вы можете также преобразовать свои электронные письма в UTF8.

В PHPMailer просто обновите эту строку: public $CharSet = 'utf-8';

3 голосов
/ 21 июня 2018
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();
...