MySQL2.字符集

此节记录下MySQL出现乱码的原因。还是参考小册子~

字符集简介

计算机中只能存储二进制数据,建立字符与二进制数据的映射关系来存储字符。

从两方面考虑:
1.界定清楚字符范围,即哪些字符映射成二进制数据
2.怎么映射
将一个字符映射成一个二进制数据的过程叫做编码,将二进制数据映射到字符叫做解码

人们抽象出一个字符集的概念来描述某个字符范围的编码规则。如用0001代表a字符

重要的字符集

  • ASCII
    共128个字符,使用1个字节来编码
  • ISO 8859-1 latin1
    256个字符
  • GB2312
    兼容ASCII,采用变长编码方式(表示一个字符需要的字节数可能不同),2个字节
  • GBK
    只是对GB2312作了扩充
  • utf8
    收录地球上所有能想到的字符,采用变长编码,一个字符需要使用1~4个字节。

MySQL中支持的字符集和排序规则

utf8 utfmb4

在MySQL中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能。

所以MySQL中定义了两个概念:

  • utf8mb3:只使用1~3个字节表示字符,即utf8
  • utf8mb4:使用1~4个字节表示字符

字符集和比较规则的应用

各个级别的字符集和比较规则

MySQL有4个级别的字符集和比较规则

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

服务器级别:可以在启动服务器程序时通过启动选项或者在服务器程序运行过程中修改如下配置,

character_set_server=gbk
collation_server=gbk_chinese_ci

数据库级别:在创建和修改数据库的时候可以指定字符集和比较规则。

CREATE DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];

ALTER DATABASE 数据库名
    [[DEFAULT] CHARACTER SET 字符集名称]
    [[DEFAULT] COLLATE 比较规则名称];

SHOW VARIABLES LIKE 'character_set_database';    

表级别:在创建和修改表的时候指定。如果没有指定,则默认使用该表所在的库的字符集。

列级别:对于存储字符串的列,同一个表中的不同列也可以有不同的字符集和比较规则

CREATE TABLE 表名(
    列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称],
    其他列...
);

ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集名称] [COLLATE 比较规则名称];

修改字符集或仅修改比较规则

字符集和比较规则是互相有联系的

  • 只修改字符集,比较规则将变为修改后的字符集默认的比较规则
  • 只修改比较规则,字符集将变为修改后的比较规则的字符集

MySQL客户端和服务器通信中的字符集

从MySQL客户端向服务器发送请求到返回结果这个过程中经过3个系统变量:

  • character_set_client 请求时使用的字符集
  • character_set_connection 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
  • character_set_results 服务器向客户端返回数据时使用的字符集

服务器认为客户端发送过来的请求时用character_set_client
服务器将把得到的结果集使用character_set_results返回给客户端;
character_set_connection只是服务器在将请求的字节串从character_set_client转换为character_set_connection时使用,要注意的是该字符集包含的字符范围一定涵盖请求中的字符。

为此,MySQL提供了set names 字符集名来统一这3个字符。

比较规则

作用通常体现在比较字符串大小的表达式以及某个字符串列进行排序,所以也称为排序规则。

