文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MYSQL中的COLLATE

2023-08-31 15:07

关注

概念:COLLATE 含义 核对、校对

CREATE TABLE `table1` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',`field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci COMMENT '测试表';

 mysql中字符型的列/字段 需要一个COLLATE类型来告知mysql如何对该列进行排序和比较

简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果会影响**DISTINCT**、**GROUP BY**、**HAVING**语句的查询结果

mysql建索引的时候,如果索引列是字符类型,也会影响索引创建

凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关系

COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci

 注意:建表时  DEFAULT CHARSET=utf8mb3 之前,现在多写为 DEFAULT CHARSET=utf8mb4  (表情符号如:微信☺—占据4bytes)

区分charset 与collate不同

  1. charset设置字符串编码集,常用的utf8,mysql遗留问题utf8最存储3字节的大小,4字节的文字无法存储,需要utf8mb4

  2. collate和charset关联,定义了字符串的排序规则,如utf8mb4_general_ci是和utf8mb4对应的排序规则,ci为Case Insensitive,即大小写不敏感

  3. 对应cs为Case Sensitive,即大小写敏感  【where name='A'与name='a'效果一致!ci不敏感时】

  4. 查看数据库的所有charset和collate

  5. SHOW CHARACTER SET;在这里插入图片描述
    SHOW COLLATION;

    在这里插入图片描述

  6. 设置collate的级别【库、表和字段】
  • 库    CREATE DATABASE DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 表   CREATE TABLE tablename (
      `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
     ...
     ...
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
  • SQL级别查询   显示声明覆盖表中的COLLATE设置
    SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;
    SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_general_ci;
  • 优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置

额外对比-常用utf8mb4_general_ci

utf8mb4_general_ci : 不区分大小写, utf8mb4_general_cs 区分大小写
utf8mb4_bin : 将字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
utf8mb4_unicode_ci : 校对规则仅部分支持Unicode校对规则算法,一些字符还是不能支持;utf8mb4_unicode_ci不能完全支持组合的记号。

项目遇到的问题

不同表同一字段,创建的数据库表指定字符串排序规则为
utf8mb4_general_ci和utf8mb4_unicode_ci两种,导致关联无法比较

【charset不同实际问题:慢SQL,查询速度巨慢!!】

【collate不同实际问题:无法关联,报错!!】

-- 错误 SELECT a.mobile from play a INNER JOIN user_t b ON a.mobile = b.mobile

--正确 SELECT a.mobile from play a INNER JOIN user_t b ON a.mobile = b.mobile COLLATE utf8mb4_general_ci  [显示转为与a的collate规则一致!]

注意:一般情况下同数据库中表的字段排序类型都是相同的!,除非开发者不小心导致

修改charset或collate

实际开发中,我建错表的charset[uat与生成环境不同!按理需要一致的]

处理:将表中数据转换;修改表的默认字符集

修改库的默认字符集alter database XXX default character set utf8mb4 COLLATE utf8mb4_unicode_ci;修改表的默认字符集ALTER TABLE XXX DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;将表中原来的数据转换为utf8mb4ALTER TABLE XXX CONVERT TO CHARACTER SET utf8mb4;修改列字符集ALTER TABLE XXX CHANGE column_name VARCHAR(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

来源地址:https://blog.csdn.net/weixin_43543654/article/details/128862974

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