[MySQL]知识点

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 本文详细介绍了MySQL中int族和char族数据类型的特点、存储范围及使用建议,以及text、blob类型和内置字符处理函数。文章强调了数据类型选择的重要性,并提供了多个实例帮助理解。

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://developer.aliyun.com/article/1634557
出自【进步*于辰的博客

1、知识点扩展

  1. 细节与使用经验
  2. 流程控制语句
  3. 存储过程

    2、int族数据类型存储范围

    参考笔记二,P62.1、P63.7。

2.1 数据范围通式

无论何种类型,底层存储方式都是二进制,而数据存储范围则取决于==表示数据所需二进制的位数==。也包括int族数据类型。

int族数据类型的所有类型如下:

  1. tinyint,占1字节,数据范围:-128 ~ 127
  2. smallint,占2字节;
  3. mediumint,占3字节;
  4. int,占4字节;
  5. bigint,占8字节;

为何tinyint类型的数据存储范围是-128 ~ 127?

详述可查阅博文《二进制相关概念、运算与应用》的第1.2项。

从这篇文章可知:8位二进制的表示范围就是-128 ~ 127

规则如此,那在mysql数据库中会不会有所变动?
做如下测试进行验证。
在这里插入图片描述
在这里插入图片描述
上图数据表的字段syllabus_id的数据类型是tinyint,图一存储128报错:超出值范围;图二存储127,可提交。验证通过。

结论:
综上可推断出, int族数据类型的数据存储范围通式为:

-2^{8n-1}^ ~ 2^{8n-1}^ - 1(n是所占字节数)

示例:

  1. tinyint,占1字节。数据存储范围:-2^(81-1)^ ~ 2^{81-1}^- 1 → -128 ~ 127
  2. smallint,占2字节。数据存储范围:-2^{82-1}^ ~ 2^{82-1}^ - 1 → -32768 ~ 32767

    2.2 对定义类型时所指定长度的说明

    先说结论:

    int族数据类型数据存储范围取决于所占二进制的位数,==与定义时指定的长度无关==,如:tinyint(5),并不是表示此字段可以存储5位数的整数,其中的5无意义。因此,数据范围仍是: -128 ~ 127

此结论针对的是int族数据类型,若是其他族数据类型则不同。例如:decimal(5, 2)可存储3位数小数,保留2位小数;char(20)占20个字节,可存储20个字符或10个汉字。

3、char族数据类型的选择问题

参考笔记二,P62.2/4、P63.5。

在下文中,大家会看到xchar/nxchar这样的数据类型,这是我自定义的,目的是便于阐述,可能会提升阅读难度,请保持耐心。

自定义规范:

  • 形式一:x 代指 n。如:xchar → char 和 nchar;xvarchar → varchar 和 nvarchar。
  • 形式二:x 代指 var。如:xchar → char 和 varchar;nxchar → nchar 和 nvarchar。

形式一优先级高于形式二。

3.1 char与nchar的区别

区别:存储方式不同。

  1. char字节存储,一个字符占1个字节,一个汉字占2个字节。如:char(20),可存储20个字符或10个汉字,共占20个字节;
  2. nchar字符存储,一个字符或汉字都占2个字节。如:nchar(20),可存储20个字符或汉字,共占40个字节。

3.2 xchar和xvarchar的区别

区别:是否定长。
举个栗子:

  1. char(20),表示最多可存储20个字符或10个汉字,==固定占20字节空间==。假设仅存储了4个字符,则后16个字节为空;
  2. varchar(20),表示==最多可存储20字节数据==。假设已存储了4个字符,则共占4字节空间。

同理:

  1. nchar(20),表示最多可存储20个字符或汉字,固定占40字节空间。假设仅存储了4个字符,则后32个字节为空;
  2. nvarchar(20),表示最多可存储40字节数据。假设已存储了4个字符,则共占8字节空间。

因为我的电脑默认编码是GBK,因此,上文是基于“一个汉字占2个字节”的标椎进行阐述的。

补充说明:
在实际应用中,一个汉字所占字节数取决于编码格式。例如,若编码格式是GBK/ISO-8859-1,则一个汉字占2个字节,此时char(20)最多可存储10个汉字;而若编码是UTF-8,则一个汉字占3个字节,此时char(20)最多可存储6个汉字和2个字符。
扩展:创建数据库时编码普遍设置为UTF-8

