新浦京81707con > 首页 > mysql字符集乱码问题,的中文问题解决方法

原标题:mysql字符集乱码问题,的中文问题解决方法

浏览次数:81 时间:2019-06-19

一、数据库和表以及表里的字符相关字段(varchar, char, text等)都要选拔gbk_chinese_ci这种艺术,不这么做也足以,但如此做,会省广大劳神。

mysql字符集乱码难点

MySQL处理连接时,外部连接发送过来的SQL请求会遵照以下依次举办改换:

character_set_client //客户连接所采纳的字符集
|
character_set_connection //MySQL连接字符集
|
character_set_database //数据库所采纳的字符集(表,列)
|
character_set_results //客户机显示所选择的字符集

一. 爆发乱码的根本原因在于:

1.客户机没有准确地安装client字符集,导致原先的SQL语句被调换来connection所指字符集,而这种转移,是会丢掉消息的,要是client是utf8格式,那么只要调换到gb2312格式,那中间必定会丢失新闻,反之则不会丢掉。一定要保管connection的字符集大于client字符集才具确认保障调换不丢掉消息。

2. 数据库字体未有安装科学,假设数据库字体设置不准确,那么connection字符集转变到database字符集照样丢失编码,原因跟上边一样。

二.为何set names 'gb2312'就足以了呢

set names 'gb2312'也正是这三条语句:

set character_set_client = gb2312;

set character_set_connection = gb2312;

set character_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

若设置set character_set_client = gb2312,那么至少connection的字符集要超越等于gb2312,不然就能够丢掉信息

4.上述三步做正确的话,那么全体中文都被准确地转变来utf8格式存款和储蓄进了数据库,为了适应差别的浏览器,差异的客户端,你可以修改character_set_results来以不一样的编码展现中文字体,由于utf8是大方向,因而web应用是自身要么援救于选择utf8格式突显普通话的。

自己明日在mysql上碰见一个主题材料,大家的字符集是gb2312.在汉语模糊查找时,会有不相干的结果集.

从难点的根本原因深入分析,还恐怕有上面包车型大巴难点。
例:
汉字“不”的第1、2字节ascii值分别为:178与187
汉字“安”的第1、2字节ascii值分别为:176与178
汉字“花”的第1、2字节ascii值分别为:187与168

明白的人一度看出来了:在字符串“安花”中模糊查找字符“不”字时,mysql系统也会感觉两岸合作!

出现那么些难题的开始和结果是:MySQL在询问字符串时是大大小小写不灵动的,在编绎MySQL时相似以ISO-8859字符集作为私下认可的字符集,因此在可比过程中中文编码字符大小写转变造成了这种情景。

方法一:
化解措施是对于富含粤语的字段加上"binary"属性,使之视作二进制比较,举个例子将"name char(10)"改成"name char(10)binary"。

方法二:
万一你利用源码编写翻译MySQL,能够编写翻译MySQL时使用--with--charset=gbk 参数,那样MySQL就能够直接接济汉语寻找和排序了。

方法三:
能够行使 Mysql 的 locate 函数来决断。以上述难点为例,使用方式为:

SELECT * FROM table WHERE locate(field,'李') > 0;
本站使用的就是这种艺术,感到勉强能够。:P

方法四:
把你的Select语句改成那样,SELECT * FROM TABLE WHERE FIELDS LIKE BINARY '%FIND%'即可!

进级的常有,借使想使用“正确”的字符集,照旧先用mysqldump导出成文件,然后导入。

数据库编码格式为utf8,表和字段也都以utf8,存进去的格式是utf-8

只是用命令行工具查询命令select * from 表名; 查询出来的华语是乱码

原因:MySQL客户端根本就不可能以utf8的款式重临数据

减轻如下: SET NAMES GB2312; 在命令行实践就可以解决。

关于GBK、GB2312、UTF8

UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但经常不含BOM。是用于减轻国际上字符的一种多字节编码,它对英文使用8位(即二个字节),中文使用24为(多个字节)来编码。UTF-8蕴涵全球全体国家急需利用的字符,是国际编码,通用性强。UTF-8编码的文字能够在各国辅助UTF8字符集的浏览器上出示。如,假使是UTF8编码,则在别人的英文IE上也能显示汉语,他们不需求下载IE的华语语言帮助包。

GBK是国标GB2312基础上扩大体积后相当GB2312的科班。GBK的文字编码是用双字节来代表的,即无论中、英文字符均使用双字节来表示,为了不相同汉语,将其最高位都设定成1。GBK包括全部粤语字符,是国家编码,通用性比UTF8差,可是UTF8占用的数据库比GBK大。

GBK、GB2312等与UTF8之间都必须经过Unicode编码本领互相调换:

GBK、GB2312--Unicode--UTF8

UTF8--Unicode--GBK、GB2312

对此贰个网址、论坛来讲,尽管英文字符较多,则建议采纳UTF-8节省空间。可是今后无数论坛的插件一般只辅助GBK。

GB2312是GBK的子集,GBK是GB18030的子集

GBK是总结中国和东瀛韩字符的大字符集合

倘要是普通话的网站 推荐GB2312 GBK不经常依旧有一些难点

为了制止全部乱码难点,应该运用UTF-8,未来要支持国际化也相当有利于

UTF-8能够看做是大字符集,它包蕴了多数文字的编码。

应用UTF-8的叁个功利是任哪个地点段的用户(如东方之珠湖北)不供给安装简体中文帮助就会不荒谬阅览你的文字而不会现出乱码。

gb2312是简体粤语的码

gbk援助简体汉语及繁体中文

big5支撑繁体汉语

utf-8扶助大致全部字符

MySQL中提到的多少个字符集

character-set-server/default-character-set:服务器字符集,暗中认可意况下所采用的。

character-set-database:数据库字符集。

character-set-table:数据库表字符集。

开始的一段时期级依次扩张。所以一般景色下只供给设置character-set-server,而在创立数据库和表时不特地钦点字符集,那样统一使用character-set-server字符集。

character-set-client:客户端的字符集。客户端暗许字符集。当客户端向服务器发送请求时,请求以该字符集进行编码。

character-set-results:结果字符集。服务器向客户端再次回到结果如故新闻时,结果以该字符集进行编码。

在客户端,借使未有定义character-set-results,则使用character-set-client字符集作为默许的字符集。所以只要求安装character-set-client字符集。

要拍卖普通话,则能够将character-set-server和character-set-client均设置为GB2312,要是要同期管理多国语言,则设置为UTF8。

至于MySQL的国语难点

杀鸡取蛋乱码的不二等秘书技是,在实行SQL语句以前,将MySQL以下多个类别参数设置为与服务器字符集character-set-server同样的字符集。

character_set_client:客户端的字符集。
character_set_results:结果字符集。
character_set_connection:连接字符集。

设置这四个系列参数通过向MySQL发送语句:set names gb2312

mysql> show variables like '%character%';

-------------------------- --------------------------------
| 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

表达服务器端设置符合规律
然后作者又用linux远程连接mysql,查询结果中文乱码
重新查看编码格局:

mysql> show variables like '%character%';

-------------------------- --------------------------------
| Variable_name | Value |
-------------------------- --------------------------------
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8

历次查询前设置查询结果集编码为utf8 即set character_set_results=utf8

缓和Mysql导入乱码难题

措施一: 通过扩张参数 –default-character-set = utf8 消除乱码难题

C:UsersAdministrator>mysql -uroot -p yktgl < F:YIKATONGapplicationgl.sql --default-character-set=utf8

方法二: 在指令行导入乱码化解

1.mysql>use gl;
2.mysql> set names utf8;
3.mysql>source example.sql
mysql -u root -p --default-character-set=utf8
use dbname
source /root/newsdata.sql

