我的MySQL数据库用的是清一色的utf8,见表语句如下,存储引擎MyISAM,但是我把该表的三个相关文件拷贝给一个朋友,他的数据库安装时选得时GBK(没改过)。在他那里中文可以正常显示,按照我的想法是,我的数据表用的是utf8,他用GBK读出来应该是乱码。为什么没有乱码。而且在他那里查看该表的信息依然是utf8的。求解释。mysql> show create table ip \G
*************************** 1. row ***************************
Table: ip
Create Table: CREATE TABLE `ip` (
`start` bigint(21) unsigned DEFAULT NULL,
`end` bigint(21) unsigned DEFAULT NULL,
`location` varchar(100) DEFAULT NULL,
`organization` varchar(100) DEFAULT NULL,
UNIQUE KEY `ip_start_index` (`start`),
UNIQUE KEY `ip_end_index` (`end`),
KEY `ip_start_end_index` (`start`,`end`),
FULLTEXT KEY `ip_location_index` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)mysql> show variables like "%char%";
+--------------------------+------------------------------+
| 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 | D:\MyInstall\share\charsets\ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)
*************************** 1. row ***************************
Table: ip
Create Table: CREATE TABLE `ip` (
`start` bigint(21) unsigned DEFAULT NULL,
`end` bigint(21) unsigned DEFAULT NULL,
`location` varchar(100) DEFAULT NULL,
`organization` varchar(100) DEFAULT NULL,
UNIQUE KEY `ip_start_index` (`start`),
UNIQUE KEY `ip_end_index` (`end`),
KEY `ip_start_end_index` (`start`,`end`),
FULLTEXT KEY `ip_location_index` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)mysql> show variables like "%char%";
+--------------------------+------------------------------+
| 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 | D:\MyInstall\share\charsets\ |
+--------------------------+------------------------------+
8 rows in set (0.00 sec)
MySQL 中文显示乱码
MYSQL的字符集有分服务端、客户端,它会自动进行转换
你只要设对了客户端的字符集,比如你的应用是在GBK下,你就设客户端为GBK
SET NAMES gbk;
它就会把UTF8码自动转换为GBK显示出来
以上解释作废在你拷表给他的时候,如果这个表的字符集是UTF8,拷到那边字符集不会变化,即使设定的默认字符集为GBK。
MYSQL允许不同的表,不同的字符集
MySQL是这样做的,我的表是utf8的,所以MySQL服务器端就按照utf8读出来,而返回的结果集用gbk编码,之后在客户端显示的时候用gbk解码,所以我的朋友那里显示是正常的中文汉字。而在我这里呢,读取的时候用的是utf8,返回的结果集用utf8编码,而dos窗口下用gbk解码,自然就出现了乱码。
MySQL是不是这样做的,我的表是utf8的,所以MySQL服务器端就按照utf8读出来,而返回的结果集用gbk编码,之后在客户端显示的时候用gbk解码,所以我的朋友那里显示是正常的中文汉字。而在我这里呢,读取的时候用的是utf8,返回的结果集用utf8编码,而dos窗口下用gbk解码,自然就出现了乱码。
MySQL是不是这样做的,我的表是utf8的,所以MySQL服务器端就按照utf8读出来,而返回的结果集用gbk编码,之后在客户端显示的时候用gbk解码,所以我的朋友那里显示是正常的中文汉字。而在我这里呢,读取的时候用的是utf8,返回的结果集用utf8编码,而dos窗口下用gbk解码,自然就出现了乱码。