拨开字符编码迷雾系列文章链接:

  1. 拨开字符编码的迷雾--字符编码概述
  2. 拨开字符编码的迷雾--编译器如何处理文件编码
  3. 拨开字符编码的迷雾--字符编码转换
  4. 拨开字符编码的迷雾--MySQL数据库字符编码

1. MySQL字符集和校对规则

MySQL的字符集是用来定义MySQL存储字符串的方式,校对规则(有的软件叫排序规则)则是用来定义了比较字符串的方式。字符集和校对规则是一对多的关系。每种字符集都有一个默认校对规则。

查看数据库支持的字符集:

# 方法1:
SHOW CHARACTER SET; # 方法2:
USE information_schema;
SELECT * FROM CHARACTER_SETS;

查看数据库支持的校对规则:

# 方法1:
SHOW COLLATION; # 方法2:
USE information_schema;
SELECT * FROM collations;

2. MySQL各个级别字符集

MySQL可以对如下字符集进行设置:

  • 服务器级字符集(CHARACTER_SET_SERVER)
  • 数据库级字符集(CHARACTER_SET_DATABASE)
  • 表级字符集
  • 字段级字符集
  • 连接字符集(CHARACTER_SET_CONNECTION),客户端连接数据库所用的字符集。
  • 结果字符集(CHARACTER_SET_RESULTS),存储查询结果(含错误信息)所用的字符集。
  • 客户端字符集(CHARACTER_SET_CLIENT),客户端发送给MySQL服务器的查询语句字符集。
  • 系统字符集(CHARACTER_SET_SYSTEM),用于存储我们新建的或自带的数据库的表、列的名称,默认是UTF-8

服务器级、数据库级、表级、字段级 这4个字符集设置影响到数据库中存储数据的编码。 这4个级别的字符集继承关系为:服务器级 --> 数据库级 --> 表级 --> 字段级, 从左到右,一级继承一级,和C++、Java中的类的继承类似,如果某一级未显式的指定字符集,那么将继承上一级的字符集设置。

2.1 服务器级别字符集设置

服务器级别的字符集可以从下面几个地方指定,从上到下优先级依次增加:

  • 编译MySQL时指定的字符集
  • my.cnf配置文件设置character-set-server
  • mysqld服务启动命令行中指定字符集

影响数据存储的字符集之间的关系:

查看当前数据库的字符集设置:

# 方法1:
SHOW VARIABLES LIKE '%character%'; # 方法2:
USE information_schema;
SELECT * FROM GLOBAL_VARIABLES WHERE VARIABLE_NAME LIKE '%character%';

3. utf8与utf8mb4区别

UTF-8是多字节编码方案,采用1~4个字节来存储一个字符,但在MySQL设计之初,一个字符最多采用3个字节的就可以存储,所以Mysql的设计者将MySQL中的UTF-8字符集(UTF-8其实不是字符集,是字符编码方案,但在MySQL中一直这么叫)设计成了最大长度只能为3. 如图:

但随着Unicode字符集的扩张,出现了需要4个字节才能存储的字符,如果这时仍然使用utf-8(指mysql中的3字节utf-8)来存储这些字符就会出现错误,

如执行INSERT INTO member(memberName)VALUES('

拨开字符编码的迷雾--MySQL数据库字符编码的更多相关文章

  1. Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码

    由于MySQL编码原因会导致数据库出现乱码. 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 &g ...

  2. mysql数据库字符编码修改

    mysql数据库字符编码修改 修改数据库的字符集mysql>use mydb mysql>alter database mydb character set utf8; 创建数据库指定数据 ...

  3. MySQL数据库字符集和整理

    MySQL数据库字符集和整理(2009-11-20 22:23:37) mysql数据库 it    其实这个表在MySQL数据库中通过phpMyAdmin就能看到,icech只是把表格整理了一下方便 ...

  4. MySQL数据库字符集和排序规则的四个级别

    MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...

  5. mac 设置 MySQL 数据库默认编码(字符集)为 UTF-8

    mac 设置 MySQL 数据库默认编码(字符集)为 UTF-8   原文链接:https://juejin.im/post/5bbdca76e51d45021147de44 鉴于有些刚接触 MySQ ...

  6. 前端网页、php与mysql数据库字符编码(解决中文等乱码问题)

    web开发中经常涉及前端网页——php——mysql之间的数据交互,当数据只有英文时通常不会有什么问题,但一旦涉及中文,三个地方的某一处字符编码不一致(如,网页使用的时gbk而mysql使用utf-8 ...

  7. 更改MySQL数据库的编码为utf8mb4

    原文:http://blog.csdn.net/woslx/article/details/49685111 utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3 ...

  8. mysql的安装、C++訪问mysql数据库、编码设置问题

    一.mysql的安装.这个相对简单,直接去官网下载mysql安装程序.就能够完毕安装过程,网上有非常多安装教程,这个没什么注意事项. 二.C++訪问mysql.主要是用到mysql定义的头文件,内部定 ...

  9. mysql数据库字符集编码查看以及设置

      show variables like %char% character_set_client     | gb2312                           character_s ...

随机推荐

  1. maven:pom.xml中没有dependency标签错误

    dependency的标签是包含在dependencies中的.

  2. (转)每天一个linux命令(15):tail 命令

    场景:每次查看服务端的日志时候都需要反复重新加载服务端的日志.用tail命令可以很方便的查看服务器上的日志更新! tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅 ...

  3. (转)认识java中的堆和栈

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

  4. Spring源码情操陶冶-AbstractApplicationContext#prepareBeanFactory

    阅读源码有助于陶冶情操,本文承接Spring源码情操陶冶-AbstractApplicationContext#obtainFreshBeanFactory 瞧瞧官方注释 /** * Configur ...

  5. dpkg和perl的依赖环境出现错误故障解决(磁盘原因)

    内核: uname -a Linux localhost.localdomain 3.4.29-t4 #12 Wed Mar 13 16:50:15 EST 2013 armv7l armv7l ar ...

  6. EF 中 Code First 的数据迁移以及创建视图

    写在前面: EF 中 Code First 的数据迁移网上有很多资料,我这份并没什么特别.Code First 创建视图网上也有很多资料,但好像很麻烦,而且亲测好像是无效的方法(可能是我太笨,没搞成功 ...

  7. NYOJ 69 数的长度(数学)

    数的长度 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出 ...

  8. java变量、二进制、数据类型、原码、补码、反码

    1. 变量  1. 他 她 我 你 某人 佚名 旺财 X-man x = 1     您好! 它    (变量就是自然语言中的代词)  2. int age = 15;// 00000000 0000 ...

  9. JavaScript 排序算法(JavaScript sorting algorithms)

    JavaScrip 排序算法(JavaScript Sorting Algorithms) 基础构造函数 以下几种排序算法做为方法放在构造函数里. function ArrayList () { va ...

  10. ArrayList 和Vector ,HashTable和HashMap异同

    相同点: 1.都实现了List接口(List接口继承自Collection接口) 2.有序集合,数据可重复,可按索引号取值(而HashSet无序,不可重复) 不同点: 1.Vector是线程安全的,而 ...