mysql默认字符集在php调用时不同

mysql默认字符集在php调用时不同,mysql,set,character,Mysql,Set,Character,和其他许多人一样,我在mysql字符集方面遇到了一些问题。和其他许多人一样,我希望所有内容都是UTF-8,但mysql安装了latin-1,无论我如何尝试/google/Experience使用mysql配置,客户端设置中仍然潜伏着latin-1 好的,这是设置。我有一个(非root)mysql用户“usr”,密码为“pwd”。每当我通过终端(mysql-uusr-p)访问mysql,然后友好地询问他的字符集时,他就会告诉我他爱上了utf8(他应该是这样的): 但是,如果我使用PHP访问mysq

和其他许多人一样,我在mysql字符集方面遇到了一些问题。和其他许多人一样,我希望所有内容都是UTF-8,但mysql安装了latin-1,无论我如何尝试/google/Experience使用mysql配置,客户端设置中仍然潜伏着latin-1

好的,这是设置。我有一个(非root)mysql用户“usr”,密码为“pwd”。每当我通过终端(mysql-uusr-p)访问mysql,然后友好地询问他的字符集时,他就会告诉我他爱上了utf8(他应该是这样的):

但是,如果我使用PHP访问mysql(通过同一个用户):

然后打印$result1,$result 2,它神奇地回到拉丁语-1:

character_set_client => latin1
character_set_connection => utf8
character_set_database => utf8
character_set_filesystem => binary
character_set_results => latin1
character_set_server => utf8
character_set_system => utf8
character_sets_dir => /usr/share/mysql/charsets/

collation_connection => utf8_unicode_ci
collation_database => utf8_general_ci
collation_server => utf8_unicode_ci
无论我是通过浏览器(作为php cgi)还是通过终端(作为php cli)调用php,这种情况都会发生

解决方法是在每个连接处手动设置字符集:

mysql_set_charset('utf8',$mysql_link);
这很有效。但我觉得应该有办法通过mysql配置来实现这一点

作为参考,Mysql配置(my.cfg)包括:

[client]
default_character_set = utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
PHP配置(PHP.ini)包括

谢谢转发!=)


另外,我知道mysql函数已经被弃用,应该用mysqli函数替换。但希望这与这个问题没有任何关系=)

如果你和大多数人一样,你可以使用root帐户访问MySQL。这个小片段可能是你的烟枪

如前所述,应用程序仍然需要在连接后使用集合名称或等效名称配置连接。您可能会尝试使用--init_connect=“SET NAMES'utf8'”选项启动服务器,以便为每个连接的客户端自动执行SET NAMES。但是,这将产生不一致的结果,因为不会为具有超级权限的用户执行init_connect值


也许可以打开查询日志记录,看看PHP是否在调用集合名latin1
mysql_set_charset('utf8',$mysql_link);
[client]
default_character_set = utf8

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
 default_charset = "utf-8"