和其他许多人一样,我在使用 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_ 替换。但希望这与这个确切的问题没有任何关系=)