创建三个表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. web前端开发常用工具

    http://www.gbin1.com/technology/javautilities/20120806-resource-for-front-end-developer/ 冒泡样式 http:/ ...

  2. 转: JavaScript函数式编程(二)

    转: JavaScript函数式编程(二) 作者: Stark伟 上一篇文章里我们提到了纯函数的概念,所谓的纯函数就是,对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环 ...

  3. javascript第三课underfind和类型获取

    1.underfind一般发生于变量定义之后未赋值,因此变量的值就为underfind 2.var obj=new object(); 此时使用obj点,可以获取到obj对象的一些方法,使用alert ...

  4. iOS_根据文字字数动态确定Label宽高

    iOS7中用以下方法 CGSize 替代过时的iOS6中的- (CGSize)sizeWithFont:(UIFont *)font 方法 // iOS7_API_根据文字 字数动态确定Label宽高 ...

  5. Freedur为什么会免费?

    难道没人看看他们的官方站点吗? Freedur倒闭了...... 一个中国人,Chris Lee,作为Freedur的会计师,窃取了公司的银行帐号.并将Freedur的官方站点指向自己的空间.而且声称 ...

  6. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  7. 树形dp-hdu-4714-Tree2cycle

    题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4714 题目意思: 给一棵树,去掉一条边和增加一条边的花费都为1,求最小的花费,使该树变成一个环. 解 ...

  8. KMP模式匹配 三(弦)

    原文请訪问我的博客:xiaoshig.sinaapp.com KMP模式匹配 三(串) Time Limit:1000MS     Memory Limit:131072KB     64bit IO ...

  9. oracle11g+ef+vs2013做的项目在部署的时候碰到的问题

    最近公司做一个项目,用到了ef和oracle11g,开发工具用的是vs2013,开发完成后,在本机上完美运行,但是,当到了要到服务器上部署的时候,就出了问题,服务器环境是server08R2,开发环境 ...

  10. Quartz 2D 概述

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境.我们可以使用Quartz 2D API来实现许多功能,如基本路径的绘制.透明度.描影.绘制阴影.透明层.颜色管理.反锯齿 ...