3

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

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

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| 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 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

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

$mysql_link=mysql_connect('localhost','usr','pwd');
$result1=mysql_query("show variables like 'character%'");
$result2=mysql_query("show variables like 'collation%'");
mysql_close($mysql_link)

而 print_r $result1, $result 2,它神奇地回落到 latin-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 config (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)包括

 default_charset = "utf-8"

谢谢转发!=)

PS 我知道 mysql_ 函数已被弃用,应该用 mysqli_ 替换。但希望这与这个确切的问题没有任何关系=)

4

1 回答 1

0

如果您和大多数人一样,您可以使用 root 帐户访问 MySQL。文档中的这个小片段可能是您的确凿证据。

如前所述,应用程序在连接后仍需要使用 SET NAMES 或等效项来配置其连接。您可能很想用 --init_connect="SET NAMES 'utf8'" 选项启动服务器,以使每个连接的客户端自动执行 SET NAMES。但是,这将产生不一致的结果,因为具有 SUPER 权限的用户不会执行 init_connect 值。

于 2014-02-01T05:28:37.717 回答