mysql字符集编码乱码测试如下

创建三个表tb_latin1,tb_utf8,tb_gbk,编码分别为latin1/utf8/gbk

“你好a”字符串编码如下
GBK : %C4%E3 %BA%C3 %61
UTF-8 : %E4%BD%A0 %E5%A5%BD %61

测试代码如下

<?php
//fileencoding=gb2312
mysql_query("set names gbk");
mysql_query("insert into test.tb_latin values(‘gbk‘, ‘你好a‘)");
/*
    连接的字符集是GBK,一个字符由一到两个字节表示,传入 %C4%E3 %BA%C3 %61
    存储的字符集是latin1,一个字符由一个字节表示

    mysql将传入的三个字符转换为latin1的三个字符变成 %3F(找不到对应的转换对应表表) %3F %61

    导致数据存储错误(??a) (存储占用3字节)
*/
mysql_query("insert into test.tb_utf8 values(‘gbk‘, ‘你好a‘)");
/*
    连接的字符集是GBK,一个字符由一到两个字节表示,传入 %C4%E3 %BA%C3 %61
    存储的字符集是utf8,一个字符由一到四个字节表示

    mysql将传入的三个字符转换为utf8的三个字符变成 %E4%BD%A0 %E5%A5%BD %61(存储占用7字节)

    读取时连接设置为UTF-8和GB2312都可以,但指定为latin1会出现转码失败返回错误内容(??a)
    UTF-8返回7字节,GB2312返回5字节
*/
mysql_query("insert into test.tb_gbk values(‘gbk‘, ‘你好a‘)");
/*
    连接的字符集是GBK,一个字符由一到两个字节表示,传入 %C4%E3 %BA%C3 %61
    存储的字符集是GBK,保存为 %C4%E3 %BA%C3 %61 存储占用5字节

    读取时连接设置为UTF-8和GB2312都可以,但指定为latin1会出现转码失败返回错误内容(??a)
    UTF-8返回7字节,GB2312返回5字节
*/
?>
<?php
//fileencoding=gb2312
mysql_query("set names latin1");
mysql_query("insert into test.tb_latin values(‘gblatin1‘, ‘你好a‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %C4 %E3 %BA %C3 %61
    存储的字符集是latin1,一个字符由一到四个字节表示,存储为 %C4 %E3 %BA %C3 %61 (存储占用5字节)

    读取时连接编码为latin1,前端获取五个字符(%C4 %E3 %BA %C3 %61)
        如果vim(term)环境如果正好是gb2312编码环境则显示文本“你好a”
        如果vim(term)显示环境编码为latin1,显示(乱码)
        如果vim(term)语言环境为utf8,转码(由latin1转UTF8)会失败显示(???a)
    读取时连接为gbk,mysql无法将五个字符转成5个相应的gbk编码,返回(????a)错误内容
    读取时连接为utf8,mysql将五个字符转换为 %C3%84 %C3%A3 %C2%BA %C3%83 %61 错误内容,具体呈现看term编码
*/
mysql_query("insert into test.tb_utf8 values(‘gblatin1‘, ‘你好a‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %C4 %E3 %BA %C3 %61
    存储的字符集是utf8,一个字符由一个字节表示,存储为 %C3%84 %C3%A3 %C2%BA %C3%83 %61 (存储占用5字节)

    读取时连接编码为latin1,前端获取五个字符(%C4 %E3 %BA %C3 %61) (mysql把错误的编码转为latin1)
        如果vim(term)环境如果正好是gb2312编码环境则显示文本“你好a”
        如果vim(term)显示环境编码为latin1,显示(乱码)
        如果vim(term)语言环境为utf8,转码(由latin1转UTF8)会失败显示(???a)
    读取时连接为gbk,mysql无法将五个字符转成5个相应的gbk编码,返回(????a)错误内容
    读取时连接为utf8,mysql将五个字符转换为 %C3%84 %C3%A3 %C2%BA %C3%83 %61 错误内容,具体呈现看term编码
*/
mysql_query("insert into test.tb_gbk values(‘gblatin1‘, ‘你好a‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %C4 %E3 %BA %C3 %61
    存储的字符集是gbk,一个字符由一到两个字节表示,mysql无法将五个字符转成5个相应的gbk编码,存储(????a)错误内容
*/
?>
<?php
//fileencoding=utf8
mysql_query("set names utf8");
mysql_query("insert into test.tb_latin1 values(‘utf8‘, ‘你好‘)");
/*
    连接的字符集是UTF-8,一个字符由一到四个字节表示,传入 %E4%BD%A0 %E5%A5%BD %61
    存储的字符集是latin1,一个字符由一个字节表示

    mysql将传入的三个字符转换为latin1的三个字符变成 %3F(找不到对应的转换对应表表) %3F %61

    导致数据存储错误(??a) (存储占用3字节)
*/
mysql_query("insert into test.tb_utf8 values(‘utf8‘, ‘你好‘)");
/*
    连接的字符集是UTF-8,一个字符由一到四个字节表示,传入 %E4%BD%A0 %E5%A5%BD %61
    存储的字符集是utf8,一个字符由一到四个字节表示,存储 %E4%BD%A0 %E5%A5%BD %61

    读取时连接设置为UTF-8和GB2312都可以,但指定为latin1会出现转码失败返回错误内容(??a)
    UTF-8返回7字节,GB2312返回5字节
*/
mysql_query("insert into test.tb_gbk values(‘utf8‘, ‘你好‘)");
/*
    连接的字符集是UTF-8,一个字符由一到四个字节表示,传入 %E4%BD%A0 %E5%A5%BD %61
    存储的字符集是GBK,保存为 %C4%E3 %BA%C3 %61 存储占用5字节

    读取时连接设置为UTF-8和GB2312都可以,但指定为latin1会出现转码失败返回错误内容(??a)
    UTF-8返回7字节,GB2312返回5字节
*/
?>
<?php
//fileencoding=utf8
mysql_query("set names latin1");
mysql_query("insert into test.tb_latin values(‘latin1‘, ‘你好‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %E4 %BD %A0 %E5 %A5 %BD %61
    存储的字符集是latin1,一个字符由一个字节表示,存储为 %E4 %BD %A0 %E5 %A5 %BD %61 (存储占用7字节)

    读取时连接编码为latin1,前端获取七个字符(%E4 %BD %A0 %E5 %A5 %BD %61)
        如果vim(term)环境如果正好是UTF8编码环境则显示文本“你好a”
        如果vim(term)显示环境编码为latin1,显示(乱码)
        如果vim(term)语言环境为gbk,乱码
    读取时连接为gbk,mysql无法将七个字符转成对应的七个相应的gbk编码,返回(??????a)错误内容
    读取时连接为utf8,mysql将七个字符转换为 %c3%a4 %c2%bd %c2%a0 %c3%a5 %c2%a5 %c2%bd %61 内容返回(显示错误)
*/
mysql_query("insert into test.tb_utf8 values(‘latin1‘, ‘你好‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %E4 %BD %A0 %E5 %A5 %BD %61
    存储的字符集是utf8,一个字符由一个到四个字节表示,存储为 %c3%a4 %c2%bd %c2%a0 %c3%a5 %c2%a5 %c2%bd %61 (存储占用13字节)

    读取时连接编码为latin1,前端获取五个字符(%E4 %BD %A0 %E5 %A5 %BD %61) (mysql把13个字节的7个字符转为latin1)
        如果vim(term)环境如果正好是utf8编码环境则显示文本“你好a”
        如果vim(term)显示环境编码为latin1,显示(乱码)
        如果vim(term)语言环境为gbk,乱码
    读取时连接为gbk,mysql无法将7个字符转成7个相应的gbk编码,返回(??????a)错误内容
    读取时连接为utf8,mysql将五个字符转换为 %c3%a4 %c2%bd %c2%a0 %c3%a5 %c2%a5 %c2%bd %61 错误内容,具体呈现看term编码
*/
mysql_query("insert into test.tb_gbk values(‘latin1‘, ‘你好‘)");
/*
    连接的字符集是latin1,一个字符由一个字节表示,传入 %E4 %BD %A0 %E5 %A5 %BD %61
    存储的字符集是gbk,一个字符由一到两个字节表示,mysql无法将7个字符转成7个相应的gbk编码,存储(??????a)错误内容
*/
?>

数据库查询如下

mysql> select charset, data,length(data) from tb_latin;
+----------+---------+--------------+
| charset  | data    | length(data) |
+----------+---------+--------------+
| gbk      | ??a     |            3 |
| gblatin1 | ????a   |            5 |
| utf8     | ??a     |            3 |
| latin1   | ??????a |            7 |
+----------+---------+--------------+
4 rows in set (0.00 sec)

mysql> select charset, data,length(data) from tb_utf8;
+----------+---------+--------------+
| charset  | data    | length(data) |
+----------+---------+--------------+
| gbk      | ???a   |            7 |
| gblatin1 | ????a   |            9 |
| utf8     | ???a   |            7 |
| latin1   | ??????a |           13 |
+----------+---------+--------------+
4 rows in set (0.00 sec)

mysql> select charset, data,length(data) from tb_gbk;
+----------+---------+--------------+
| charset  | data    | length(data) |
+----------+---------+--------------+
| gbk      | ???a   |            5 |
| gblatin1 | ????a   |            5 |
| utf8     | ???a   |            5 |
| latin1   | ??????a |            7 |
+----------+---------+--------------+

附测试代码如下:

<?php
//...
mysql_query("set names latin1");
$result=mysql_query("SELECT * FROM test.tb_gbk where charset=‘latin1‘");
while($row=mysql_fetch_row($result))
{
var_dump($row);
echo bin2hex($row[1]);
}
?>
时间: 2024-10-14 05:16:06

mysql字符集编码乱码测试如下的相关文章

MySQL字符集编码

MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并参考了凯哥的文章,总结了这篇博文.本文主要是对mysql常见的字符集问题进行整理,如有错误,请大家指正. 1.MySQL字符集编码简介 谈到字符集,总会跟编码扯上关系,有关字符集和编码的理论知识请参见我之前的文章.MySQL内部是支持多种字符集的,这里就不再严格区分字符集和编码的概念了.同时,MySQL中

linux下mysql字符集编码问题的修改

安装完的MySQL的默认字符集为 latin1 ,为了要将其字符集改为用户所需要的(比如utf8),就必须改其相关的配置文件:由于linux下MySQL的默认安装目录分布在不同的文件下:不像windows一样放在同一目录下,只需修改其中的my.ini文件,重起后就生效了:所以先来看看linux下MySQL的数据库文件.配置文件和命令文件分别在不同的目录 : 1.数据库目录,其所创建的数据库文件都在该目录下 /var/lib/mysql/ 2.配置文件 (mysql.server命令及配置文件所在

java字符集编码乱码问题

博客分类: web javajspservlet 最近做网页这块时碰到了正文字符乱码问题.别看这小小的一个问题,对我来说却花费了好长一段时间.现在让我慢慢分析它吧(说实话.这些有部分是从网上找的,但都是自己亲自打出来的.这样对自己来说不仅理解了而且还加深了印象).  在java内部运算中.涉及到所有字符串都会被转化UTF-8编码来运算,然而.在被java转化之前,字符串是怎么样的字符集呢?其实java总是根据操作系统的默认编码字符集来决定字符串的初始编码的:而且java系统的输入输出都是采取操作

mysql 字符集-----解决乱码

客服端            连接器                服务器 client ------到------- connection ------到----------   server character_set_client:设置客服端字符集,如set character_set_client=utf8;设置为utf8编码 character_set_connection:设置连接器字符集 character_set_result:设置数据库取回的往回送的字符集. 一般需要满足字符集

Mysql查看编码方式

查看数据库的字符集 show variables like 'character\_set\_%'; 输出: +--------------------------+--------+ | Variable_name            | Value  | +--------------------------+--------+ | character_set_client     | latin1 | | character_set_connection | latin1 | | cha

Mysql查看编码方式专题

一. 查看数据库的字符集 show variables like 'character\_set\_%'; 输出: +--------------------------+--------+ | Variable_name            | Value  | +--------------------------+--------+ | character_set_client     | latin1 | | character_set_connection | latin1 | |

Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)

一.登录MySQL查看用SHOW VARIABLES LIKE ‘character%’;下字符集,显示如下:+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connectio

MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据库字符集.character-set-table:数据库表字符集.优先级依次增加.所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-server字符集.character-set-client:客户端的字符

Mysql基础之字符集与乱码

原文:Mysql基础之字符集与乱码 Mysql的字符集设置非常灵活 可以设置服务器默认字符集 数据库默认字符集 表默认字符集 列字符集 如果某一个级别没有指定字符集,则继承上一级. 以表声明utf8为例: 存储的数据在表中,最终是utf8; 1:告诉服务器,我给你发送的数据是什么编码的? character_set_client 2:告诉转换器,转换成什么编码? Character_set_connection 3:查询的结果用什么编码? Character_set_results 如果以上3者