Я разрабатываю веб-приложение php и испытываю трудности с пониманием значения переменных Mysql, связанных с кодированием, и того, как они взаимодействуют друг с другом. Кодировка сервера установлена на latin1, но клиент - utf8mb4.
Запуск запроса mysql внутри базы данных
SHOW VARIABLES
WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'
дает следующее:
character_set_client = utf8mb4
character_set_connection = utf8mb4
character_set_database = latin1
character_set_filesystem = binary
character_set_results = utf8mb4
character_set_server = latin1
character_set_system = utf8
collation_connection = utf8mb4_unicode_ci
collation_database = latin1_swedish_ci
collation_server = latin1_swedish_ci
Я боюсь столкнуться с проблемами со старыми базами данных, которые находятся в latin1, если я изменю набор символов сервера mysql на utf8mb4, но я, конечно, хочу использовать utf8mb4 для новых создаваемых баз. Чтобы правильно обслуживать и извлекать данные из базы данных, должны ли кодировки и сопоставления серверов и клиентов всегда быть одинаковыми? Любое понимание было бы оценено?
Некоторые из этих VARIABLES
должны соглашаться с тем, какая кодировка используется в клиенте.
CREATE TABLE...
указывает, как они должны храниться в таблицах.
Если эти два отличаются друг от друга, то MySQL преобразует "на провод" между клиентским кодированием кодировки таблицы.
Если это означает преобразование, скажем, корейских символов (кодирование в utf8 или utf8mb4) в латинскую кодировку, это будет невозможно. С другой стороны, все акцентированные буквы в Западной Европе имеют кодировки как в latin1, так и в utf8, поэтому проблем нет.
Прочтите это для общих неприятностей: проблема с символами UTF-8; я не вижу того, что я хранил
См. ALTER TABLE.. CONVERT TO..
для преобразования всех столбцов символов в одной таблице в другую кодировку (при условии, что она была правильно сохранена для начала).