日常提交

This commit is contained in:
wu xiangkai
2022-09-30 16:43:11 +08:00
parent 76dd1b3014
commit 5691fa3bef

View File

@@ -341,3 +341,91 @@ pad space和no pad的区别
> 如果某字符串列其collate的pad attribute为pad space且该列拥有unique约束那么在插入值时'a'和'a '同时插入会对该列产生duplicate-key错误。 > 如果某字符串列其collate的pad attribute为pad space且该列拥有unique约束那么在插入值时'a'和'a '同时插入会对该列产生duplicate-key错误。
### binary和varbinary类型
binary,varbinary类型和char,varchar类型相似不同的是binary、varbinary类型存储二进制形式的字符串。
> 当插入字符串超过binary或varbinary的最长限制长度时若***strict mode未启用则字符串会被截断来适应该二进制列的最大长度并且会产生一个warning***;若***strcit mode已启用那么会抛出异常并且插入失败***
#### binary存储值时的逻辑
当binary类型的值被存储时该插入的值会右填充0x00的值直到到达指定长度。并且在对binary值进行获取时***并不会删除尾随0x00。***
在对binary类型值进行比较时所有字节都重要比较时并不会忽略尾随0x00字节。
> 对于binary类型其和char类型不同并不删除尾随字符其意味着如果a同时插入binary(3)的col_3列和binary(6)的col_6列从col_3和col_6中取出存储的值进行比较时col_3和col_6取出的值并不相同col_3为0x610000col_6为0x610000000000。
#### varbinary存储时的逻辑
对于varbinary类型存储时并不会插入尾随字符获取时也不会删除尾随字符。
### blob类型和text类型
blob类型可以看作一个存储大量二进制字符串数据的对象而text类型可以看作一个存储大量字符型字符串的对象。
> 如果strict mode没有开启那么在给blob类型字段分配超过其长度限制的值时会对分配的值进行截断并且抛出一个warning如果strict mode已经开启那么当截断非空格字符时会抛出异常并且插入失败。
> 对于text类型如果插入时对插入值的尾随空格进行截断那么会抛出警告无论strict mode是否开启。
对于blob类型和text类型在插入时并不会有向右的填充字符在获取时也不会删除尾随字符。类似于varchar和varbinary
#### 关于text类型作为索引的比较逻辑
如果将text类型的列作为索引必须要指定索引前缀长度当text值小于索引前缀长度时对索引列的text类型值进行比较时会向右填充空格。即如果该索引需要unique约束那么两个除了后缀空格数目外完全相同的text值将会产生duplicate-key异常。
#### blob/text类型与varchar/varbinary类型的区别
在大多数情况下blob/text类型和varchar/varbinary都相同但是在如下方面会有所区别
- 在对blob/text类型字段添加索引时必须要指定索引前缀长度M。(在对单列创建索引时必须要复制索引列的值到特定的数据结构如B+树中故而强制要求blob/text类型创建索引时指定索引前缀长度能够有效的减少复制索引值消耗的空间和比较索引的开销)
```sql
create table tb_blob_index (
blob_col blob,
index(blob_col(M))
);
```
- 对于blob类型和text类型的字段并不能为其指定default默认值
#### blob类型和text类型的排序
由于blob类型和text类型的值可能会很长故而在对blob类型和text类型的值进行排序时只会对列开头max_sort_length字节长度的内容进行排序。max_sort_length默认值为1024.
```sql
show variables like 'max_sort_length'; # default 1024
```
### enum类型
枚举类型是一个String对象该对象的值可以从允许的值范围中进行选取。允许的值范围在定义枚举字段时显式指定。
#### 枚举列的创建
```sql
create tb_enum (
id bigint auto_increment primary key,
size enum('x-small', 'small', 'medium', 'large', 'x-large')
);
```
当在插入枚举时可以有效降低空间的占用量。对于medium值的插入一百万条枚举类型值的插入只消耗一百万字节而将'medium类型作为字符串插入时一百万条数据的插入会消耗六百万字节的空间。
#### 枚举类型的值和序号
- mysql中对于每个枚举类型的值都有一个序号。对于在枚举类型列定义时在括号中指定的枚举类型值都对应了一个整数序号序号从1开始如"small","medium","large"对应123
- 对枚举空字符串代表error其对应的index是0.
- 对于枚举值NULL其index也为NULL
如果想要通过数值的形式获取枚举值可以通过select enum_col+0的形式获取枚举值时该枚举值对应的index被返回。
#### 枚举类型插入invalid值
如果对枚举类型插入invalid值插入值不位于enum定义时的可选值中
- strict mode没有开启时会插入一个''作为错误值,该''对应的index是0
- 若strict mode开启那么插入invalid值会直接导致异常
如果枚举列声明可为null那么null对于该枚举列则是有效值该枚举列的默认值为null如果枚举列声明为not null那么该枚举列的默认值是index为1对应的枚举值。
#### 枚举值的比较
枚举值的比较是通过比较枚举值的index来进行的。
```sql
create table tb_enum (enum_col enum('b','a'));
# 若enum_col_b对应的枚举值是b'enum_col_a对应的枚举值为enum_col_a
# 那么
enum_col_b < enum_col_a
```
#### 枚举值的定义
在定义枚举值时,不应该通过表达式来指定枚举值。
```sql
# 无法通过concat来指定枚举值为'medium'
CREATE TABLE sizes (
size ENUM('small', CONCAT('med','ium'), 'large')
);
# 无法将枚举值指定为变量
SET @mysize = 'medium';
CREATE TABLE sizes (
size ENUM('small', @mysize, 'large')
);
```