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

459

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

декан
источник
22
Для более поздних посетителей: обратите внимание на связанные вопросы на боковой панели и используйте utf8_unicode_ci, а не utf8_general_ci.
Fuxia
14
Если вы хотите полную поддержку UTF-8 , вы , вероятно , также необходимо использовать набор символов , utf8mb4а не в utf8качестве utf8поддерживает только базовую многоязычного плоскость , в отличие от полного диапазона. Требуется MySQL 5.5.3 или выше.
Мартин Стил
4
Я забыл упомянуть в своем комментарии выше, если вы переключитесь на, utf8mb4вам также нужно будет переключить сортировку наutf8mb4_unicode_ci
Martin Steel
3
Еще лучше, сопоставление utf8mb4_unicode_520_ciили какая-либо последняя доступная версия.
Рик Джеймс
@MartinSteel Я считаю, что по умолчанию это сопоставление с этим набором символов.
VaTo

Ответы:

715

Используйте 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;
BalusC
источник
12
CONVERT TOМетодика предполагает , что текст был правильно храниться в какой - либо другой кодировке (например, latin1), а не подогнаны (например, UTF-8 байт забиты в latin1 колонку без преобразования в latin1).
Рик Джеймс
1
Это восстанавливает таблицу, делая ее невозможной в больших производственных системах. Если точно известно, что в столбцах latin1 хранятся только символы ASCII, возможно ли изменить таблицу / сопоставление таблицы без перестроения?
Андрей
@ Andrew Крупные производственные системы обычно имеют зеркальную БД для обслуживания.
BalusC
1
изменение charcter на utf8 меняет мой тип данных с текста на средний текст. Это ожидается?
Джерри
1
@Jerry Вероятно, так как: «Если столбец конвертируется в utf8, каждому символу может потребоваться до трех байтов для максимально возможной длины 3 × 65 535 = 196 605 байтов. Эта длина не помещается в байтах длины столбца TEXT, поэтому MySQL преобразует тип данных в MEDIUMTEXT, который является наименьшим строковым типом, для которого байты длины могут записать значение 196 605. Аналогично, столбец VARCHAR может быть преобразован в MEDIUMTEXT. " Изменение набора символов
jabbascript
129
  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;
newspire
источник
44
Примечание: ALTER TABLE tablename CHARACTER SET utf8 устанавливает только набор символов по умолчанию для таблицы, которая используется для вновь создаваемых столбцов. Он не преобразует существующие столбцы, для которых уже установлен набор символов.
газета
Я должен был сначала прочитать резервную копию резервной копии ... но мне повезло, что она была в среде разработки. так что мой голос идет к тебе!
Доминик Анжерер
4
@DominikAngerer: что сломалось?
cic
16
Обратите внимание, что utf8_general_ciбольше не рекомендуется лучшая практика. Начиная с MySQL 5.5.3, вы должны использовать, utf8mb4а не utf8. Они оба ссылаются на кодировку UTF-8, но в старых utf8были ограничения, специфичные для MySQL, которые не позволяли использовать символы, перечисленные выше 0xFFFD.
u01jmg3
76

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

Если вы один из командной строки, вы можете сделать это очень быстро. Просто заполните "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"
steros
@ 4485670 Вам нужно запустить это в оболочке командной строки . Если у вас доступно только клиентское соединение MySQL, используйте код sdfor ниже.
Арнольд Дэниелс
6
Этот код прекрасно работает, просто не забудьте добавить -h [имя хоста] -u [имя пользователя] -p [пароль] после mysql по мере необходимости.
разогнать
3
Возможно, вы захотите отключить проверку внешних ключей в реальной системе: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "ПОКАЗАТЬ ТАБЛИЦЫ" --batch --skip-column-names | xargs -I {} echo 'SET foreign_key_checks = 0; ALTER TABLE '{}'CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Адам Нельсон
1
У меня не работало, пока я не использовал «показать полные таблицы, где Table_Type =« BASE TABLE »» вместо «SHOW TABLES»
Брайан Петерсон,
68

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

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

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

