ci框架 mysql 超时时间_mysql 字符集和校验规则( CHARSET & COLLATE)

我们首先看下常见建表语句:

mallAllGoodsCREATE TABLE `qywl`.`mallAllGoods` ( `id` varchar(64) NOT NULL COMMENT '主键id',`userId` varchar(64) NOT NULL DEFAULT '' COMMENT '发布人id',`storeId` varchar(64) NOT NULL DEFAULT '' COMMENT '发布商号id',`data` varchar(1000) NOT NULL DEFAULT '' COMMENT '服务详情',`type` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '服务类型(2车源,3货源,4酒店、5本地生活,6卡车)',`createTime` timestamp(6) default CURRENT_TIMESTAMP(6) NOT NULL COMMENT '创建时间',`updateTime` timestamp(6) default CURRENT_TIMESTAMP(6) NOT NULL ON update CURRENT_TIMESTAMP(6) COMMENT '更新时间',`logicalDel` tinyint(1) DEFAULT '0' NOT NULL COMMENT '逻辑删除标识(0未删除,1已删除)',PRIMARY KEY (`id`),INDEX `idx_userId` (`userId`),INDEX `idx_storeId` (`storeId`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='所有服务信息表';

定义:

CHARSET :给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{‘A’,’B’}时,{‘A’=>0, ‘B’=>1}就是一个字符集;
COLLATE 是指在同一字符集内字符之间的比较规则;确定比较规则后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系;


COLLATE 会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响DISTINCT、GROUP BY、HAVING语句的查询结果。另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,总之,凡是涉及到字符类型比较或排序的地方,都和COLLATE有关。
命名惯例:以对应的字符集名称开头;以_ci(表示大小写不敏感)、_cs(表示大小写敏感)或_bin(表示按编码值比较)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的;

mysql字符集和校验规则的对应关系:

每个校验规则唯一对应一种字符集,但一个字符集可以对应多种校验规则,其中有一个是默认(Default Collation);

查询mysql数据库所支持的字符集种类:

sql
1show character set;

7a914b0693f4bf64bdf8e354636c294d.png

查询mysql数据库所支持字符集的校验规则:

sql
1show collation;

64bce798357a28ef8773819d6bf02a02.png

Mysql的字符集和校验规则有4个级别的默认设置:服务器级,数据库级,表级和字段级客户端交互时,也可以指定校验规则

查看服务器级字符编码

sql
1show variables like 'character_set_server'

查看服务器级校验规则

sql
1show variables like 'collation_server'


服务器级字符集和校验规则,在Mysql启动时确定,在my.cnf中设置,如果没有指定字符集,默认为latin1,如果没有设置校验规则,默认使用字符集校验规则。

在mysql8.0以下版本中,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci。

sql
1
2
3[mysqld]character-set-server=utf8collation_server=utf8_general_ci

数据库级字符集和校验规则:

查看数据库级字符编码

sql
1show variables like 'character_set_database'

查看数据库级校验规则

sql
1show variables like 'collation_database'

库级别设置

sql
1CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


如果库级别没有设置,则库级别默认使用服务器级别的设置。

表级别设置

sql
1
2
3CREATE TABLE (……) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


如果表级别没有设置,则表级别会继承库级别的设置。

列级别的设置

sql
1
2
3
4CREATE TABLE (`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',……) ……


如果列级别没有设置,则列级别会继承表级别的设置。

也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置

sql
1
2SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

优先级:

如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 服务器别设置

几个需要注意的点:

1. 不同校验规则连表查会报错

sqlselect * from mallPageView as mLEFT JOIN mallStore as son m.storeId=s.id;[Err] 1267 - Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='可以指定排序规则:select * from mallPageView as mLEFT JOIN mallStore as son CONVERT(m.storeId USING utf8) COLLATE utf8_unicode_ci=s.id;


2. utf8和utf8mb4

utf-8 是变化长度的编码,储存需要1~4个字节
然而,mysql的utf8只存储最多3个字节。所以有些字符存不进去,像emoji表情等。
为了兼容4字节,MySQL在5.5.3之后增加了这个utf8mb4的编码。
建库,建表时,强烈建议编码使用utf8mb4。

3. utf8_unicode_ci、utf8_general_ci该用哪一个

当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言。
utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß'等于‘ss'。

utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差。

例如,使用utf8_general_ci和utf8_unicode_ci两种校对规则下面的比较相等:
Ä = A
Ö = O
Ü = U

两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
ß = s

但是,对于utf8_unicode_ci下面等式成立:
ß = ss

总结:

utf8_general_ci校对速度快,但准确度稍差
utf8_unicode_ci准确度高,但校对速度稍慢


DBA建议使用传统的utf8_general_ci

参考资料:https://www.mysqlzh.com/doc/94.html

作者:合一研发部-王治虎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值