在爲utf-8設置了字符集的所有配置文件和運行時選項之後,使用php創建的新mysqli連接仍然將其charset設置爲latin1,這意味着我必須每次連接時都調用$mysqli->set_charset('utf8')
。做一個永久的方式mysqli-> set_charset()?
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if ($mysqli->connect_error)
err_handle("mysql connect error({$mysqli->connect_errno}).");
if (!$mysqli->set_charset("utf8"))
err_handle("db error({$mysqli->errno}).");
我不知道是否有永久性的方式做到這一點?
this post遇到類似的問題。
MySQL的服務器上的「show variables like 'character_set%'
」查詢調用$mysqli->set_charset('utf8')
前顯示:
(這部分是在以前的轉速曖昧)
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_filesystem binary
character_set_results latin1
character_set_server utf8
character_set_system utf8
客戶端,連接和結果的字符集只能改變在運行時與$mysqli->set_charset('utf8')
一起utf8。之後,它顯示:
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
我有
default_charset = "utf-8"
在php.ini中設置,並在my.cnf
[client]
default-character-set=utf8
...
[mysqld]
## This option is deprecated in favor of --character-set-server.
#default-character-set=utf8
集。
我的表的默認字符集也是utf8。
好像「[client]」選項隻影響cmd「mysql」工具,並且與php無關。
$mysqli->character_set_name()
的返回值總是latin1無論我做什麼,直到調用$mysqli->set_charset('utf8')
。
我猜「latin1」是一個mysql的東西,因爲我不能回想起我的系統中默認爲「latin1」的其他任何東西。
^更新:根據MySQL手冊9.1.4,9.1.5和5.1.3,character_set_client
應該由客戶端提供。我想PHP不提供連接和MySQL使用後退字符集latin1。
我在Debian wheezy上運行php 5.3,使用mysql 5.1。
有什麼建議嗎?
更新了信息從評論:
我忘了提skip-character-set-client-handshake
指令爲什麼我不願意使用它。
在乍一看我還以爲忽略握手可能會導致局勢的客戶端會談LATIN1而服務器會談UTF8。不知道當前正在使用的字符集,服務器如何將字符串從字符集character_set_client
轉換爲character_set_server
?
糾正我,如果我錯了,PLZ。 今天晚些時候我會試用這個設置,看它是否有效。
與workaroud更新時間:
確保一切都在UTF-8(或任何字符集最好)的作品。然後將skip-character-set-client-handshake
行添加到my.cnf
。
這對我來說是有效的。我嘗試了一些雙倍寬度的utf-8字符。 insert
和select
都成功並在瀏覽器中正確顯示。
什麼跳過握手手段仍不清楚。現在mysql服務器變得無法使用除utf-8之外的任何字符集,因爲我不能將此設置應用於我的網站所運行的所有服務器,所以這種解決方法非常不切實際。
所以我沒有采用這種解決方法。進一步的評論和回答非常感謝。根據從MySQL下列職位
您是否嘗試過使用'setlocale()'更改系統區域設置? – Narf 2011-04-30 16:22:34
@Narf可用於我的系統上的php('locale -a'的輸出)的語言環境是C,POSIX和en_US.utf8。而且,'setlocale()'不能成爲一個永久的解決方案,因爲_「locale信息是每個進程維護的」_,根據php手冊。 – 2011-04-30 17:58:42
如果這應該起作用,en_US.utf8將是正確的。除非另外配置,否則將每個程序的默認字符集設置爲當前系統區域設置是合乎邏輯的。如果將PHP作爲Apache模塊運行,則可以將區域設置設置爲apache指令,或者甚至可以將默認系統區域設置爲en_US.utf8。無論如何...這只是一個想法,以防萬一沒有其他作品。 – Narf 2011-04-30 22:41:47