首页 > 数据库 >MYSQL collation 选好还能换吗

MYSQL collation 选好还能换吗

时间:2023-06-22 12:02:08浏览次数:35  
标签:ci 选好 utf8mb4 大小写 0900 MYSQL collation 级别


开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。

MYSQL collation 选好还能换吗_数据库

Collation  主要的作用是什么,排序。 数据库中的字符众多,而在这里很多的查询中都对这些符号进行一些比对的工作,如 A = a , B > BA , c < v 等等在查询中进行的条件输入的工作,而字符和字符之间如何进行比对,这个就全部依靠我们的collation 了,如我们规定了  A = 0  B = 1  则, B  > A 是成立的,所有collation是一套字符的编码集合,collation会影响到order by的语句顺序,会影响到where 条件比对后的结果,同时也会影响distinct, group by , having 等语句查询的结果,不光如此,还会影响字符型的字段建立索引后的顺序等。

以下我们以 MYSQL 8.030版本作为操作的对象

show character set;

请注意charset 与 collation 之间的对应关系(默认值)

MYSQL collation 选好还能换吗_ci_02

其中utf8mb4中就有众多的collation可以被支持

MYSQL collation 选好还能换吗_mysql_03

基于以上的问题,我们已经了解到collation的重要性,他是一个规则,满足数据库中表的数据进行比较和排序的重要标记属性。这些设定与字母大小写是否敏感或者一些特殊国家的语言的重音符号等都有关系。

下面我们带着几个问题,来看MYSQL 的COLLATION 的问题

问题1 ,怎么能让我的数据库在比对英文大小写的时候,能产生差异

create table change_letter_i (id int primary key,letters varchar(20)) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;

create table change_letter_c (id int primary key,letters varchar(20))engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_as_cs;

MYSQL collation 选好还能换吗_mysql_04

从下图我们可以清晰的分析出,两个表在使用了不同的collation 后的在对比字符的比对情况

在我们使用了 utf8mb4_0900_ai_ci 后,我们的字符比对中,大小写英文是等同的,而在使用了utf8mb4_0900_as_cs 后,我们大小写之间的比对是敏感的。

MYSQL collation 选好还能换吗_ci_05

问题 2 在MYSQL 中两个不同 collation的表对比字符会产生什么结果?

从下面的截图可以清晰的看到,两个同样的字符集都是 utf8mb4的情况下,但是他们的collation 是不同的情况下,是无法进行比对的。

mysql> select * from change_letter_c as c inner join change_letter_i as i on c.letters = i.letters;
ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_0900_as_cs,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation '='

MYSQL collation 选好还能换吗_大小写_06

两个表虽然字符集相同,但是collation不同,在这样的情况下,两个表是不能关联查询的,如果查询会报错误提示。

问题 3  collation可以更换吗?

这是一个好的问题,因为collation的是一个在不同层级都存在的部分,在问可以不可以更换的前提条件是,你要更换哪个层次的collation 

这里我们的collation 分为以下几个等级

1  实例级别

2  库级别
3  表级别
4  列级别
5  SQL 级别

那么我们带着以上的层次的问题,来对这些collation进行更替

1  确认当前的数据库服务器的instance 中的collation

show variables like  'collation_connection';

MYSQL collation 选好还能换吗_数据库_07

set collation_connection = 'utf8mb4_0900_as_cs';

这里可以在配置文件或者动态的方式来对数据库实例来进行设置,但是在其他的层级都设置了自己的collation的情况下,这个collation 是不起作用的。

2  库级别

在MYSQL的数据库级别中,是可以对数据库本身进行collation的设置的
create database test default character set utf8mb4 collate utf8mb4_0900_ai_ci;

MYSQL collation 选好还能换吗_数据库_08

在表级别没有设置默认的collation的情况下,则按照库的级别来进行collation的设置。

3  表级别

上面的实验我们做过了,略过

4  列级别

这个列级别的实用性,仅仅次于表级别

举例

MYSQL collation 选好还能换吗_大小写_09



我们针对不同的列设置不同的collation

MYSQL collation 选好还能换吗_ci_10

上面的例子给我们一个很好的解释,collation 是可以随意设定的,级别越小越具有自己对自己管辖的部分具有collation的决定权。

上面的列子也说明在一个表中,如果有不同的对于大小写敏感度的不同需要,可以一个表中的不同字段具有不同的collation 。

但是需要注意的,如果有多表连接,则对应的collation必须一致。

5  SQL 级别 

我们来看看SQL的级别的 COLLATION到底是要做什么

