У нас работает около сотни устаревших веб-сайтов PHP на старом сервере, на котором Gentoo Linux. Когда эти сайты были построены latin1 все еще оставалась общей кодировкой как в PHP, так и в MySQL.
Чтобы убедиться, что эти старые сайты использовали latin1 по умолчанию, при этом разрешая новые сайты для использования utf8 (наш текущий стандарт), мы устанавливаем кодировку подключения по умолчанию в php.ini:
mysql.connect_charset = latin1
mysqli.connect_charset = latin1
pdo_mysql.connect_charset = latin1
Некоторые более современные сайты могут переопределить это в своем коде начальной загрузки с помощью:
<?php
mysql_set_charset("utf8", $dsn );
... и все было хорошо.
Теперь сервер перегружен, и у нас больше нет этого хостера, поэтому мы перемещаем все эти сайты на более быстрый сервер в нашем стандартном хостере, который использует RHEL 5 как их предпочтительную ОС.
При настройке этого нового сервера я с удивлением обнаружил, что *.connect_charset
Директивы являются патчем для PHP, специфичным для Gentoo, и версия PHP для RHEL их не распознает! Как мне настроить PHP для подключения к MySQL с кодировкой latin1?
Я думал установить значение по умолчанию в my.cnf, но предпочел бы не чтобы заставить каждое приложение и клиент по умолчанию использовать latin1. Наша политика - использовать utf8, и мы хотели бы ограничить исключение только PHP. Кроме того, невозможно преобразовать каждый устаревший сайт для правильного использования utf8, поскольку многие из них чувствительны, а вы нарушаете его. У нас просто нет времени исправлять их все.
Как мне установить кодировку соединения mysql / mysqli / pdo_mysql по умолчанию на latin1 для PHP, при этом позволяя отдельным сценариям переопределять это значение на utf8 с помощью mysql_set_charset ()?
Что ж, после некоторых поисков выясняется, что mysql * .connect_charset - это специальный патч Gentoo. Я не нашел способа добиться такого же специфического поведения с пакетом PHP по умолчанию RHEL или стеком PHP Zend Server.
Я использовал MySQL по умолчанию, чтобы использовать latin1, потому что большинство сайтов на этом сервере являются устаревшими. Для новых сайтов кодировка определена явно, поэтому они переопределят кодировку по умолчанию.
Может ли это сделать то, что вам нужно?
mysql_query('SET NAMES latin1');
(Желательно вызывать сразу после того, как вы установили соединение с базой данных.)
default_charset = "latin1"
Должен сработать, помещенный внутри php.ini.
Изменить: это, очевидно, не совсем то же самое, поэтому вы можете лучше контролировать, используя эту директиву .htaccess для каждого из этих старых доменов:
AddDefaultCharset ISO-8859-1
Хотя я не тестировал.