MySQL2.字符集乱码的更多相关文章

  1. MySQL字符集乱码详解

    对于MySQL数据库中出现乱码经常是新手碰到的一个头痛的问题,不知道为什么经常出现中文乱码. 1.对于所谓的数据库中乱码,其实这中说法是错误的,只是我们不认识服务器给我们的字符.其实还是原来的字符?那 ...

  2. mysql proxy 数据库读写分离字符集乱码

    mysql proxy 数据库读写分离字符集乱码 解决办法 在对应配置后端数据库服务器的配置.cnf中加入如下代码 init-connect='SET NAME UTF8' skip-characte ...

  3. springboot字符集乱码

    入门扫盲:https://www.2cto.com/database/201701/584442.html 1.修改springweb类bug 2.数据库连接配置 3.数据库字符集 https://w ...

  4. 常见字符集&乱码问题

    字符集 常用字符集分类 ASCII及其扩展字符集 作用:表语英语及西欧语言. 位数:ASCII是用7位表示的,能表示128个字符:其扩展使用8位表示,表示256个字符. 范围:ASCII从00到7F, ...

  5. MySQL字符集乱码

    学数据库,最让人丧气的就是字符集的问题了,一旦出问题,就会有砸电脑的冲动,特别是在修改很多次字符集后依然不成功的时候! 我用的数据库软件是MySQL 5.1.28.最初出问题的时候,是这样的: 情景一 ...

  6. 字符集乱码问题:ISO-8859-1和GBK

    问题,引用百度知道的问题吧: http://zhidao.baidu.com/question/51342167.html?qbl=relate_question_0&word=%C3%84% ...

  7. mysql字符集乱码问题

    程序错误截图如下: 分析:我们mysql数据库没有设置默认编码, 导致创建的库字符集为 latin1,然而我们创建表的时候,指定字符集为其他的,比如utf8 我的解决思路:把数据库的编码修改为utf8 ...

  8. Python 爬虫 字符集乱码问题

    解决办法: http://worldant.blog.sohu.com/251745784.html 爬虫爬下来的源代码和网页的源代码不一样,可以先把爬下来的代码输出或保存在文件中,然后再写正则匹配表 ...

  9. MYSQL 解决中文字符集乱码问题的方法

    修改 /etc/mysql/my.cnf 增加内容 [client] default-character-set = utf8mb4 [mysql] default-character-set = u ...

随机推荐

  1. MySQL数据库执行计划(简单版)

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL数据库执行计划简单版时间:2019年2月25日内容:MySQL数据库执行计划简单版重点:MySQL ...

  2. vue 父子之间的通讯

    //父组件<template>     <Button @click='openChild'><Button>      <child-modal :moda ...

  3. CSS中字距,词距,首行缩进,字体大小,排版相关问题的探讨

    先说明下,这是在谷歌浏览器下字体显示等问题做个研究,火狐下有点差异,不过火狐占有率低,而且显示的没有谷歌那么合理,不管它先.IE卡的要死,半死不活,也懒得深入研究这些细节,字体排版上不是强迫症,差别也 ...

  4. 收藏了8年的PHP优秀资源,都给你整理好了

    https://segmentfault.com/a/1190000018071558 最后更新于 2019.02.12 以下是我整理好的 PHP 资源,各位看官拿去用,不用再自己找了. 每周在 Gi ...

  5. linux定时备份学习笔记

    1.iterm2链接远程中文乱码 shh端vi ~/.bash_profile export LC_CTYPE=en_US.UTF-8 source ~/.bash_profile   2.WARNI ...

  6. Zookeeper+Kafka集群部署(转)

    Zookeeper+Kafka集群部署 主机规划: 10.200.3.85  Kafka+ZooKeeper 10.200.3.86  Kafka+ZooKeeper 10.200.3.87  Kaf ...

  7. ArrayList如何扩容?

    1.调用ArrayList的参构造方法,此时集合内部是一个空数组 transient Object[] elementData; private static final Object[] DEFAU ...

  8. JSP元素介绍

    1.HTML注释 <!--这个HTML注释--> 2.JSP注释 <% --这是JSP注释-- %> 3.声明 用于在页面中定义变量或方法 <% ! String use ...

  9. 数据分析三剑客之pandas

    Pandas 引入 前面一篇文章我们介绍了numpy,但numpy的特长并不是在于数据处理,而是在它能非常方便地实现科学计算,所以我们日常对数据进行处理时用的numpy情况并不是很多,我们需要处理的数 ...

  10. ReactNative开发笔记(持续更新...)

    本文均为RN开发过程中遇到的问题.坑点的分析及解决方案,各问题点之间无关联,希望能帮助读者少走弯路,持续更新中... (2019年3月29日更新) 原文链接:http://www.kovli.com/ ...