Mysql

為 PHP 設置預設 MySQL 連接字元集(在 RHEL 中)?

  • April 13, 2010

我們在執行Gentoo Linux 的舊伺服器上執行了大約一百個舊版 PHP 網站。當這些站點建立時,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 特定更新檔,而 RHEL 的 PHP 版本無法辨識它們!現在如何設置 PHP 以使用 latin1 字元集連接到 MySQL?

我考慮在 my.cnf 中設置預設值,但希望強制每個應用程序和客戶端預設為 latin1。我們的政策是使用 utf8,並且我們希望將例外限制為僅 PHP。此外,將每個舊站點轉換為正確使用 utf8 是不可行的,因為許多站點都屬於 touch ’m 而你破壞了 ’m kind。我們根本沒有時間去修復它們。

對於 PHP,我如何將預設的 mysql/mysqli/pdo_mysql 連接字元集設置為 latin1,同時仍然允許單個腳本使用 mysql_set_charset() 將其覆蓋為 utf8?

好吧,經過一番搜尋,mysql*.connect_charset 似乎是 Gentoo 特定的更新檔。我發現無法使用 RHEL 的預設 PHP 包或 Zend Server 的 PHP 堆棧獲得相同的特定行為。

我已經使用預設 MySQL 來使用 latin1,因為該伺服器上的大多數站點都是舊的。新站點明確定義了它們的字元集,因此它們將覆蓋預設值。

這可能會做你所追求的嗎?

mysql_query('SET NAMES latin1');

(最好在您建立數據庫連接之後立即呼叫。)

引用自:https://serverfault.com/questions/97759