数据库 ·

网易MySQL微专业学习笔记(八)-MySQL字符集

前言

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

所有笔记可能不定期更新,发布时不一定为最终版。

正文

字符集基础

字符集:数据库中的字符集包含两层含义

1)各种文字和字符的集合,包含各国家文字、标点符号、图形符号、数字等。
2)字符的编码方法,即二进制数据与字符的映射规则。

字符集-分类

ASCII:美国信息互换标准编码;英语和其他西欧语言;单字节编码,7位(bits)表示一个字符,共128字符。
GBK:汉子内码扩展规范;中日韩汉字、英文、数字;双字节编码;共收录了21003个汉字,GB2312的扩展。
UTF-8:Unicode标准的可变商都字符编码;Unicode标准(统一码),业界统一标准,包含时间上数十种文字的系统;utf-8使用一至四个字节为每个字符编码。
其他常见字符集:
UTF-32,UTF-16,也是符合Unicode标准的字符集,只是编码规则和UTF-8稍微不同
Big5:台湾使用的字符集,主要是用来表示一些繁体字
latin1:mysql默认的字符集,主要用来表示一些西欧语,不支持汉字。

查看字符集

SHOW CHARACTER SET;

新增字符集

可以在当遇到mysql不支持的字符集时使用。
编译时时加入: --with-charset=
例:./configure --prefix=/usr/local/mysql3 --with-piugins=innobase --with-charset=gbk

字符集与字符序

charset和collation

collation:字符序,字符的排序与比较规则,每个字符集都有对应的多套字符序。
不同的字符序决定了字符串在比较排序中的精度和性能不同。
show collation 查看字符序
utf8_general_ci
可排序普通英文字符,但若是德语的英语不支持
utf8_bin
utf8_unicode_ci
支持德语的英语,精度提高,性能降低。
mysql的字符序遵从命名惯例:以_ci(表示大小写不敏感),以_cs(表示大小写敏感),以_bin(表示用编码值进行比较)。

字符集设置级别

charset和collation的设置级别:
服务器级>>数据库级>>表级>>列级

服务器级

系统变量(可动态设置)
-character_set_server:默认的内部操作字符集。
-character_set_system:系统元数据(字段名等)字符集
字符集设置级别
服务器级
配置文件设置
[mysqld]
character_set_server = utf8
collation_server=utf8_general_ci
数据库级
CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;
-character_set_database:当前选中数据库的默认字符集
主要影响load data等语句的默认字符集,CRATE DATABASE的字符集如果不设置,默认使用character_set_server的字符集
表级
列级

数据存储字符集使用规则

  • 使用列级的CHARACTER设定值;
  • 若列级字符集不存在,则是用对应表级的DEFAULT CHATACTER SET 设定值;
  • 若表级字符集不存在,则使用数据库级的DEFAULT CHATACTER SET 设定值;
  • 若数据库及字符集不存在,则使用服务器级character_set_server设定值。

查看字符集

show [global] variables like 'character%';

show [global] variables like 'collation%';

例:

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

修改字符集

set global character_set_server=utf8; -- 全局

alter table xxx convert to character set xxx; -- 表

客户端连接与字符集

连接与字符集

character_set_client:客户端来源数据使用的字符集
character_set_connection:连接层字符集
character_set_results:查询结果字符集
set names utf8: 统一设置以上字符集;

配置文件设置:

[mysql]
default-character-set=utf8

常见乱码原因

  • 1、数据库存储字符集不能正确编码(不支持)client发来的数据:client(utf8)->storage(latin1)
  • 2、程序连接使用的字符集与通知mysql的character_set_client等不一致或不兼容。

使用建议

  • 1、创建数据库/表时显示的指定字符集,不使用默认。
  • 2、连接字符集与数据存储字符集设置一致,推荐使用utf8.
  • 3、驱动程序连接时显示指定字符集(set names xxx)
mysql C API 初始化数据库语柄后马上用mysql_options设置MYSQL_SET_CHARATER_NAME属性我utf8
mysql PHP:连接到数据库以后显示用SET NAMES 语句设置一次连接字符集
mysql JDBC:
url="jdbc:mysql://localhost:3306/blog_dbo?user=xx&password=x&useUnicode=true&characterEncoding=utf8";

参与评论