Миграция базы данных MySQL UTF-8 проблемы с PHP - PullRequest
0 голосов
/ 12 июня 2018

Я перенесу свою существующую базу данных на другой сервер.Чтобы добиться этого, я экспортировал и импортировал базу данных, используя SQL-запросы phpMyAdmin.Все работает нормально, за исключением того, что некоторые символы UTF-8 выглядят неработающими на сайте.Я извлекаю их, используя один и тот же код PHP (на другом сервере, но с теми же расширениями и версией PHP).

Пример строки, которую я вижу на новом веб-сайте и в базах данных (как старых, так и новых)(используя phpMyAdmin): péri-prothétique

Пример строки, как я ее вижу на старом сайте péri-prothétique

Как вы можете видеть, PHP использовал для автоматического кодирования символов правильным способомдаже думал, что символы искажены в базе данных, но больше не делает этого (даже если я явно utf8_encode или utf8_decode результат).Я даже пытался принудительно установить $mysqli->set_charset("UTF8") для каждого соединения, но безрезультатно.

И веб-сервер, и сервер базы данных, и соединение с сервером, и PHP используют таблицы UTF-8 или utf8mb4, кодировку и сопоставление, и настраиваюттак же, как старые.

Единственное различие, которое я вижу, состоит в том, что новый сервер базы данных - это MariaDB вместо MySQL, а его веб-сервер - nginx вместо Apache.

Новое изображение спецификации базы данных из phpMyAdmin:

image

Старое изображение спецификации базы данных:

image

Новые спецификации веб-сервера, на которых работает веб-сайт и PHP (те же спецификации, что и на старом, но на другом сервере):Apache 2.4 PHP 7.0

Как мне вернуть эту старую правильную кодировку?Почему PHP больше автоматически не декодирует их правильно?

ОБНОВЛЕНИЕ: Использование mb_detect_encoding Я вижу, что PHP как в новой, так и в старой версии обнаруживает ASCII или UTF-8 в результатах запроса,в зависимости от того, есть ли хотя бы символ UTF-8 или нет.Проблема в том, что в новой версии PHP не отображает символы UTF-8 правильно, даже если он обнаруживает кодировку строки как UTF-8.

UPDATE 2: благодаря этот вопрос Я выяснил, почему мои записи были искажены: двойная кодировка возникла из того факта, что сопоставление базы данных было latin1_swedish_ci, тогда как сопоставление таблиц было utf8_general_ci.Это не отвечает на вопрос, задуманный, поскольку старый веб-сайт автоматически «переводил» эти искаженные символы, отображая их прямо в HTML, и я хочу воспроизвести это поведение на новом веб-сайте, который отличается, но с тем же кодом иНастройки php.ini.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Ожидаете ли вы изменений в существующих данных?Она не будет работать.Вам нужно снова добавить данные, чтобы увидеть изменения.Удалите все данные из новой базы данных и добавьте снова.

0 голосов
/ 13 июня 2018

Чтобы проверить двойное кодирование, используйте SELECT HEX(col)... é должно вернуться C3A9 (правильное utf8), но вместо этого показывает C383C2A9 (двойное кодирование).

См .: Проблемас UTF-8 символами;я вижу не то, что сохранил

Если вы действительно определили, что у вас двойное кодирование, то исправление включает в себя

UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);

См. http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

Да, «двойное кодирование» - это молчаливая ошибка - два ошибки делают правильное (вроде).

0 голосов
/ 12 июня 2018

Я думаю, что вам следует проверить конфигурацию MariaDB.

Сначала проверьте свой php-код, чтобы узнать, не содержит ли вводящую в заблуждение опечатку (но я думаю, что нет)

Во-вторых, проверьте структуру базы данных / таблиц MariaDB [ извлечено отсюда ]:

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;

В-третьих, проверьте конфигурацию файлов MariaDB (my.cnf) [ извлеченоотсюда ]:

    [client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4

Затем перезагрузите сервер:

mysql.server restart

Надеюсь, это поможет вам решить вашу проблему, брат.

Пока

...