网易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";

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

JavaWeb05- 就这几步轻松操作MySQL数据库!

mysql-1 一.数据库 1. 数据库介绍 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过sql语句对数据库中...

28050
来自专栏恰童鞋骚年

走向面试之数据库基础:二、SQL进阶之case、子查询、分页、join与视图

  假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代表了用户等级类型,例如:1代表骨灰,2代表大...

10220
来自专栏逸鹏说道

sql server实现自定义分割月功能

本文目录列表: 1、为何出现自定义分割月需求 2、sql server实现自定义分割月功能 3、测试验证效果 4、总结语 5、参考清单列表 1、为何出现自定义分...

36360
来自专栏西安-晁州

mysql随笔

Mysql学习笔记 1、操作数据库 use dataBaseName  //使用数据库 show databases   //显示所有数据库 show tabl...

21100
来自专栏涂小刚的专栏

Spark SQL 之 Join 实现

如今Spark SQL(Dataset/DataFrame)已经成为Spark应用程序开发的主流,作为开发者,我们有必要了解Join在Spark中是如何组织运行...

3.9K20
来自专栏Python爬虫实战

设计模式:单例模式

想想一下这个场景,一个系统中可以存在多个打印任务,但是只有一个正在工作的任务。我们怎样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量可以使得一...

8820
来自专栏java系列博客

单例模式的各种实现

21460
来自专栏西枫里博客

rand()随机的效率问题

在平时开发过程中,数据量不超过1W条的,通常执行随机查询是通过对order进行rand操作的进行的。但是随着数据量的增加,rand严重制约了整站的访问速度。...

6110
来自专栏影子

oracle行转列、列转行、连续日期数字实现方式及mybatis下实现方式

-- 行转列 SELECT * from ( SELECT tt1.SAP_ID,TT1.dt,TT1.EFF from ( SELECT t1.SAP...

51820
来自专栏java一日一条

mysql索引优化

当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,...

14340

扫码关注云+社区

领取腾讯云代金券