Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL字符集中文乱码

MySQL字符集中文乱码解析

作者:张松坡坡坡坡

这篇文章主要给大家解析了MySQL字符集中文乱码的问题,文章通过代码示例讲解的非常详细,对我们的学习或工作有一定的帮助,需要的朋友可以参考下

问题描述

假设有三个表test_gbk,test_utf8,test_latin1,创建的时候字符集分别为gbk,utf8,latin1。表结构为

FieldTypeNullKeyDefaultExtra
namevarchar(512)YESNULL

"中"字的gbk十六进制表示为:0xd6 d0utf8 16进制表示为:0xe4 b8 ad

问题1

执行下列语句:

set names 'latin1'; 
insert into test_latin1 values( '中');   //此处'中'为gbk格式
select name from test_latin1;

结果是乱码,还是正常显示?

问题2

执行下列语句:

set names 'gbk'; 
insert into test_latin1 values( '中');  //此处'中'为gbk格式
select name from test_latin1;

结果是乱码,还是正常显示?

问题3

执行下列语句:

set names 'latin1'; 
insert into test_utf8 values( '中');  //此处'中'为gbk格式
select name from test_utf8;

结果是乱码,还是正常显示?

原理篇

字符集介绍

为了解释上述问题,首先要了解字符集为何物。字符集也叫字符编码,就是将字符集合一一映射成一个数。以下简单介绍一下几种字符集:

基础ASCII编码:

0x00-0x7F表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

latin1编码:

单字节编码,编码范围是0x00-0xFF0x00-0x7F,和ASCII保持一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。

gbk编码:

使用一字节和双字节编码,0x00–0x7F范围内是一位,和ASCII保持一致。双字节的第一字节范围是0x81-0xFE(不含0x800xFF)。

utf8编码:

使用一至四字节编码,0x00–0x7F范围内是一位,和ASCII保持一致。其它字符用二至四个字节变长表示。

字符集编码转换举例:

0xB1(latin-1) ->'±'-> 0xC2 B1 (utf8)

两个重要的点

比如gbk编码中的中文字符,转成latin-1编码时,就找不到对应的二进制编码。MySQL做字符集转换的时候,gbk中文字符->latin-1,很多就转成'?'号(0x3f),这种大集合转成小集合,基本是不可逆的。

MySQL执行过程

对一个MySQL的执行过程,字符集转换,一般涉及到一下三个步骤:

当执行set names "charset"; 相当于把character_set_client, character_set_connection,character_set_results 统一设置为"charset"

终端显示字符集

此外如果你用securecrt终端来显示的话,如果不想乱码的话,appearance->character encoding也需要设置成正确的字符集。

问题详解

问题1

执行下列语句:

set names 'latin1'; 
insert into test_latin1 values( '中');   //此处'中'为gbk格式
select name from test_latin1;

结果是乱码,还是正常显示?

答:结果是正常显示。

执行流程如下:

问题2

执行下列语句:

set names 'gbk'; 
insert into test_latin1 values( '中');  //此处'中'为gbk格式
select name from test_latin1;

结果是乱码,还是正常显示?

答:结果是乱码。

执行流程如下:

问题3

执行下列语句:

set names 'latin1'; 
insert into test_utf8 values( '中');  //此处'中'为gbk格式
select name from test_utf8;

结果是乱码,还是正常显示?

答:正常显示。

执行流程如下:

终极解决方案

从上面的问题执行流程来看,有没有终极解决方案呢?其实很简单,表创建的字符集和set names都设置成同一个字符集,就基本可以满足输入数据不会在转换过程中失真,也就是说输入是什么,输出就是什么。建议有中文的都设置成utf8字符集,一劳永逸。

以上就是MySQL字符集中文乱码解析的详细内容,更多关于MySQL字符集中文乱码的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文