MySQL4.1的乱码问题

发表于 2006-02-06 22:44 | 分类: 菠萝菠萝蜜 | tags: | 发表评论

MySQL4.1的变化

MySQL为解决并控制不同层次的不同字符编码问题,在4.1以上版本对字符集的支持细化到四个层次:服务器(server)、数据库(database)、数据表(table)和连接(connection)。

MySQL通过以下三个方面来控制各个层次的字符编码:MySQL字符集(Character set)、MySQL连接校对(Collation,整理)以及站点编码。

编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;

安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;

启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;

此时 character_set_server 被设定为这个默认的字符集;

当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;

在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;

当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;

简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

MySQL的存储机制

当一个程序( PHP,CGI 等)与MySQL建立连接后,这个程序发送给MySQL的数据采用的是什么字符集?MySQL 无从得知(它最多只能猜测),所以:

MySQL 4.1要求客户端必须指定这个字符集,也就是character_set_client;MySQL的怪异之处在于,得到的这个字符集并不立即转换为存储在数据库中的那个字符集,而是先转换为character_set_connection 变量指定的一个字符集;转换为character_set_connection的这个字符集之后,还要转换为数据库默认的字符集character_set_database 进行存储;当这个数据被输出时,又要转换为 character_set_results指定的字符集。

上面3个变量的作用是这样的,client表示客户端发送过来的字符集,results表示发送到客户端的字符集(这两个分开是因为发送过来和发送过去的不一定是同一个客户端),connection则在客户端和数据库起一个连接作用。

所以,因为MySQL4.1的支持细化到了四个层次,但是每个层次的设定并不是唯一,这样就造成了在数据的传输过程中有多次的编码转换,对于中文来说,就很容易的形成乱码了。

Trackback this post

No comments yet. Be the first.

Leave a reply

(必需)

(必需,但不会被泄露)