3.3 类型选择建议

  1. xcharxvarchar占据空间大,但执行速度快。因为 xchar 的索引效率高,不过,在存储数据时,==建议将数据前后多余的空格去除==(trim());
  2. 若所存储的数据集中包含字母数字汉字其他语言字符,则nxcharxchar合适。因为 nxchar 使用Unicode统一编码,能降低乱码的几率。(因为一般情况下,==数据库的编码兼容性强于程序编码==。因此,数据存储时不会乱码,但读取数据时可能会)
  3. 当所存储数据长度较短或数据集的长度近似时,使用xchar。举个例:身份证号,18或19位,选择char(21)nchar(21);(为什么是21,大家可参考第5点)
    注:有关数据长短,与所占字节数无关,故这里的 x 代指 n。
  4. xchar所占空间是一次性分配的,而xvarchar根据实际长度分配的。若所存储的数据在修改后相较于修改前短很多,则容易产生大量碎片,需要额外的导入和导出工作来清除碎片。因此,选择哪种char类型需要==预测后续数据的变动情况==;
  5. 同样是存储90个字符,varchar(100)varchar(200)是不同的。若此字段涉及到==文件排序==或==基于磁盘的临时表==,使用varchar(200)会给内存作业造成影响。因此,在定义长度时,需评估合适长度。一般情况下,==定义的长度为所存储数据的最大长度的110%左右最佳==。

    4、数据类型

    参考笔记二,P12.1~3。

    4.1 text

    text类型与 Oracle 中的clob类型相似,主要用于存储长文本。此类型族存储的唯一限制是存储大小。如:tinytext的存储大小是256Btext64KBmediumtext16MBlongtext4GB

    4.2 blob

    mysql 和 Oracle 数据库中都包含 blob 类型,此类型以二进制的形式进行存储,主要用于存储二进制文件,如:视频、图片,此类型族的存储大小同text类型。

    4.3 varchar、text、blob存储方面的区别

    varchar类型的存储大小为实际存储的字符个数+1,超出范围无法存储,故需要指定长度;textblob类型的存储大小固定,超出范围部分截断,且若blob类型存储的二进制过大,会导致性能降低。

    5、内置函数

    5.1 字符处理函数

    摘要 | 参数说明 | 返回值类型 / 返回值 | 说明
    -|-|-|-
    length()||| 获取字节数
    char_length()||| 获取字符数
    concat(a, b)||| 拼接
    strcmp(a, b)||| 比较a、b的大小。若 a 大于、等于或小于 b 时,返回1/0/-1

MySQL字符处理函数(也属于单行函数)与Oracle单行函数有许多是相同的,只是参数列表可能略有不同(PS:需要大家自行测试了)。如果大家想进一步了解,可查阅博文《[Oracle]知识点》中的【内置函数】。

并且,如instr(),返回位置也是从1开始,而不是0

5.2 非空判断函数

参考笔记二,P12.5。

摘要 参数说明 返回值类型 / 返回值 说明
isnull(a) 若 a 为 null,返回1,否则返回0
ifnull(a, b) 若 a 为 null,返回 b,否则返回 a
nullif() 同 Oracle 中的 nullif()
case...when...then 同 Oracle 中的case...
coalesce(a, b, ...) 返回第一个非 null 的值
if(a, b, c) 若 a 为 true,返回 b,否则返回 c

最后

本文中的例子是为了方便大家理解和阐述知识点而简单举出的,旨在阐明知识点,并不一定有实用性,仅是抛砖引玉。

本文持续更新中。。。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 MySQL
【MySQL】——Select查询语句知识点练习(其一)
【MySQL】——Select查询语句知识点练习(其一)
|
6月前
|
SQL 关系型数据库 MySQL
总结 vue3 的一些知识点:MySQL LIKE 子句
总结 vue3 的一些知识点:MySQL LIKE 子句
|
6月前
|
安全 关系型数据库 MySQL
总结MySQL 的一些知识点:MySQL 排序(上)
总结MySQL 的一些知识点:MySQL 排序
|
6月前
|
SQL 关系型数据库 MySQL
总结 vue3 的一些知识点:MySQL NULL 值处理
总结 vue3 的一些知识点:MySQL NULL 值处理
|
6月前
|
SQL 关系型数据库 MySQL
总结 vue3 的一些知识点:MySQL 连接的使用
总结 vue3 的一些知识点:MySQL 连接的使用
|
12月前
|
关系型数据库 MySQL 数据库
关于mysql涉及到的知识点,C语言如何操作mysql
关于mysql涉及到的知识点,C语言如何操作mysql
|
12月前
|
存储 关系型数据库 MySQL
MySQL,其他部分知识点补充
MySQL,其他部分知识点补充
|
3月前
|
存储 关系型数据库 MySQL
mysql锁的知识点简述
了解和合理应用MySQL中的锁机制,对于设计高并发、高可用的数据库应用至关重要。在系统设计初期就要考量锁策略,根据实际使用场景灵活调整,以最小化锁竞争,提高事务处理速度。
53 0
|
5月前
|
SQL 关系型数据库 MySQL
Mysql从入门到精通——Mysql知识点总结(基础篇)
Mysql从入门到精通——Mysql知识点总结(基础篇)
|
5月前
|
存储 关系型数据库 MySQL
mysql数据库练习题(涵盖几乎所有知识点)
mysql数据库练习题(涵盖几乎所有知识点)