推荐:Mysql 常见问题汇总1、Mysql errono 1005 : 主外键不是完全一致 , 请检查如下几点: a、字段是否存在 b、类型是否一致(注意unsigned , powerdesign 生成问题) c、数据库引擎是否一致 d、字符编码是否一致 e、windows平台下注意修改lower_case_table_names = 0, windows本身不区分文件大小
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLy8bJzNLP0ZWPmA%3D%3D&restype=3&from=derive&pi=&v=1)
在mysql客户端与mysql服务端之间,存在着一个字符集转换器。
character_set_client =>gbk:转换器就知道客户端发送过来的是gbk格式的编码
character_set_connection=>gbk:将客户端传送过来的数据转换成gbk格式
character_set_results =>gbk:
注:以上三个字符集可以使用set names gbk来统一进行设置
例子:
create table test(
name varchar(64) NOT NULL
)charset utf8;#这里的utf8表示服务器端的字符编码
首先,往数据表test中插入一条数据
inert into test values('测试');
则,数据“测试”在数据库中是以“utf8”格式保存的
过程:
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLzczOx9LO0Y%2BRmA%3D%3D&restype=3&from=derive&pi=&v=1)
首先,通过mysql客户端,将数据发送给Mysql服务器,经过字符集转换器的时候,由于character_set_connection 值为gbk,所以会将客户端发送过来的数据转为gbk格式,紧接着,字符集转换器将数据要传送给服务器的时候,发现服务器是以utf8保存数据的,所以,在其内部会自动将数据由gbk转换成utf8格式
什么时候会出现乱码?
客户端的数据格式与声明的 character_set_client不符
通过 header('Content-type:text/html;charset=utf8');将客户端的数据转成utf8格式的,在数据经过“字符集转换器”的时候,由于character_set_client=gbk,而character_set_connection也等于gbk,所以从客户端传送过来的数据(其实是utf8格式)并不会被转换格式。
但是,字符集转换器在讲数据发送给服务器的时候,发现服务器要的格式是utf8,所以会将当前数 据当做gbk格式来处理,从而转成utf8(但是,这一步其实已经错了。。。)。
2. result与客户端页面不符合的时候
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNDLzM%2B9zsu5x8jKxszLxs%2FJvsq6uca7ubvLz8e%2Bys3GzdCck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLzbPJ0s3RlY%2BY&restype=3&from=derive&pi=&v=1)
将返回结果的格式设置为utf8,但是客户端接受的格式为gbk,因此会出现乱码
通过show character set 语法,可以显示所有可用的字符集
latin字符集
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLzMvLy9LM0ZWPmA%3D%3D&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNC5xsm6z73Nx77Gzb3Lu8rOx87LzLnJzcnIx8i6u7rKyNCck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
注意:Maxlen列显示用于存储一个字符的最大的字节数目。
utf8字符集
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLsMrH0svRlY%2BY&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNDNzry%2Bxr2%2BxsnGy7nLyM2%2Bvcm5u7vGyM7MxsbMu8jKy9Cck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
gbk字符集
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNDOyrvNxrm7vc2%2BzM%2FLvLrIvb3Oyc3Lx8a8zMrPz8vKydCck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLy6rK0srRlY%2BY&restype=3&from=derive&pi=&v=1)
什么时候会丢失数据?
对比以上三幅图可以知道,每种字符集中,用于存储一个字符的最大的字节数目都不同,utf8最大,latin最小。所以在经过字符集转换器的时候,如果处理不当,会造成数据丢失,而且是无法挽回的。
比如:
将character_set_connection的值改为lantin的时候
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLy83OydLJ0ZWPmA%3D%3D&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNDHu8a%2BzMq6uc67ys7Lu83Ovb7Kxr3MycjIzMi9y8a9zNCck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
从客户端发送过来的gbk数据,会被转成lantin1格式,因为gbk格式的数据占用的字符数较多,从而会造成数据丢失
![](http://cdn-img.sm-tc.cn/?src=mZaTmsXQ0NC8xdCqjJqNjNCejIqM0L6Pj7uei57Qs5CcnpPQhpCKm56Q0IaRkIua0JaSnpiajNDMur7LusbMy7nHusrLus%2FMx8i6vc%2FJuby7u865x7vIvtCck5aPnZCejZvRj5GY&restype=3&from=derive&pi=&v=1)
![](http://cdn-img.sm-tc.cn/?src=l4uLj8XQ0IiIiNGSncqK0ZyQktCKj5OQnpuM0J6Tk5aSmNDOzc%2FIzc3Qzc3PyczLzbDP0sjRlY%2BY&restype=3&from=derive&pi=&v=1)
总结:
character_set_client和character_set_results 一般情况下要一致,因为一个表示客户端发送的数据格式,另一个表示客户端接受的数据格式
为了避免造成数据丢失,需让 character_set_connection的字符编码 大于 character_set_client的字符编码
分享:从mysql中导出单个表结构和数据mysqldump -u用户名 -p密码 -P端口号 --database 数据库名 --tables 表名 c:/导出文件名.sql 1、其中参数-P可以省略除非你的端口号不是mysql默认端口号 2、如果不写--tables参数就是导出去该DB中的全部表数据 1)MYSQL连接命令: mysql -h主机地址 -u用户名 -p用户密码