sdfor
источник
почему вы добавили два изменения таблицы запроса? одного не достаточно?
Акшай
7
@ Акшай, хороший вопрос. Первый запрос alter-table устанавливает значение по умолчанию для новых столбцов, а второй запрос alter-table преобразует существующие столбцы.
UnlimitedInfinity
4
К сведению: согласно dev.mysql.com/doc/refman/5.5/en/alter-table.html документации MySQL, версия инструкции ALTER «CONVERT TO CHARACTER SET» выполняет оба действия за один шаг: «Чтобы изменить таблицу по умолчанию» набор символов и все столбцы символов (CHAR, VARCHAR, TEXT) для нового набора символов ...
devGuy
2
У меня есть эта ошибка # 1054 - Неизвестный столбец 'webdb_playground' в 'where clause', но я уверен, что мой БД правильный
Yannis Dran
1
@YannisDran Возможно, имя вашей базы данных не было в строке, что WHERE TABLE_SCHEMA=webdb_playgroundпривело к неизвестной ошибке столбца, но WHERE TABLE_SCHEMA="webdb_playground"было бы успешным. Что-то, чтобы попробовать на случай, если кто-то еще столкнется с этим.
Jabbascript
17

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

Шаг 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' для таблиц - это было намеренно? (Я думаю, что оба должны использовать одну и ту же кодировку)
gmcnaughton
stackoverflow.com/questions/10957238/… оставили более полный ответ здесь
VH
8

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

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

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

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

казнить

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

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

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

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

Том
источник
Не могли бы вы уточнить, пожалуйста? У меня есть именно эта проблема - специальные символы и пробелы отображаются в виде вопросительных знаков. Я пытаюсь преобразовать базу данных в MAMP, используя PHPMyAdmin. После разработки в автономном режиме я обнаружил, что мой хост не поддерживает utf8mb4. У меня нет Windows, поэтому я не могу использовать HeidiSQL. Есть ли способ, которым я могу добиться этого с PHPMyAdmin?
RexTheRunt
вот так. особенно у вас много стола.
Тян
Я получаю сообщение об ошибке при попытке преобразовать CHARSET: ошибка SQL (1025): ошибка при переименовании ... но это удивительный инструмент менеджера SQL!
marcolopes
Если кому-то нужен хороший обзор и учебник для heidisql, ознакомьтесь с этой статьей .
DougB
6

Вдохновленный комментариями @sdfor, вот скрипт 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
Camoflame
источник
4

Если данные не совпадают с набором символов, вы можете рассмотреть этот фрагмент из 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';

Фрэнк Форте
источник
4

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

$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>";
}
Дэн Лукас
источник
Откуда мы запускаем этот скрипт?
Яннис Дран
1
@YannisDran Это не должно иметь значения, если IP-адрес, с которого вы его выполняете, имеет доступ к базе данных. Сначала убедитесь, что вы сделали резервную копию!
Дэн Лукас
Хорошо, а как мы это запустим? Нужно ли загружать его на сервер и затем вводить путь к его позиции?
Яннис Дран
4
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();
剑 二十 三
источник
Спасибо, это один из немногих ответов, который на самом деле показывает, как это сделать для всей базы данных (то есть для каждой таблицы). Работал как шарм.
Machisuji
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
Soumik Guha
источник
3

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

Каждый тип столбца имеет свой соответствующий двоичный тип, как показано ниже:

  1. CHAR => Двоичный
  2. ТЕКСТ => 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;

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

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

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;
MalachiteBR
источник
1

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

create database database_name character set utf8;
user3013048
источник
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
utapyngo
источник
0

изменить таблицу table_name charset = 'utf8';

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

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

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

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Найн Аунг
источник
0

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

  • Шив.

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

введите описание изображения здесь

rvsiva17
источник
0

Решение командной строки и исключение представлений

Я просто заполняю ответ @ Jasny для других, таких как @Brianя, и у которых есть представления в нашей базе данных.

Если у вас есть такая ошибка:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

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

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Поэтому мы должны адаптировать команду Jasny awkдля извлечения только 1-го столбца, который содержит имя таблицы.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | 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 FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Natsimhan
источник
-1

Чтобы изменить кодировку набора символов на UTF-8, выполните простые шаги в PHPMyAdmin.

  1. Выберите вашу базу данных SS

  2. Перейти к операции SS

  3. На вкладке операций в раскрывающемся меню нижней сортировки выберите нужную кодировку, т.е. (utf8_general_ci), а также установите флажок (1) изменить все сортировки таблиц, (2) изменить все сортировки столбцов таблиц. и ударил Go.

SS

протектор хурам
источник