创建三个表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方可显示正确内容) 读取时连接编码为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]);
}
?>
<?php

$a="%c3%a4%c2%bd%c2%a0%c3%a5%c2%a5%c2%bd%61";
$b = urldecode($a);
var_dump(bin2hex($b));
$c = iconv("UTF-8","latin1",$b);
var_dump(bin2hex($c)); ?>

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

  1. MySQL字符集编码

    MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...

  2. 从一个慢查询到MySQL字符集编码

    从一个慢查询到MySQL字符集编码 目录 从一个慢查询到MySQL字符集编码 1. 问题起源 2. MySQL字符集和字符集排序规则 2.1 字符集相关概念 2.2 MySQL中的字符集和字符集排序规 ...

  3. MySQL字符集编码相关

    Windows 10家庭中文版,MySQL  5.7.20,2018-05-07 Part.1 查找数据库的字符集编码 查看MySQL字符集编码:status命令 使用命令行登录MySQL服务器,然后 ...

  4. MySQL从删库到跑路(二)——MySQL字符集与乱码解析

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.字符集与编码 1.字符集简介 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符 ...

  5. java字符集编码乱码问题

    博客分类: web javajspservlet  最近做网页这块时碰到了正文字符乱码问题.别看这小小的一个问题,对我来说却花费了好长一段时间.现在让我慢慢分析它吧(说实话.这些有部分是从网上找的,但 ...

  6. MySQL字符集编码的理解分析

    今天帮同事处理一个棘手的事情,问题是这样的: 无论在客户机用哪个版本的mysql客户端连接服务器,发现只要服务器端设置了 character-set-server = utf8之后, characte ...

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

    安装完的MySQL的默认字符集为 latin1 ,为了要将其字符集改为用户所需要的(比如utf8),就必须改其相关的配置文件:由于linux下MySQL的默认安装目录分布在不同的文件下:不像windo ...

  8. mysql 查看编码方式

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

  9. Mysql查看编码方式

    查看数据库的字符集 show variables like 'character\_set\_%'; 输出: +--------------------------+--------+ | Varia ...

随机推荐

  1. 图像 - 创建 头像V1.0

    byte[] logo //处理群头像信息 //byte[] logoByte = Convert.FromBase64String(logo); ////1.0 System.IO.MemorySt ...

  2. 您在基于 Windows 7 的或基于 Windows Server 2008 R2 的计算机上读取器中插入智能卡时出现错误消息:"设备驱动程序软件未能成功安装"

    http://support.microsoft.com/kb/976832/zh-cn http://support.microsoft.com/kb/976832/zh-tw 症状 当智能卡插入智 ...

  3. Invalidate(TRUE)与Invalidate(FALSE)区别(前者会发送WM_ERASEBKGND消息全部刷新,然后使用WM_PAINT消息绘制,而后者只发送WM_PAINT消息)

    使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息. 使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_P ...

  4. docker 容器管理上

    Docker 容器管理: docker create -it centos //这样可以创建一个容器,但该容器并没有启动: docker start container_id //启动容器后,可以使用 ...

  5. cnn softmax regression bp求导

    内容来自ufldl,代码参考自tornadomeet的cnnCost.m 1.Forward Propagation convolvedFeatures = cnnConvolve(filterDim ...

  6. Windows下使用XManager访问Ubuntu 11.04的设置方法

    1.Download the attached file and upload it to the server. And, enter the following command to update ...

  7. Android Activity 启动模式详解

    最近有群里的朋友问我 Activity的四种启动模式分别是什么意思? 当初因为项目比较忙,草草的解释了下, Api文档中说的也只是一般,在这里就小记一下吧,以便有更多的朋友对Activity启动模式了 ...

  8. div内嵌p,div等块元素出现的问题

    div内嵌p,div等块元素出现的问题 http://caiceclb.iteye.com/blog/428085 div内部块级元素,比如p,div,设置外间距(margin)的话会怎样.本来还纳闷 ...

  9. JSP基础——关于中文乱码问题

    乱码问题十分烦人,今天在写一个登陆的demo时,表单中需要提交的中文姓名,如下代码 <form action="success.jsp" name="success ...

  10. crontab Linux定时器工具

    要使用crontab定时器工具,必须要启动cron服务: service cron start crontab的语法,以备日后救急.先上张超给力的图: crontab各参数说明: -e : 执行文字编 ...