我们在一台运行GentooLinux。当这些网站建立时拉丁语1仍然是 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 );
...一切都很好。
现在服务器超载了,我们不再使用该托管商,因此我们将所有这些网站转移到我们标准托管商的更快的服务器上,该托管商使用红帽企业版5 作为他们选择的操作系统。
在设置这个新服务器时,我惊讶地发现这些*.connect_charset
指令是 Gentoo 针对 PHP 的特定补丁,而 RHEL 版本的 PHP 无法识别它们!现在我该如何设置 PHP 以使用 latin1 字符集连接到 MySQL?
我考虑过在 my.cnf 中设置默认值,但是我更愿意不是强制每个应用程序和客户端默认使用 latin1。我们的政策是使用 utf8,我们希望将例外限制在 PHP 中。此外,将每个旧站点转换为正确使用 utf8 是不可行的,因为许多站点都是“碰了就坏”的。我们根本没有时间去修复它们。
对于 PHP,如何将默认的 mysql/mysqli/pdo_mysql 连接字符集设置为 latin1,同时仍允许各个脚本使用 mysql_set_charset() 将其覆盖为 utf8?
答案1
这能达到你想要的效果吗?
mysql_query('SET NAMES latin1');
(最好在建立数据库连接之后立即调用。)
答案2
好吧,经过一番搜索,我发现 mysql*.connect_charset 是一个 Gentoo 特定补丁。我发现没有办法使用 RHEL 的默认 PHP 包或 Zend Server 的 PHP 堆栈获得相同的特定行为。
我已将 MySQL 默认为使用 latin1,因为此服务器上的大多数网站都是旧版。新网站的字符集已明确定义,因此它们将覆盖默认设置。
答案3
default_charset = "latin1"
应该可以解决问题,将其放在 php.ini 里面。
编辑:这显然不是完全相同的事情,因此您可以通过对每个旧域使用此 .htaccess 指令来更好地控制:
AddDefaultCharset ISO-8859-1
尽管我还没有测试过。