热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql字符集基础知识梳理

接着上一篇继续来一篇关于mysql字符设置等问题学习笔记,这篇就不说什么废话了,直接进入正题,不过还是感谢十八哥的无私分享!我们首先看看mysql整个数据存储和读取一个流程:连接器

  接着上一篇继续来一篇关于mysql字符设置等问题学习笔记,这篇就不说什么废话了,直接进入正题,不过还是感谢十八哥的无私分享!

  我们首先看看mysql整个数据存储和读取一个流程:

    ,

  

  连接器(connection)

         特性:链接客户端与服务器

         过程:

     客户端的字节先发给连接器,

           连接器选择一种编码将其转换,临时存储

           再次转换成 服务器西药的编码,并正真的存储在服务器上  

    现在,我们以mysql这个流程说一下,在存入数据和读取数据时的编码转换。

         如图

存入数据:

,

,

读取数据:

,

    A:client:GBK --->   连接器接受并转为utf8  ---->数据库服务器和连接器编码相同不用转码直接给服务器

    B:client:GBK --->   不转 ---->连接器--->转码---->数据库服务器存储

    C:client:GBK <--->不转 <----连接器<---转码<----数据库服务器存储

    以上就是当client和sever编码不一致存储读取时,连接器在其中进行转码的过程。当然,在client和sever编码一致时,连接器就不必转码,直接发送数据存储就可以了,这里就不做图片说明。

  在这个其中就涉及到了client端设置客户端、连接器端、服务器端编码的问题?

    我们可能经常使用这句命令:set names utf8; 可是其中的具体意义是什么?

         我们首先看看这条命令:show variables like ‘%char%’

mysql> show variables like ‘%char%‘;
+--------------------------+-----------------------------------+
| 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       | D:\phpStudy\MySQL\share\charsets\ |
+--------------------------+-----------------------------------+

其中的:

         character_set_client       指的就是设置的客户端编码

         character_set_connection      指的是连接器设置的编码

         character_set_results          返回数据设置的编码(这是在取出数据返回到client时设置的编码)

         那么,剩下的都是什么意思?

   character_set_database        默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。

         character_set_filesystem        把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的

         character_set_server               数据库服务器的默认字符集

         character_set_system    这个值总是utf8,不需要设置,是为存储系统元数据的字符集

         character_sets_dir           字符集的文件路径         

  如何设置:

    命令是这样的格式: set character_set_client=GBK;

    其他的都是相似的,大家类推即可。

  那么看了上面的mysql> show variables like ‘%char%‘;的设置,我们想知道:为什么有时候我写的中文会乱码,不是一致吗?都是utf8?其实,这是mysql在安装是的一个设置,我们真正执行:

    insert into test values(1,’趴在巨人肩上的矮子’)的时候,一切都以为是UTF8,但是真的就是嘛?

    我们的windows在中国,系统用的是GBK编码,其实我们输入的这几个汉字就是GBK编码的,mysql的整个流程却都是UTF8,这就当然就乱码了,我们可以看看我们的client编码:

  如图:

    ,

  所以,我们就必须设置,让数据库知道,客户端此时要输入的是GBK,这时就可以设置

    set character_set_client=GBK;

    当然,你是要 set names GBK; 我们来看看这条命令的结果,大家就明白了

mysql> set names gbk;
Query OK, 0 rows affected (0.03 sec)

mysql> show variables like ‘%char%‘;
+--------------------------+-----------------------------------+
| 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       | D:\phpStudy\MySQL\share\charsets\ |
+--------------------------+-----------------------------------+
8 rows in set (0.00 sec)

  我们看到character_set_client 、character_set_connection 、character_set_results   都已经设置成了GBK,那就说明:此时连接器、客户端和返回结果都是GBK,那么,插入数据时,就是我们上面流图的第二种情况:

     B:client:GBK --->   不转 ---->连接器--->转码---->数据库服务器存储

  同时,当你需要查看结果时,也不会乱码,因为character_set_results已经是GBK了。这下清楚了吧!

  当然,我们设置set character_set_results=GBK;这样只能保证我们select操作时得到的汉字数据不会乱码,如果没有设置character_set_client,我们的insert照样也会乱码,而且,我们仔细考虑:当你没有设置character_set_client时,你的GBK汉字mysql以utf8存了,此时会怎样?

mysql> show variables like ‘%char%‘;
+--------------------------+-----------------------------------+
| Variable_name            | Value                             |
+--------------------------+-----------------------------------+
| character_set_client     | utf8                              |
| character_set_connection | utf8                              |
| character_set_database   | gbk                               |
| character_set_filesystem | binary                            |
| character_set_results    | gbk                               |
| character_set_server     | utf8                              |
| character_set_system     | utf8                              |
| character_sets_dir       | D:\phpStudy\MySQL\share\charsets\ |
+--------------------------+-----------------------------------+
8 rows in set (0.00 sec)

mysql> insert into tb_1 values(6,‘来了‘,‘男‘,‘百度‘,999,11);
Query OK, 1 row affected, 3 warnings (0.03 sec)

