2013-08-12 44 views
1

我正在一個Linux服務器上使用MySQL數據庫的網站上工作。你什麼時候需要顯式調用mysql_set_charset?

使用phpMyAdmin,在數據庫中,它說

  • 的MyISAM是這個MySQL服務器
  • latin1_swedish_ci上的默認存儲引擎

不過,我已經創建了所有的表與InnoDB和utf8_unicode_ci。我還檢查了所有表的表字段是utf8_unicode_ci。

然而,當我mysql_fetch_array,並回聲流,它給了胡言亂語。我不得不明確設置mysql_set_charset('utf8')以使文本正確顯示。

PHP版本是5.3.9; MySQL版本是5.1.70-cll - MySQL社區服務器(GPL)。

這是我第一次遇到這個問題,我從來沒有設置過的字符集。

是什麼導致php mysql_ *獲取的文本是亂碼?在什麼情況下需要mysql_set_charset

編輯:這不是一個問題,以吸引建議使用替代庫例如mysqli,pdo。我只想了解關於MySQL和charsets行爲的當前情況。謝謝。

+3

從不; ['mysql_ *'函數已被棄用](http://au1.php.net/manual/en/function.mysql-set-charset.php)。 – Marty

+0

http://stackoverflow.com/q/12859942/358906 –

+0

這將設置每個人爲UTF-8。 'mysql_query(「SET NAMES utf8」);' – M1K1O

回答

2

建立連接後始終調用它是明智的做法,以確保您的應用不會受到服務器設置損壞的影響。因爲你可以使用UTF8格式的表格,並以UTF8格式發送數據,但是如果連接不是UTF8(因爲即my.ini設置),那麼你最終會陷入混亂。因此,請致電mysql_set_charset()或執行SET NAMES charset查詢,並且您將安全地工作。並且由於每個連接完成一次,因此基本上無成本操作

+0

「..如果連接不是UTF8」。你說的這個連接是屬於MySQL還是PHP-MySQL? – Jake

+0

只要當前表編碼支持所有發送的字符,如果您使用UTF8格式的表並以非UTF8格式發送數據,則沒有任何問題。 –

+0

實際上這是錯誤的,因爲數據在傳輸過程中被轉換,數據庫中的數據會出錯。 –

3

在兩個系統之間交換數據時,始終存在問題「文本將發送什麼編碼?」「文本」只是簡單地表示爲二進制數據,只是長字符串1和0。這些可能意味着什麼。有數百種編碼方案可以將不同的字符編碼爲1和0的不同序列。如果系統只是收到一串字符串而不知道它們代表的是什麼編碼,系統無法知道那些假定的字符。

因此,對於兩個系統之間的任何接口,都需要有關於字符串編碼的規範。對於MySQL,這是API調用mysql_set_charset。這是告訴MySQL哪些編碼字符串將在PHP中發送給它的方式,以及什麼編碼MySQL應該將字符串返回給PHP。如果沒有明確設置,則默認編碼爲,假定爲,這可能與您期望的編碼不同,從而產生不匹配和垃圾字符。

閱讀What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With TextHandling Unicode Front To Back In A Web App瞭解更多信息。

1

mysql_set_charset函數設置當前連接的默認字符集。即使您的數據以unicode存儲在服務器上,它仍然需要一個兼容的連接字符集來準確傳輸數據。

如果您在mysql中執行SHOW VARIABLES LIKE 'character\_set\_%'語句,它將顯示服務器和當前連接使用的各種字符集。理想情況下,他們應該都匹配併成爲utf8

更多信息:MySQL Connection Character Sets

相關問題