教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

MySQL字符集乱码总结

更新时间:2018年07月20日17时34分 来源:传智播客 浏览次数:

查看数据库编码:
showcreate database db_name;
查看表编码:
showcreate table tbl_name;
查看字段编码:
showfull columns from tbl_name;
showfull fields from tbl_name;
MySql 端配置
1. 修改my.ini文件
[mysql]
default-character-set=utf8   
说明:修改链接字符集和校对规则,它会同时设置character_set_client, character_set_connection, character_set_results
也可以修改
[mysqld]
default-character-set=utf8
说明:这里修改的是服务器的字符集和校对规则。
查看当前服务器的字符集和校对规则:
mysql>show variables like 'character_set_server';  
mysql>show variables like 'collation_server';
2. 修改数据库和表的字符集和校队规则。
例如:
--Create Database.
dropdatabase if exists HRDB;
createdatabase HRDB DEFAULT CHARACTER SET utf8; # CHARSET=utf8
useHRDB;

-- 角色表
createtable HR_ROLE (
IDbigint not null auto_increment,
NAMEvarchar(20) not null unique,
primarykey (ID)
)ENGINE=INNODB DEFAULT CHARACTER SET utf8;  # CHARSET=utf8

查看当前数据库的字符集和校对规则:
mysql>show variables like 'character_set_database';  
mysql>show variables like 'collation_database';

查看表的字符集和校对规则:
mysql>show create table HR_ROLE \G;

MySQL字符集终极解决方案
开源数据库MySQL从来都是中小企业构建web应用的首选,特别是和PHP配合简直就是一对黄金搭档,深受web开发人员的喜爱。但自从4.1以来MySQL加入了多字符集的支持,很多MySQL使用者发现中文居然不能使用了,显示变成了一堆乱码!以致于很多人还在使用3.24.58的老版本,最近上MySQL网站,发现居然不提供3.24版本的下载了,MySQL已经彻底放弃3.24版本了。好在我还留有一份windows版的copy,就当作纪念吧。
怎么会产生乱码现象的,怎么解决?只要翻下网上的解决方案,马上就可以得出答案:“在获得连接之后执行一句set names 'gb2312'”,但这样做的原因是什么呢?总结一下我的经验。
MySQL处理连接时,外部连接发送过来的SQL请求会根据以下顺序进行转换:
character_set_client           //客户连接所采用的字符集
|
character_set_connection  //MySQL连接字符集
|
character_set_database    //数据库所采用的字符集(表,列)
|
character_set_results        //客户机显示所采用的字符集
. 产生乱码的根本原因在于:
1.客户机没有正确地设置client字符集,导致原先的SQL语句被转换成connection所指字符集,而这种转换,是会丢失信息的,如果clientutf8格式,那么如果转换成gb2312格式,这其中必定会丢失信息,反之则不会丢失。一定要保证connection的字符集大于client字符集才能保证转换不丢失信息。
2. 数据库字体没有设置正确,如果数据库字体设置不正确,那么connection字符集转换成database字符集照样丢失编码,原因跟上面一样。
.为什么set names 'gb2312'就可以了呢
setnames 'gb2312'相当于这三条语句:
setcharacter_set_client = gb2312;
setcharacter_set_connection = gb2312;
setcharacter_set_results = gb2312;
这样做的话,上述产生乱码的原因1就不存在了,因为编码格式都统一了,但是这样做并不是万金油。原因有:
1.你的client不一定是用gb2312编码发送SQL的,如果编码不是gb2312那么转换成gb2312就会产生问题。
2.你的数据库中的表不一定是gb2312格式,如果不是gb2312格式而是其他的比如说latin1,那么在存储字符集的时候就会产生信息丢失。
综上,终极解决方案如下:
1.首先要明确你的客户端时候何种编码格式,这是最重要的(IE6一般用utf8,命令行一般是gbk,一般程序是gb2312)
2.确保你的数据库使用utf8格式,很简单,所有编码通吃。
3.一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 <gbk < utf8,若设置set character_set_client = gb2312,那么至少connection的字符集要大于等于gb2312,否则就会丢失信息
4.以上三步做正确的话,那么所有中文都被正确地转换成utf8格式存储进了数据库,为了适应不同的浏览器,不同的客户端,你可以修改character_set_results来以不同的编码显示中文字体,由于utf8是大方向,因此web应用是我还是倾向于使用utf8格式显示中文的。

作者:传智播客人工智能+Python学院
0 分享到:
和我们在线交谈!