措施三: 直接粘贴sql文件里的代码

  1. 展开SQLyog客户端软件;
  2. 定点到SQL编辑器,然后用记事本张开刚刚导出的SQL文件;
  3. 复制文件中具有SQL语句到SQL编辑器此中,实施那么些SQL代码;

二、导出数据
mysqldump -u root -p --default-character-set=utf8 gl> gl.sql

定义编码导入
mysql -u root -p --default-character-set=utf8 -f discuss_chi 如还是乱码使用二进导入

mysql -u root -p --default-character-set=binary -f discuss_chi<="" p="" style="word-wrap: break-word;">

恐怕十二分,导出和导入都采纳二进格局

导出
mysqldump -u root -p --default-character-set=binary discuss_chi> dis.sql

导入
mysql -u root -p --default-character-set=binary -f discuss_chi

联合字符集保证不乱码:提议中英文情形选取utf8

1.linux系统语言
/etc/sysconfig/i18n
LANG="zh_CN.utf8"

2.mysql客户端
临时:
set names utf8;
永久:
配备文件my.cnf
[client]
default-charater-set=utf8

3.mysql服务端
[mysqld]
character-set-server=utf8

4.mysql建库建表语句
钦赐字符集建库
create database oldboy_utf8 default character set uft8 collate utf8_general_ci;
点名字符集建表
create table student (
id int(4) not null auto_increment,
name char(20) not null,
primary key(id)
)engine=inonodb auto_increment=10 default charset=utf8

5.开销顺序的字符集

模仿将latin1字符集的数据库修改成GBK字符集的实在进程

1.导出表结构

mysqldump -uroot -p --default-character-set=latin1 -d dbname >alltatale.sql
--default-character-set=latin1 以latin1连接 -d只导表结构

2.编辑alltable.sql将latin1改成gbk
sed替换

3.保证数据库不在更新,导出全体数据
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 dbname >alldata.sql

4.展开alldata.sql将set names latin1修改成set names gbk;(或然涂改系统的服务端和客户端)

5.建库

create database dbname default charset bgk;

6.创建表,执行alltable.sql

mysql -uroot -p dbname
7.导入数据
mysql -uroot -dbname < alldata.sql

一,有的时候退换字符集
查看库表的字符集

show create database 库名G;
传说最终的字符集,进行一时修改

set names 库表的字符集

二,永远改换字符集
此地说下不乱码的思维:把linux,Mysql客户端,Mysql服务端,库,表,程序的字符集全体育联合会结(建议utf8)

1,改my.cnf

