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


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

14 78

14 ответов:

обновление:

короткий ответ - вы должны почти всегда использовать utf8mb4 charset и utf8mb4_unicode_ci параметры сортировки.

посмотреть:

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

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

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

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

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

ресурсы:

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

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

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

SHOW VARIABLES LIKE 'character_set%';

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

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

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

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

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

Подробнее;
UTF8 полностью

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

Edit

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

кодировка-это свойство базы данных (по умолчанию) и таблицы. Вы можете посмотреть (команды 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;

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

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

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

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

я следовал решению Хавьера, но я добавил несколько разных строк в моем.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 в первом / единственном комментарии пользователя в нижней части страницы. Он упоминает, что пропустить набор символов-клиент-рукопожатие имеет определенное значение.

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

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

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

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

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

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

  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

SET NAMES UTF8

это делает трюк

установите подключение к базе данных в UTF8:

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

ПОДКЛЮЧЕНИЕ БАЗЫ ДАННЫХ К 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());

удалось найти решение. Выполните следующие действия, как указано в 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;