免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4970 | 回复: 5
打印 上一主题 下一主题

关于mysql 编码一些验证 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-16 13:28 |只看该作者 |倒序浏览
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                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
客户端使用CRT,

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| tpcc               |
+--------------------+
5 rows in set (0.00 sec)


mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A


Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1          |
| test2          |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from test1;
Empty set (0.01 sec)
mysql> desc test1;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(2)      | NO   | PRI | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)


mysql> insert into test1 values(1,'测试'),(2,'测试2'),(3,'测试3');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from test1;
+----+---------+
| id | name    |
+----+---------+
|  1 | 测试    |
|  2 | 测试2   |
|  3 | 测试3   |
+----+---------+
3 rows in set (0.00 sec)
(1)客户端工具utf8,client,connection,results 字符集为gbk
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)


mysql> show variables like '%character%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | gbk                              |
| character_set_connection | gbk                              |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | gbk                              |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)


mysql> select * from test1;
+----+-------+
| id | name  |
+----+-------+
|  1 |       |
|  2 | 2     |
|  3 | 3     |
+----+-------+
3 rows in set (0.01 sec)
结论出现错误,但是没有乱码,应该是客户端工具不能识别,修改工具编码格式gb2312后如下
mysql> select * from test1;
+----+-------+
| id | name  |
+----+-------+
|  1 | 测试      |
|  2 | 测试2     |
|  3 | 测试3     |
+----+-------+
3 rows in set (0.00 sec)
插入几笔
mysql>  insert into test1 values (4,'浴4');
Query OK, 1 row affected (0.01 sec)


mysql> select * from test1;
+----+-------+
| id | name  |
+----+-------+
|  1 | 测试      |
|  2 | 测试2     |
|  3 | 测试3     |
|  4 | 浴4    |
+----+-------+
4 rows in set (0.00 sec)
修改客户端工具编码
mysql> select * from test1;
+----+-------+
| id | name  |
+----+-------+
|  1 |       |
|  2 | 2     |
|  3 | 3     |
|  4 | ?4    |
+----+-------+
4 rows in set (0.00 sec)
出现乱码

修改client,connection,results字符集为utf8
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)


mysql> select * from test1;
+----+---------+
| id | name    |
+----+---------+
|  1 | 测试    |
|  2 | 测试2   |
|  3 | 测试3   |
|  4 | 浴4     |
+----+---------+
4 rows in set (0.00 sec)

正常。

(2)修改client gbk
mysql> show variables like '%character%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | gbk                              |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
mysql> select * from test1;
+----+---------+
| id | name    |
+----+---------+
|  1 | 测试    |
|  2 | 测试2   |
|  3 | 测试3   |
|  4 | 浴4     |
+----+---------+
4 rows in set (0.00 sec)

mysql> insert into test1 values (5,'测试5');
Query OK, 1 row affected (0.00 sec)


mysql> select * from test1;
+----+------------+
| id | name       |
+----+------------+
|  1 | 测试       |
|  2 | 测试2      |
|  3 | 测试3      |
|  4 | 浴4        |
|  5 | 娴嬭瘯5    |
+----+------------+
5 rows in set (0.00 sec)
出现乱码,过程,首先经过client的gbk编码经过,connection进入数据库,因为connection是utf8编码,所以需要转换,因为utf8是3字节编码,转换后,进入数据库,查询的时候经过connection传出客户端显示,因为results是utf8,所以无法正常转出。
接着修改results为gbk
mysql> set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;
+----+---------+
| id | name    |
+----+---------+
|  1 |         |
|  2 | 2       |
|  3 | 3       |
|  4 | ?4      |
|  5 | 测试5   |
+----+---------+
5 rows in set (0.00 sec)
第五个结果正常,因为经过connection 到results需要从utf8转换成gbk,可以正常显示。
特例,超过3字节
mysql> set character_set_results=utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 values (6,'测试长字符经过');
Query OK, 1 row affected (0.00 sec)


mysql> select * from test1;
+----+--------------------------------+
| id | name                           |
+----+--------------------------------+
|  1 | 测试                           |
|  2 | 测试2                          |
|  3 | 测试3                          |
|  4 | 浴4                            |
|  5 | 娴嬭瘯5                        |
|  6 | 娴嬭瘯闀垮瓧绗︾粡杩           |
+----+--------------------------------+
6 rows in set (0.00 sec)


mysql> set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)


mysql> select * from test1;
+----+----------------------+
| id | name                 |
+----+----------------------+
|  1 |                      |
|  2 | 2                    |
|  3 | 3                    |
|  4 | ?4                   |
|  5 | 测试5                |
|  6 | 测试长字符经       |
+----+----------------------+
6 rows in set (0.00 sec)
结论:第六个已经少了一个汉字
因为经过connection utf8到results gbk的转换是,从3字节到2字节,会丢失一部分数据,因此不完整了。

总结:client ,connection,results需要一致,才能保证输入和输出完整。
         尽量这3个值和服务器系统编码一致。
有不正确和需要补充的,请大家指出,谢谢!

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
2 [报告]
发表于 2016-06-16 16:01 来自手机 |只看该作者
全都utf8,
所有不执行符合标准的配置,统统发工作错误提示单,同时相关负责人直接扣20块钱工资

论坛徽章:
18
2015亚冠之阿尔希拉尔
日期:2015-06-02 09:56:10数据库技术版块每日发帖之星
日期:2016-08-13 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-03-19 06:20:00数据库技术版块每日发帖之星
日期:2015-12-25 06:20:35数据库技术版块每日发帖之星
日期:2015-12-25 06:20:35数据库技术版块每日发帖之星
日期:2015-12-25 06:20:35数据库技术版块每日发帖之星
日期:2015-09-12 06:20:00数据库技术版块每日发帖之星
日期:2015-09-11 06:20:00ChinaUnix专家徽章
日期:2015-06-30 16:29:48ChinaUnix专家徽章
日期:2015-06-30 16:29:342015年中国系统架构师大会
日期:2015-06-29 16:11:28
3 [报告]
发表于 2016-06-16 17:42 |只看该作者
回复 2# shang2010
不给切换 字符集   直接utf8  如果想用其他的  做数据迁移    一句话 不给改

   

论坛徽章:
0
4 [报告]
发表于 2016-06-17 08:02 |只看该作者
6666666,就是想测试哪种情况下会有什么的现象?回复 2# shang2010


   

论坛徽章:
2
操作系统版块每日发帖之星
日期:2016-06-20 06:20:00数据库技术版块每日发帖之星
日期:2016-06-20 06:20:00
5 [报告]
发表于 2016-06-17 12:34 |只看该作者
学习了  mysql很神奇啊

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
6 [报告]
发表于 2016-06-24 17:31 |只看该作者
三码合一
\s
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP