对MySQL数据库的编码问题的一些解释

来源:互联网 发布:淘宝售假次数清零吗 编辑:程序博客网 时间:2024/06/05 20:20

今天做PHP代码审计时,突然想到了MySQL数据库的编码问题,于是在网上查了些资料,然后就有了下面的内容。


/* MySQL编码问题 */

show variables like 'character%'; #显示与字符集相关的变量的值.


character_set_client: MySQL服务器假定client传输过来的数据的编码.
character_set_connection: MySQL服务器接收到数据时,将其转换成哪种编码.
character_set_results: MySQL服务器响应给客户端的数据采用哪种编码.
character_set_system: 元数据采用的编码(表名, 列名等).
character_set_server: MySQL服务器默认的数据编码方式.
character_set_database: MySQL数据库默认的数据编码方式.
character_set_table: MySQL数据库中表的默认数据编码方式.

character_set_column: MySQL数据库中表的列(字段)默认的数据编码方式.


MySQL默认的"服务器/数据库/表/列"的编码方式,优先级由低到高,

表的编码方式可覆盖数据库的编码方式,列(字段)的编码方式可覆盖表的编码方式.


set names 'utf8'; #设置character_set_client/results/connection的值

set names 'utf8' 只影响character_set_client/connection/results这三者的值.


MySQL配置文件中的"default-character-set=gbk"相当于"set names gbk".

MySQL配置文件中的"character-set-server=utf8"只影响character_set_server/database的值.


MySQL在执行操作前,先把接收到的数据从character_set_client转换为character_set_connection,
然后再把character_set_connection转换为与内部数据库相匹配的字符集,
最后执行完操作后,再把返回的结果转换为character_set_results.

/* 示例 */

例如你在windows的cmd命令行里操作数据库,

你就应该将character_set_client/results/connection的值都设置为gbk,

要不然你在查询数据库中的中文时cmd命令行就显示乱码,但英文不影响.

0 0