老婆出轨 发表于 2024-10-29 05:48:55

[MySQL#3] 数据约束 | 数值类 | varchar | timestamp | enum vs set

目录
1. 引入
2. 数值范例
⭕ 约束
2.2 bit范例
2.3 浮点数范例
3. 字符串范例
3.1 char
3.2 varchar
3.3 char和varchar比力
4. 日期和时间范例
5.enum和set
数据库SET范例插入规则条记
聚集查询使用find_ in_ set函数:
find_in_set函数界说
返回值表明
功能阐明
应用实例
复合条件查询示例
接上篇文章的一个小提醒:数据库很底层了,界说了就只管不要改啦,否则上层也要变更和调整
本文头脑导图如下:

https://img-blog.csdnimg.cn/img_convert/639d88af35ff80f6704504d3f422225f.png
1. 引入

数据范例分类
在MySQL中,每种数据范例都有其特定的用途,类似于我们在学习C/C++等语言时碰到的情形。以下是一些MySQL中常见的数据范例:

https://img-blog.csdnimg.cn/img_convert/79ffa9e8ab09132546f2e0aeafa662b7.png
2. 数值范例

数值范例可以分为以下几类:位范例、布尔范例、整数范例、浮点数范例。
以下主要以整型为例进行阐明:

https://img-blog.csdnimg.cn/img_convert/e25c706e8bffff5cf661468ad842bc15.png


[*]整数范例包括tinyint、smallint等,它们根据名称不同,所占的字节数也不同,这些都是MySQL预先界说好的。
[*]默认情况下,假如我们只写tinyint、smallint等,它们是有符号范例的。其取值范围与C/C++语言中的对应整数范围相同。
[*]假如背面加上unsigned,则表示是无符号范例。

以tinyint范例为例,其他整数范例的使用方法与此类似。


[*]创建表示例:
create table if not exists t1(
    num tinyint
); 在这里,我们看到tinyint背面有一个数字4,这个寄义我们将在讨论约束时详细阐明,如今先不思量。

https://img-blog.csdnimg.cn/img_convert/f078a150d3cae6bc60c4d4f53d2ee1f4.png


[*]插入数据时,tinyint默认是有符号的,其取值范围是-128~127。超出这个范围的数据将无法插入。
[*]在MySQL中,整型可以指定为有符号或无符号,默认是有符号的。可以通过UNSIGNED关键字指定字段为无符号范例。
创建无符号tinyint范例的表:
create table t2(
    num tinyint unsigned
); 这样就创建了一个num字段为无符号范例的表。当插入超出取值范围的数据时,MySQL会拦截,不允许插入。

https://img-blog.csdnimg.cn/img_convert/f9669c26914103dcdd48b083b86ed030.png


[*]注意:只管不使用unsigned,对于int范例可能存放不下的数据,int unsigned同样可能存放不下。
[*]不如在计划时将int范例提升为bigint范例。
⭕ 约束



[*]假如我们向mysql特定的范例中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做越界的操纵!
[*]MySQL必须保证插入数据的完整性,一旦截断,那在MySQL中有些是乐成插入的有些是截断后插入的,那作为用户来讲,他还能信托MySQL中插入的数据吗?
[*]反过来,假如我们已经有数据被乐成插入到mysql中,一定是插入的时候合法的!
所以mysql中,一般而言,数据范例本身也是一种:约束!


[*]约束 —> 倒逼程序员尽可能进行正确插入。所以约束,约束的是使用者。别的假如你不是一个很好的使用者,mysql也能保证数据插入的合法性。
[*]这样的话就能保证数据库中的数据是可预期,完整的。
[*]以tinyint为例,它是有符号的,所以可预期的是未来插入的值范围一定在-128~127的。而且数据是完整的没有发生过截断或者隐式范例转化。
思考:


[*]我们还可以发现一个细节,mysql表中创建属性列, 列名称在前 范例在后 如 num tinyint
[*]假如反过来就是C/C++那一套形式。
tinyint我们说完了,其他范例自己推导。
2.2 bit范例

根本语法:


[*]bit [ (M) ]:位字段范例。M表示值比特位的位数,范围从1到64。假如M被忽略,默认为1。
[*]创建表示例:
create table t3(
    id int,
    online bit(1)
); 使用一个比特位来表示用户是否在线。由于只有一个比特位,只能插入0或1。

https://img-blog.csdnimg.cn/img_convert/4e73fe6c357f47fd8a7c826cf6229375.png


[*]查询位范例数据时,通常按照ASCLL码值显示。比方,插入的0和1在ASCLL码中是不可显示的,因此查询时可能看不到内容。可以使用hex函数以16进制形式显示。
2.3 浮点数范例


2.3.1 float


[*]语法:float [ (m, d) ] [ unsigned ]:M指定显示长度,d指定小数位数,占用空间4个字节。
[*]创建表示例:
create table if not exists t4(
    id int,
    salary float(4,2)
);

[*]float(4,2)表示的范围是-99.99 ~ 99.99。
[*]插入数据时,假如精度不够会补0
[*]假如精度凌驾会四舍五入,但凌驾总位数范围的数据也无法插入。
无符号float范例的表:
create table t5(
    id int,
    salary float(4,2) unsigned
); 无符号float(4,2)的取值范围是0 ~ 99.99,插入负数将失败。
浮点数在存储时可能会有精度损失。

2.3.2 decimal


[*]语法:decimal(m, d) :定点数m指定长度,d表示小数点的位数。
[*]decimal范例的使用与float类似,但它可以有效地制止精度损失。
[*]float的默认精度约莫是7位,而decimal可以精确到65位整数和30位小数。假如d被省略,默认为0。假如m被省略,默认是10。
[*]对于精度要求高的场景,应使用decimal范例。

https://img-blog.csdnimg.cn/img_convert/beabb9e3e8b03e7bb94d1fb754509c6f.png


[*]可以对比发现虽然float精度设为8但是实际上存的时候已经和插入数据不一样了。
[*]float范例往往在精度过大或者整体数字过大时会自作聪明帮我们做一些优化策略。
[*]但是decimal不会,它能够完完全全让数据怎么存就怎么取。

3. 字符串范例

3.1 char



[*]语法:char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。
[*]示例:name char(2),表示最多存两个字符。
[*]插入数据时,假如凌驾界说的长度,则不允许插入。

https://img-blog.csdnimg.cn/img_convert/060f234cdebbb7354408e4c63a776803.png
   ❓为什么一个汉字可以插,两个汉字也可以插,但是插入三个中文的时候就不让我插了?


[*]MySQL中的字符和C/C++中的字符概念是不一样的,从前语言上的字符,一个字符对应一个字节,
[*]而在MySQL中的字符真的代表一种符号,要么是1234、要么abcd、要么就是中文汉字,一个汉字就是一个字符。
[*]char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能凌驾2个, 最多只能是255,凌驾不让你插,连表都不让你建!

https://img-blog.csdnimg.cn/img_convert/1cfc93e97ea9c4af97df237f0fa0b9cc.png
页: [1]
查看完整版本: [MySQL#3] 数据约束 | 数值类 | varchar | timestamp | enum vs set