MySQL 之 COLLATE 关键字 在mysql中执行show create table tablename指令 , 可以看到一张表的建表语句,example如下:
大部分字段我们都能看懂,但是今天要讨论的是COLLATE关键字 。这个值后面对应的utf8_unicode_ci是什么意思呢?面试的时候用这个题目考一考DBA,应该可以难倒一大部分人 。
使用phpmyadmin的开发可能会非常眼熟,因为其中的中文表头已经给出了答案:
phpmyadmin截图
所谓utf8_unicode_ci,其实是用来排序的规则 。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列 , 都需要有一个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 。
这里顺便讲个题外话,mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记 utf8,永远使用 utf8mb4。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码 , 对于一些需要占据4bytes的文字 , mysql的utf8就不支持了 , 要使用utf8mb4才行 。
很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的 。selection * from table1 where field1="a"同样可以把field1为"A"的值选出来 。与此同时,对于那些_cs后缀的COLLATE , 则是Case Sensitive,即大小写敏感的 。
在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE 。以utf8mb4为例,该编码所支持的所有COLLATE如下图所示 。
首先 utf8mb4_bin 的比较方法其实就是直接将所有字符看作二进制串,然后从最高位往最低位比对 。所以很显然它是区分大小写的 。
而 utf8mb4_unicode_ci 和 utf8mb4_general_ci 对于中文和英文来说,其实是没有任何区别的 。对于我们开发的国内使用的系统来说,随便选哪个都行 。只是对于某些西方国家的字母来说,utf8mb4_unicode_ci 会比 utf8mb4_general_ci 更符合他们的语言习惯一些 , general 是mysql一个比较老的标准了 。例如,德语字母 “?”,在 utf8mb4_unicode_ci 中是等价于 "ss" 两个字母的(这是符合德国人习惯的做法),而在 utf8mb4_general_ci 中,它却和字母 “s” 等价 。不过,这两种编码的那些微小的区别,对于正常的开发来说,很难感知到 。本身我们也很少直接用文字字段去排序 , 退一步说,即使这个字母排错了一两个,真的能给系统带来灾难性后果么?从网上找的各种帖子讨论来说,更多人推荐使用 utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题 。结论:推荐使用 utf8mb4_unicode_ci , 对于已经用了 utf8mb4_general_ci 的系统 , 也没有必要花时间改造 。
另外需要注意的一点是 , 从mysql 8.0开始 , mysql默认的 CHARSET 已经不再是 Latin1 了,改为了 utf8mb4 ( 参考链接 ),并且默认的COLLATE也改为了 utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci 大体上就是 unicode 的进一步细分,0900 指代unicode比较算法的编号( Unicode Collation Algorithm version),ai 表示accent insensitive(发音无关),例如e, è, é, ê 和 ?是一视同仁的 。相关参考链接1,相关参考链接2
设置COLLATE可以在示例级别、库级别、表级别、列级别、以及SQL指定 。实例级别的COLLATE设置就是mysql配置文件或启动指令中的collation_connection系统变量 。
库级别设置COLLATE的语句如下:
CREATE DATABASE db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置 。在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci 。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4 , 默认的COLLATE改为了utf8mb4_0900_ai_ci 。
表级别的COLLATE设置,则是在CREATE TABLE的时候加上相关设置语句,例如:
如果表级别没有设置CHARSET和COLLATE , 则表级别会继承库级别的CHARSET与COLLATE 。
列级别的设置,则在CREATE TABLE中声明列的时候指定,例如
如果列级别没有设置CHARSET和COLATE,则列级别会继承表级别的CHARSET与COLLATE 。
最后,你也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置,不太常用 , 了解即可:
如果全都显示设置了,那么优先级顺序是 SQL语句列级别设置表级别设置库级别设置实例级别设置 。也就是说列上所指定的COLLATE可以覆盖表上指定的COLLATE,表上指定的COLLATE可以覆盖库级别的COLLATE 。如果没有指定 , 则继承下一级的设置 。即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样 。
以上就是关于mysql的COLLATE相关知识 。不过,在系统设计中 , 我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件 。
MYSQL中的COLLATE是什么?
往mysql数据库中的某个表里添加记录时,可以使用关键词1、运行Navicat数据库管理工具MySQL怎么加关键字,连接本地数据库 。点击左上角文件或者工具栏连接图标MySQL怎么加关键字,创建数据库连接 。NavicatforMySQL可以连接本地Mysql数据库MySQL怎么加关键字 , 还可以连接远程Mysql数据库 。两者连接方式基本相同 。
2、连接好数据库之后,点击新建数据库,打开新建数据库对话框,输入数据库名之后,点击确定按钮 。
3、为数据库添加数据表,这里是通过数据表的创建语句自动创建数据表 。先到工程目录下找到创建数据表的SQL语句 。
4、在NavicatforMySQL选中刚才创建的数据库,选择查询-新建查询,把步骤三中的SQL语句复制到查询编辑器中,点击运行 。
MySQL — 关键字和增删改查 来自MySQL的学习笔记 , 写的不对的地方大家多多指教哦
SELECT、DISTINCT、FROM、JOIN、ON、WHERE、GROUP BY、HAVING、SUM、COUNT、MAX、AVG、ORDER BY、LIMIT
SELECT-DISTINCT-FROM-JOIN-ON-WHERE-GROUP BY-HAVING-ORDER BY-LIMIT
必须字段:SELECT、FROM
可选字段:DISTINCT、JOIN、ON、WHERE、GROUP BY、HAVING、SUM、COUNT、MAX、AVG、ORDER BY、LIMIT
FROM-ON-JOIN-WHERE-GROUP BY(开始使用SELECT中的别名 , 后面的语句中都可以使用别名)-SUM、COUNT、MAX、AVG-HAVING-SELECT-DISTINCT-ORDER BY-LIMIT
FROM:从哪个表中检索数据
ON:关联条件,与join一起使用
JOIN:对需要关联的表进行关联
WHERE:过滤数据条件,执行顺序:自下而上、从右到左
GROUP BY:将过滤的数据进行分组 , 执行顺序:从左往右
SUM:求和
COUNT:数量统计
MAX:最大值
AVG:求平均值
HAVING:对分组的数据过滤条件,与group by一起使用
【MySQL怎么加关键字 mysql添加】 SELECT:查看结果集
DISTINCT:结果集去重
ORDER BY:排序,升序:ASC;降序:DESC
LIMIT:截取出目标页数据
详细用法会在后面进行补充
首先创建一张表,添加字段,表名字为:goodsmaster
添加数据的语法结构为:
添加数据可以是插入数据或插入查询的结果
1.1 插入数据
运行语句,查询结果:SELECT * FROM goodsmaster
部分字段有做非空约束,那么这边插入部分数据,验证下非空约束
上面的语句运行之后会报错,错误内容为“[Err] 1364 - Field 'barcode' doesn't have a default value”,即“barcode”这个字段有创建非空约束,表示这个字段不能为空,如果插入数据时不给这个字段赋值,那么就需要给它一个默认值 。
部分字段没有默认值,可以为空,那么现在验证一下插入数据时,这些字段不进行赋值会有什么结果
运行语句,查询结果:SELECT * FROM goodsmaster
仔细看会发现,上面的语句中插入数据也没有插入“itemnumber”字段,这个字段有添加主键约束,不能为空,但由于设置了自增约束,所以没有赋值也会自动在当前字段最大值 1,这就是自增约束;
上面的语句显示没有进行赋值的字段会默认显示Null 。
1.2 插入查询结果
MySQL 支持把查询的结果插入到数据表中,我们可以指定字段,甚至是数值 , 插入到数据表中 。
语法结构为:
删除语句使用DELETE删除,语法结构为:
删除记录可以使用WHERE来筛选删除的数据,下面为删除“barcode”字段数据为006的记录
由于部分数据可以为空,所以再删除的时候,WHERE的过滤条件必须用到主键约束或者唯一性约束的字段 。MySQL 的这种安全性设置,主要就是为了防止删除或者修改数据时出现误操作,导致删除或修改了不相关的数据 。
删除表中的全部数据
MySQL中用UPDATE来修改数据,语法结构为:
注意:不要修改主键字段的值 。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性 。
语法结构:
具体需要用到的关键字查看本文第一部分即可
MySQL怎么加关键字的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mysql添加、MySQL怎么加关键字的信息别忘了在本站进行查找喔 。
推荐阅读
- postgre多表更新的简单介绍
- go语言下载器,go语言安装包
- 奶茶店代码模拟游戏,奶茶店小游戏
- 电视退货发什么快递,电视退货时间规定
- go语言程序设计翻译 go程序设计语言英文版pdf
- flutterjdk的简单介绍
- 西藏优质的小程序注册平台,西藏优质的小程序注册平台有哪些
- 香奈儿商城小程序购买流程,香奈儿商城小程序购买流程视频
- 等差数列的递归函数C语言 c语言求等差数列第n项