Использование SET CHARACTER SET utf8
после использования SET NAMES utf8
будет на самом деле сбросить character_set_connection
и collation_connection
к
@@character_set_database
и @@collation_database
соответственно.
manual утверждает, что
SET NAMES x
эквивалентно
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;
и SET CHARACTER SET x
эквивалентно
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
, тогда как SET collation_connection = x
также выполняет внутренние функции SET character_set_connection = <<character_set_of_collation_x>>
и SET character_set_connection = x
также выполняет SET collation_connection = <<default_collation_of_character_set_x
.
По существу, вы сбрасываете character_set_connection
в @@character_set_database
и collation_connection
в @@collation_database
. Руководство объясняет использование этих переменных:
Какой набор символов должен сервер перевести заявление после его получения?
Для этого сервер использует character_set_connection и системные переменные collation_connection. Он преобразует операторы, отправленные клиентом из character_set_client в character_set_connection (кроме строковых литералов, которые имеют интродуктор, такой как _latin1 или _utf8). collation_connection важен для сравнения литеральных строк. Для сравнения строк с колонкой значения, collation_connection не Вещество, потому что колонки имеют свои собственные сопоставление, которое имеет более высокий приоритет сортировки .
Подводя это вверх,/процедура транскодирования кодирования MySQL использует для обработки запроса и его результатов является многоэтапной-вещью:
- MySQL обрабатывает входящий запрос, как кодируются в
character_set_client
.
- MySQL транскодирует заявление
character_set_client
в character_set_connection
- при сравнении строковых значений в столбец значения MySQL перекодирует значение строки из
character_set_connection
в набор символов данного столбца базы данных и использует столбец сортировку, чтобы сделать сортировку и сравнение.
- MySQL создает результирующий набор, закодированную в
character_set_results
(это включает в себя данные результата, а также результатов метаданные, такие как имена столбцов и так далее)
Так это может быть случай, что SET CHARACTER SET utf8
не будет достаточно обеспечивают полную поддержку UTF-8. Подумайте о наборе символов базы данных по умолчанию latin1
и столбцах, определенных с помощью utf8
-charset, и выполните шаги, описанные выше. Поскольку latin1
не может покрыть все символы, которые могут покрывать UTF-8, вы можете потерять информацию о символе на этапе .
- Шаг : Учитывая, что ваш запрос кодируется в UTF-8 и содержит символы, которые не могут быть представлены с
latin1
, эти символы будут потеряны на перекодирование из utf8
в latin1
(набор символов базы данных по умолчанию), что приведет к сбою запроса.
Поэтому я могу с уверенностью сказать, что SET NAMES ...
- это правильный способ справиться с проблемами набора символов. Несмотря на то, что я могу добавить правильную настройку ваших переменных MySQL-сервера (все обязательные переменные можно установить статически в my.cnf
) освобождает вас от служебных издержек дополнительных запросов, необходимых для каждого подключения.
Вау, я безмолвен! Благодаря! Вы заслуживаете золотую звезду :-) – Znarkus
+1 Спасибо за обширную рецензию. Я понимаю, как использовать 3. –
Отличный, отличный, отличный ответ! – felipsmartins