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

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

Обновить:

Короткий ответ. Вы почти всегда должны использовать кодировку utf8mb4_unicode_ci и 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.

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

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

  • полная миграция UTF-8 (cdbaby.com)
  • статья о готовности UTF-8 к функциям php (обратите внимание, что эта часть устарела)

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

 [client] default-character-set=utf8 [mysqld] character-set-server = utf8 по [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 / hex / country_code / zip_code / etc.
  • если вы выводите HTML. (Да, написание здесь отличается.)

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

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

редактировать

В дополнение к CHARACTER SET utf8mb4 содержащему «всех» символов мира, COLLATION utf8mb4_unicode_520_ci является аргументом в COLLATION utf8mb4_unicode_520_ci использования «наилучшего 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>. USE ALTER DATABASE . Замените DBNAME именем базы данных:

 ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci; 

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

Эти советы по MySQL и UTF-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 в комментарии пользователя первого и единственного пользователя в нижней части страницы. Он упоминает о том, что рукопожатие с пропущенным символом-клиентом имеет некоторое значение.

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

Ваш ответ: вы можете настроить с помощью настроек 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

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; 
  • Сколько символов может кодировать UTF-8?
  • Свойства Java UTF-8 в Eclipse
  • Правильно печатать символы utf8 в консоли Windows
  • Создание допустимого XML с кодировкой Java и UTF-8
  • Прочитать текстовый файл UTF-8 с помощью спецификации
  • установка UTF-8 в java и csv-файле
  • Классический ASP - Как преобразовать строку UTF-8 в UCS-2?
  • Значок байтового байта закручивает чтение файлов в Java
  • RStudio не выбирает кодировку, которую я говорю ей при чтении файла
  • В чем разница между Unicode и UTF-8?
  • C ++ и Boost: кодирование / декодирование UTF-8
  • Давайте будем гением компьютера.