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

376

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

  • 18
    Для более поздних посетителей: обратите внимание на связанные вопросы на боковой панели и используйте utf8_unicode_ci , а не utf8_general_ci .
  • 13
    Если вам нужна полная поддержка UTF-8, вы, вероятно, также захотите использовать набор символов utf8mb4 а не utf8 как utf8 поддерживает только базовую многоязычную плоскость, а не полный диапазон. Требуется MySQL 5.5.3 или выше.
Показать ещё 5 комментариев
Теги:
character-encoding

17 ответов

577
Лучший ответ

Используйте команды 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;
  • 14
    Upvote за вещь utf8mb4.
  • 8
    Техника CONVERT TO предполагает, что текст был правильно сохранен в некоторой другой кодировке (например, latin1) и не искажен (например, байты UTF-8, втиснутые в столбец latin1 без преобразования в latin1).
Показать ещё 6 комментариев
115
  • Сделайте резервную копию!

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

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

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  • 38
    Примечание: ALTER TABLE tablename CHARACTER SET utf8 устанавливает только набор символов по умолчанию для таблицы, которая используется для вновь создаваемых столбцов. Он не преобразует существующие столбцы, для которых уже установлен набор символов.
  • 0
    Я должен был сначала прочитать резервную копию, но мне повезло, что она была в среде разработки. так что мой голос идет к вам!
Показать ещё 2 комментария
73

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

Если вы один из командной строки, вы можете сделать это очень быстро. Просто заполните "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"
  • 2
    Можете ли вы добавить более подробную информацию в это я получаю ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
  • 0
    @ 4485670 Вам нужно запустить это в оболочке командной строки . Если у вас доступно только клиентское соединение MySQL, используйте код sdfor ниже.
Показать ещё 5 комментариев
63

Вы можете создать 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;

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

Ответ Арнольда Дэниелса выше более изящный.

  • 0
    почему вы добавили два изменения таблицы запроса? одного не достаточно?
  • 7
    @ Акшай, хороший вопрос. Первый запрос таблицы изменений устанавливает значения по умолчанию для новых столбцов, а второй запрос таблицы изменений преобразует существующие столбцы.
Показать ещё 2 комментария
13

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

Шаг 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

  • 1
    В настоящее время этот сценарий использует 'utf8_unicode_ci' для БД, но 'utf8_general_ci' для таблиц - это было намеренно? (Я думаю, что оба должны использовать одну и ту же кодировку)
  • 0
    stackoverflow.com/questions/10957238/… оставили более полный ответ здесь
7

Используйте HeidiSQL. Его бесплатный и очень хороший инструмент db.

В меню инструментов выберите Редактор массовой таблицы

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

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

Выполнить

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

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

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

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

  • 0
    Не могли бы вы уточнить, пожалуйста? У меня есть именно эта проблема - специальные символы и пробелы отображаются в виде вопросительных знаков. Я пытаюсь конвертировать базу данных в MAMP, используя PHPMyAdmin. Разработав оффлайн, я обнаружил, что мой хост не поддерживает utf8mb4. У меня нет Windows, поэтому я не могу использовать HeidiSQL. Есть ли способ, которым я могу достичь этого с PHPMyAdmin?
  • 0
    вот так. особенно у вас много стола.
Показать ещё 2 комментария
5

Вдохновленный комментарием @sdfor, вот bash script, который выполняет задание

#!/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

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

$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 "</pre>";
}
  • 0
    Откуда мы запускаем этот скрипт?
  • 1
    @YannisDran Это не должно иметь значения, если IP-адрес, с которого вы его выполняете, имеет доступ к базе данных. Сначала убедитесь, что вы сделали резервную копию!
Показать ещё 1 комментарий
4

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

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

Вот пример:

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

Обязательно выберите правильную сортировку, или вы можете получить уникальные ключевые конфликты. например Éleanore и Eleanore можно считать одинаковыми в некоторых сопоставлениях.

Помимо

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

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

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
1

Если вы не можете заставить свои таблицы конвертироваться или ваша таблица всегда установлена ​​в некоторый набор символов, отличных от utf8, но вы хотите использовать utf8, лучшим вариантом может быть уничтожить его и начать заново и явно указать:

create database database_name character set utf8;
0
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();
  • 0
    Спасибо, это один из немногих ответов, которые на самом деле показывают, как это сделать для всей базы данных (то есть для каждой таблицы). Работал как шарм.
0

Самый безопасный способ - сначала изменить столбцы на двоичный тип, а затем изменить его обратно на него, используя требуемую кодировку.

Каждый тип столбца имеет свой двоичный тип:

  1. CHAR => BINARY
  2. TEXT => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Например.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Я попробовал несколько таблиц latin1, и он сохранил все диакритики.

Вы можете извлечь этот запрос для всех столбцов, которые делают это:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

После того, как вы сделаете это на всех своих столбцах, вы сделаете это на всех таблицах:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Чтобы сгенерировать этот запрос для всей вашей таблицы, используйте следующий запрос:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

И теперь, когда вы изменили все свои столбцы и таблицы, сделайте то же самое в базе данных:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
0

Чтобы изменить кодировку набора символов в UTF-8 для самой базы данных, введите следующую команду в приглашении mysql > . Замените DBNAME на имя базы данных:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0

alter table table_name charset = 'utf8';

Это простой запрос, который я смог использовать для своего случая, вы можете изменить имя_таблицы в соответствии с вашими требованиями.

  • 0
    Обычно ответ должен сопровождаться объяснением того, что вы предлагаете делать.
0

Единственное решение, которое сработало для меня: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Преобразование базы данных, содержащей таблицы

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql
-1

Вы также можете использовать инструмент DB Navicat, который делает это проще.

  • Шиву.

Щелкните правой кнопкой мыши свою базу данных и выберите "Свойства базы данных" и "Изменить", как вам нужно, в раскрывающемся списке

Изображение 835

Ещё вопросы

Сообщество Overcoder
Наверх
Меню