Я перенесу свою существующую базу данных на другой сервер.Чтобы добиться этого, я экспортировал и импортировал базу данных, используя 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:
Старое изображение спецификации базы данных:
Новые спецификации веб-сервера, на которых работает веб-сайт и 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.