[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8 #切合5.1及以前版本
character-set-server=utf8 #适合5.5版本
2,linux字符集修改

vim /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
3,库,表

create database test_utf8 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

4,应用程序

挑选utf8版本下载

5,查看当前字符集,字符集全体同一修改成功

show variables like 'character_set%';

MySQL的字符集帮衬(Character Set Support)有四个方面:
1、字符集(Character set)
2、排序方式(Collation)。
对于字符集的帮忙细化到多少个档案的次序:
1、服务器(server)
2、数据库(database)
3、数据表(table)
4、连接(connection)
专注:MySQL对于字符集的钦点能够细化到三个数据库,一张表,一列,应该用如何字符集。
###################################################################

第一问:mysql暗中认可字符集能还是不能够进行退换呢?
1、修改配置文件:
[mysqld]
default-character-set = utf8
default-collation=utf8_general_ci
#character_set_server = utf8
#[client]
#default-character-set=utf8
修改完后,重启mysql的劳动,service mysql restart
2、命令修改(不引进,除非有异乎通常处境)
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
一时设置了表的暗中同意字符集为utf8并且经过UTF-8编码发送查询,存入数据库的还是是乱码。那connection连接层上或者出了难题。

焚林而猎办法是在发送查询前试行一下下边这句: SET NAMES 'utf8';它一定于下边包车型大巴三句发号施令:

SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

小心:具体的参数和MySQL的设置情势以及版本有密切关系,相比较早熟的本子私下认可字符集是utf-8,当然具体怎么定义,可参照官方文书档案。
###################################################################

其次问:查看MySQL暗中同意字符集(暗中认可情况下,mysql的字符集是latin1)
平日,查看系统的字符集和排序情势的设定能够透过下边包车型地铁两条命令:
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation_%';

###################################################################

其三问:古板的先后在开创数据库和数目表时并从未选取那么复杂的安顿,它们用的是暗中同意的计划,那么,暗许的布局从何而来呢?
(1)编写翻译MySQL 时,钦定了叁个MySQL暗中认可的字符集,这几个字符集是 latin1;
(2)安装MySQL 时,能够在配置文件 (my.cnf,或许my.ini) 中内定八个暗中同意的的字符集,如若没钦命,那么些值承继自编写翻译时钦定的;
(3)运转mysqld 时,能够在命令行参数中钦点八个默许的的字符集,借使没内定,那个值承袭自配置文件中的配置,此时 character_set_server 被设定为那个默许的字符集;
(4)当创造二个新的数据库时,除非明显钦赐,这么些数据库的字符集被缺省设定为character_set_server;
(5)当选定了四个数据库时,character_set_database 被设定为这么些数据库暗中认可的字符集;
(6)在那几个数据Curry创建一张表时,表暗中同意的字符集被设定为 character_set_database,也正是以此数据库暗中同意的字符集;
(7)当在表内设置一栏时,除非明显内定,不然此栏缺省的字符集便是表默许的字符集;
简轻松单的总计一下,若是什么地点都不变,那么全体的数据库的全体表的装有栏位的都用 latin1 存款和储蓄,但是大家只要设置 MySQL,一般都会选拔多语言扶助,也正是说,安装程序会自动在铺排文件中把 default_character_set 设置为 UTF-8,那保险了缺省情状下,全数的数据库的全体表的具有栏位的都用 UTF-8 存款和储蓄。
###################################################################

第四问:还应该有如何动静下会出于MySQL的来头促成乱码?
这种情状或然和应用高可用软件照旧插件导致的,比如mysql-proxy等
事例:mysql proxy 乱码难点
有的时候通过proxy连上数据库之后,查到的字符串始终是乱码,固然手工业实践了set names ‘utf8′也从没效益。
消除办法,mysql server必须设置
修改my.cnf文件
[mysqld]

skip-character-set-client-handshake
init-connect='SET NAMES utf8'
default-character-set=utf8
###################################################################

第五问:什么来头还或许会招致乱码难题?
1、浏览器难题
2、代理问题
3、代码字符集难点
4、数据库代理字符集难题

MySQL管理连接时,外部连接发送过来的SQL请求会根据以下依次实行调换: character_set_client //客户连接所采纳的字符集...

MySQL4.1会同以上版本中中文难点比较麻烦,不常候在QT中利用会并发问号恐怕乱码,未来验证一下在Qt中什么科学地包容使用。 先在MySQL中建表,使用汉语,一般景况下就三种,GB(GB2312或许GBK)只怕UTF8三种。二种的缓慢解决措施是一般的,这里大家以GBK为例表明。

static QTextCodec* codec(MYSQL* mysql)
{
  return QTextCodec::codecForName("GBK");
#if MYSQL_VERSION_ID >= 32321
  QTextCodec* heuristicCodec = QTextCodec::codecForName(mysql_character_set_name(mysql));
  if (heuristicCodec)
    return heuristicCodec;
#endif
  return QTextCodec::codecForLocale();
}
//然后,重新编译qt的mysql驱动,这里就不多说了,请查看Qt相关文档

本文由新浦京81707con发布于首页,转载请注明出处:mysql字符集乱码问题,的中文问题解决方法

关键词: 新浦京81707con Mysql QT

上一篇:一个简单的memcache类

下一篇:没有了