MYSQL collation 选好还能换吗_数据库_11

MYSQL collation 选好还能换吗_ci_12

select distinct letters  from change_letter_ci;

select distinct letters collate utf8mb4_0900_as_cs from change_letter_ci;

以上两个SQL 可以看出,虽然我们的原有列大小写是不敏感的,但是在我们针对查询中,指出,这个列要大小写敏感的情况下,查询的结果是根据SQL 最终的collation 设定进行查询结果的输出的。

通过以上的介绍,我们可以联想出,在一些中文字符的比较中,可以针对中午的特殊的列进行特殊的 collation的设置。

简单对collation的后缀进行一个介绍,ci 结尾的是代表大小写不敏感,而cs结尾的说明大小写敏感。具体一些更多的不同点请参照MYSQL的官方文档部分。

MYSQL collation 选好还能换吗_ci_13

标签:ci,选好,utf8mb4,大小写,0900,MYSQL,collation,级别
From: https://blog.51cto.com/u_14150796/6534571

相关文章

  • MySQL
    初识MySQLJavaEE:企业级Java开发、Web前端(页面:展示——数据);后端(连接点:连接数据库JDBC,连接前端——控制视图跳转和给前端传递数据);数据库(存数据,Txt,Excel,world)。程序员等级:只会写代码,没学好数据库,基本混饭吃。操作系统,数据结构预算法!当一个不错的程序员!离散数学、数字电路......
  • MySQL 视图&存储过程&函数
    1视图1.1视图的作用当我们创建一张表的视图后,可以用和表差不多的使用方式来使用视图,比如可以对视图进行select查询操作、过滤或者排序数据等等。同时,也可以联结其它视图或者表,甚至可以添加和更新数据(但一般不会这么做,而且存在诸多限制)。总结起来,视图有以下优点:重用SQL语句,简......
  • LoadRunner通过SiteScope监控MySQL的性能
    步骤:安装SiteScope下载Java版的MySQL驱动,下载地址:http://www.mysql.com/downloads/connector/j/下载成功后,把解压缩的mysql-connector-java-5.1.14-bin.jar文件放入:C:\SiteScope\java\lib\ext 以及 C:\SiteScope\java64\lib\ext目录下。重启系统.进入SiteSc......
  • MySQL约束
    1约束1.1约束分类NOTNULL:非空,用于保证该字段的值不能为空。比如姓名、学号等。DEFAULT:默认,用于保证该字段有默认值,比如性别。PRIMARYKEY:主键,用于保证该字段的值具有唯一性,并且非空。比如学号、员工编号等。UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空。比如座位号。......
  • mysql - #1067 - Invalid default value
    mysql中无法设置默认值为函数或者表达式,如果你强制设置时,就会报错误:#1067-Invaliddefaultvalue。这不是mysql的bug,而是故意这么设计的。参看:http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html这里写道:"TheDEFAULTvalueclauseinadatatypespecification......
  • 备份 mysql数据
    Mysql数据库的常用备份方法是使用使用mysqldump,其命令格式如下:#mysqldump[options]database[tables]其中参数的含义为:options:代表mysqldump的选项,通过mysqldump–help可以查到。database:代表将要备份的数据库tables:代表将要备份的表,如果不指定任何表,则备份整个数据库......
  • 基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步
    这篇教程将展示如何基于FlinkCDC快速构建MySQL到Databend的实时数据同步。本教程的演示都将在FlinkSQLCLI中进行,只涉及SQL,无需一行Java/Scala代码,也无需安装IDE。假设我们有电子商务业务,商品的数据存储在MySQL,我们需要实时把它同步到Databend中。接下来的内......
  • 如何做mysql调优?绝命7招,让慢SQL调优100倍
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 自动化平台总结(httprunner+djangorestframework+python3+Mysql+Vue)【基础构思】
    一、前言最近从零搭建了一个自动化测试平台,虽然不是第一次从零搭建,但是也从来没有进行过这类搭建的总结,还是记录一下,搭建过程中的一些问题和方法。方便以后总结和翻阅二、简介搭建的平台使用的是Python3.6,未来有空可能考虑加个java版本。前端用的Vue,主体是httprunner2.......
  • Mysql
    mysql8修改登陆host:updateusersethost='%'whereuser='root';ALTERUSER'root'@'localhost'IDENTIFIEDWITHmysql_native_passwordBY'设置的密码';Centos6安装二进制MySQL5.7由于centos6的yum源停更,索性安装个二进制的mysql5.71.下载mys......