一种永久的mysqli->set_charset()方式?
在将我可以找到的字符集的所有配置文件和运行时选项设置为utf-8之后,使用php建立的新mysqli连接仍然将其字符集设置为latin1,这实际上意味着我每次连接时都必须调用。$mysqli->set_charset('utf8')
$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}).");
我想知道是否有永久的方法可以做到这一点?
在这篇文章中也遇到了类似的问题。
在调用之前,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
客户端、连接和结果字符集只能在运行时更改为 utf8。之后,它显示:$mysqli->set_charset('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 中,以及
[client]
default-character-set=utf8
...
[mysqld]
## This option is deprecated in favor of --character-set-server.
#default-character-set=utf8
设置在 my.cnf 中。
我的表的默认字符集也是utf8。
似乎“[客户端]”选项只影响cmd“mysql”工具,与php无关。
无论我做什么,返回值始终是 latin1,直到被调用。$mysqli->character_set_name()
$mysqli->set_charset('utf8')
我想“latin1”是一个mysql的东西,因为我不记得在我的系统上默认为“latin1”的任何其他东西。
^更新:根据mysql手册9.1.4,9.1.5和5.1.3,应由客户端提供。我猜php在连接时不提供它,mysql使用回退字符集latin1。character_set_client
我正在运行php 5.3在debian wheezy与mysql 5.1。
任何建议?
使用评论中的信息进行更新:
我忘了提到指令以及为什么我不愿意使用它。skip-character-set-client-handshake
乍一看,我认为忽略握手可能会导致客户端谈论latin1而服务器谈论utf8的情况。服务器如何将字符串从字符集转换为不知道当前正在使用的字符集?character_set_client
character_set_server
如果我错了,请纠正我。我将在今天晚些时候尝试此设置,看看它是否有效。
使用工作指南更新:
确保一切在utf-8(或任何首选字符集)下工作。然后将该行添加到 。skip-character-set-client-handshake
my.cnf
到目前为止,这对我有用。我尝试了一些双倍宽度的utf-8字符。两者都成功并在浏览器中正确显示。insert
select
跳过握手意味着什么仍然不清楚。并且mysql服务器现在无法使用除utf-8以外的任何字符集,whick使此解决方法非常不切实际,因为我根本无法将此设置应用于运行我网站的所有服务器。
所以我不采用这种解决方法。非常感谢进一步的评论和答案。