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

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

Ответ 1

Обновить:

Короткий ответ - Вы почти всегда должны быть с помощью utf8mb4 кодовых и utf8mb4_unicode_ci сверки.

Видеть:

Оригинальный ответ:

MySQL 4.1 и выше имеет набор символов UTF-8 по умолчанию. Вы можете проверить это в файле my.cnf, не забудьте установить как клиент, так и сервер (default-character-set character-set-server default-character-set и default-character-set character-set-server).

Если у вас есть данные, которые вы хотите преобразовать в UTF-8, дамп вашей базы данных и импортируйте ее как UTF-8, убедившись:

  • используйте SET NAMES utf8 перед запросом/вставкой в базу данных
  • используйте DEFAULT CHARSET=utf8 при создании новых таблиц
  • на данный момент ваш клиент и сервер MySQL должны находиться в UTF-8 (см. my.cnf). помните, что любые языки, которые вы используете (например, PHP), также должны быть UTF-8. Некоторые версии PHP будут использовать свою собственную клиентскую библиотеку MySQL, которая, возможно, не поддерживает UTF-8.

Если вы хотите перенести существующие данные, сначала помните о резервном копировании! Многие странные изменения данных могут произойти, когда все идет не так, как планировалось!

Некоторые ресурсы:

Ответ 2

Чтобы сделать это "постоянным", в my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

Чтобы проверить, перейдите к клиенту и покажите некоторые переменные:

SHOW VARIABLES LIKE 'character_set%';

Убедитесь, что все они utf8, кроме ..._filesystem, который должен быть binary и ..._dir, который указывает где-то в установке MySQL.

Ответ 3

MySQL 4.1 и выше имеет набор символов по умолчанию, который он вызывает utf8, но который на самом деле является только подмножеством UTF-8 (допускает только трехбайтовые символы и меньше).

Используйте utf8mb4 в качестве вашей кодировки, если вы хотите "полный" UTF-8.

Ответ 4

Короткий ответ: используйте utf8mb4 в 4 местах:

  • Байт в вашем клиенте - utf8, а не latin1/cp1251/etc.
  • SET NAMES utf8mb4 или что-то подобное при установке клиентского подключения к MySQL
  • CHARACTER SET utf8mb4 для всех таблиц/столбцов - кроме столбцов, которые строго соответствуют ascii/hex/country_code/zip_code/etc.
  • <meta charset charset=UTF-8>, если вы выводите HTML. (Да, написание здесь отличается.)

Дополнительная информация,
UTF8 полностью

В приведенных выше ссылках содержится "подробный канонический ответ, необходимый для решения всех проблем". - На этом форуме есть пробел.

Edit

В дополнение к CHARACTER SET utf8mb4, содержащему "все" мировые персонажи, COLLATION utf8mb4_unicode_520_ci является аргументом в пользу использования "наилучшего универсального" сопоставления. (Есть также турецкие, испанские и т.д., Сортировки для тех, кто хочет нюансы на этих языках.)

Ответ 5

Кодировка - это свойство базы данных (по умолчанию) и таблицы. Вы можете посмотреть (команды MySQL):

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

Иными словами; достаточно легко проверить кодировку базы данных или изменить ее:

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;

Ответ 6

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

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

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

Ответ 7

Эти советы по MySQL и UTF-8 могут оказаться полезными. К сожалению, они не представляют собой полное решение, просто распространенные ошибки.

Ответ 8

Я последовал за решением Хавьера, но я добавил несколько разных строк в my.cnf:

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

Я нашел эту идею здесь: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html в комментарии пользователя первого или единственного пользователя в нижней части страницы. Он упоминает, что рукопожатие с пропущенным символом-клиентом имеет некоторое значение.

Ответ 9

Установите database collation на UTF-8 затем примените table collation к умолчанию базы данных.

Ответ 10

Ваш ответ: вы можете настроить с помощью настроек MySql. В "Моем ответе" может быть что-то вне контекста, но это также полезно для вас. как настроить Character Set и Collation.

Для приложений, которые хранят данные с использованием набора символов MySQL по умолчанию и сортировка (latin1, latin1_swedish_ci), никакой специальной конфигурации должны быть необходимы. Если приложения требуют хранения данных, используя различный набор символов или сортировку, вы можете настроить набор символов информации несколькими способами:

  • Укажите настройки символов для каждой базы данных. Например, гостиницы для использования одной базы данных может потребоваться utf8, тогда как приложения, которые использование другой базы данных может потребовать sjis.
  • Укажите настройки символа при запуске сервера. Это приводит к тому, что сервер использовать заданные настройки для всех приложений, которые не делают других меры.
  • Укажите настройки символа во время настройки, если вы создаете MySQL из источника. Это заставляет сервер использовать данные настройки для всех приложений, не указывая их при запуске сервера.

Примеры, показанные здесь для вашего вопроса, чтобы установить набор символов utf8, здесь также устанавливают сопоставление для более полезного (utf8_general_ci collation`).

Укажите настройки символов для каждой базы данных

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

Укажите параметры символа при запуске сервера

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

Задайте настройки символов в момент конфигурации MySQL

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

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

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

Это может быть длинный ответ, но есть способ, который вы можете использовать. Надеюсь, мой ответ будет полезен для вас. для дополнительной информации http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html

Ответ 11

SET NAMES UTF8

Это трюк

Ответ 12

Установите соединение с базой данных в UTF8:

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }

Ответ 13

ПОДКЛЮЧЕНИЕ БАЗЫ ДАННЫХ К UTF-8

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());

Ответ 14

Было возможно найти решение. Выполните следующие действия, указанные в http://technoguider.com/2015/05/utf8-set-up-in-mysql/

SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = ’SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;