Работа с SET NAMES utf8mb4 с таблицами utf8 - PullRequest
0 голосов
/ 02 ноября 2018

В большой системе на основе Mysql 5.5.57 Php 5.6.37 setup

В настоящее время вся система работает в utf8, включая SET NAMES utf8 в начале каждого соединения с БД.

Мне нужно поддержать эмодзи в одной из таблиц, поэтому мне нужно переключить ее на utf8mb4. Я не хочу переключать другие таблицы.

Мой вопрос - если я изменю на SET NAMES utf8mb4 для всех соединений (utf8 и utf8mb4) и переключу конкретную таблицу только на utf8mb4 (и только в эту таблицу буду записывать данные mb4). Будет ли работать остальная часть системы, как раньше?

Может ли быть какая-либо проблема при работе с SET NAMES utf8mb4 в таблицах / данных / соединениях utf8?

1 Ответ

0 голосов
/ 03 ноября 2018

Я думаю, что не должно быть проблем с использованием SET NAMES utf8mb4 для всех соединений.

(utf8mb3 - это синоним utf8 в MySQL; я буду использовать первый для ясности.)

utf8mb3 - это подмножество utf8mb4, поэтому байтов вашего клиента будут счастливы в любом случае (за исключением Emoji, которому требуется utf8mb4). Когда байты попадают (или приходят) в столбец, который объявлен только, будет проверка, чтобы убедиться, что вы не храните эмодзи или определенные китайские иероглифы, но в остальном это проходит с минимальной суетой.

Я предлагаю

 ALTER TABLE ... CONVERT TO utf8mb4

как «правильный» способ преобразования таблицы. Однако он преобразует все столбцы varchar / text. Это может быть плохим ...

Если вы JOIN преобразовали таблицу в не преобразованную таблицу, то вы будете пытаться сравнить строку utf8mb3 со строкой utf8mb4. MySQL поднимает руки и конвертирует все строки из одной в другую. Это не INDEX будет полезно.

Итак ... Убедитесь, что вы, по крайней мере, согласны с любыми столбцами , которые участвуют в JOINs.

...