mysql> select * from tb_1;
+----+------+--------+----------+---------+-------+
| id | name | gender | company  | salary  | fanbu |
+----+------+--------+----------+---------+-------+
|  6 |      |        |          |  999.00 |    11 |
|  2 | 李四     | 女      | 腾讯        | 6524.50 |  1000 |
|  3 | 王五     | 男       | 新浪         | 5000.00 |   520 |
|  4 | 赵六     | 女      | 阿里巴巴        | 5600.00 |   300 |
|  5 | 刘思    | 女      | 支付宝        | 3000.00 |   200 |
+----+------+--------+----------+---------+-------+
5 rows in set (0.00 sec)

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

mysql> select * from tb_1;
+----+------+--------+----------+---------+-------+
| id | name | gender | company  | salary  | fanbu |
+----+------+--------+----------+---------+-------+
|  6 |      |        |          |  999.00 |    11 |
|  2 | 李四     | 女      | 腾讯        | 6524.50 |  1000 |
|  3 | 王五     | 男       | 新浪         | 5000.00 |   520 |
|  4 | 赵六     | 女      | 阿里巴巴        | 5600.00 |   300 |
|  5 | 刘思    | 女      | 支付宝        | 3000.00 |   200 |
+----+------+--------+----------+---------+-------+
5 rows in set (0.00 sec)

  可以看到,字节丢失了,我们输入的信息不见了,怎么理解?

    GBK汉字mysql以utf8存了,但是我们已经设置显示结果是GBK,按理来说,utf8的乱码,翻译过来还是GBK的正确啊?

  就像这样:

         假如:王 二进制GBK:0001 –> 存储UTF8 0010

                   取出时:UTF8 0010 -> GBK 0001

         不应该不对啊?

         其实是这样的:

         假如:王 二进制GBK:0001 –> character_set_client没有设置,mysql以为这个0001是UTF8的所以这里存储UTF8 0001 而0001的UTF8对应是个:李,

                   取出时:UTF8 0001(李) -> character_set_results=GBK –>将UTF8的 0001转为了GBK的0110了,此时GBK也不知道这是个什么东西了,GBK没有这个字符,所以无法显示

  注意

    但是很不幸,mysql自带的客户端,这些set names gbk;等命令的设置都只是临时的!!

    当我们,关闭client,重新打开时,我们会发现又乱了,又要重新设置,哎!所以每次使用一定首先设置好这个东西,对于怎样不用这么麻烦?我没有深入的去研究,但是当你确定你很多时候用的是GBK编码或者其他编码时,那么就在安装mysql时注意设置

  好了,就这么多吧,这些笔记,不光只是抄写,也是加入了一些以前自己的认识和验证的猜想,总的感觉就是:这次算是基本弄明白了,这些编码是怎么一回事了。

  如果有什么错误和不明白的地方,亲大家留言,谢谢!睡觉喽,吼吼、、、、、

mysql字符集基础知识梳理


推荐阅读
  • 初探性能优化:入门指南与实践技巧
    在编程领域,常有“尚未精通编码便急于优化”的声音。为了从性能优化的角度提升代码质量,本文将带领读者初步探索性能优化的基本概念与实践技巧。即使程序看似运行良好,数据处理效率仍有待提高,通过系统学习性能优化,能够帮助开发者编写更加高效、稳定的代码。文章不仅介绍了性能优化的基础知识,还提供了实用的调优方法和工具,帮助读者在实际项目中应用这些技术。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • PHP自学必备:从零开始的准备工作与工具选择 ... [详细]
  • 小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限
    小王详解:内部网络中最易理解的NAT原理剖析,挑战你的认知极限 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 如何高效地安装并配置 PostgreSQL 数据库系统?本文将详细介绍从下载到安装、配置环境变量、初始化数据库、以及优化性能的全过程,帮助读者快速掌握 PostgreSQL 的核心操作与最佳实践。文章还涵盖了常见问题的解决方案,确保用户在部署过程中能够顺利解决遇到的各种挑战。 ... [详细]
  • 题目探讨了在无向图中求解点连通数的问题,具体涉及UVA1660和POJ1966两个经典问题。通过最小割算法的应用,分析了如何高效地确定网络中的关键节点和路径,为电缆电视网络的优化设计提供了理论支持。该研究不仅验证了最小割算法的有效性,还为进一步探索复杂网络的连通性和鲁棒性奠定了基础。 ... [详细]
  • 在 POJ1651 的乘法谜题挑战中,如果选手按相反顺序选择卡片,即先选 50,再选 20,最后选 1,则最终得分会有所不同。题目要求输入的第一行包含... 改写后的摘要:在 POJ1651 的乘法谜题挑战中,如果选手按照逆序选取卡片,例如依次选择 50、20 和 1,最终的得分将发生变化。题目首先要求输入的第一行包括... ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 深入解析InnoDB中的多版本并发控制机制
    多版本并发控制(MVCC)是InnoDB存储引擎中的一项关键技术,通过维护数据在不同时间点的多个版本,确保了事务的隔离性和一致性。每个读取操作都能获得一个与事务启动时一致的数据视图,从而提高了并发性能并减少了锁竞争。此外,MVCC还支持多种隔离级别,如可重复读和读已提交,进一步增强了系统的灵活性和可靠性。 ... [详细]
author-avatar
最棒小小丫_635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有