日常提交

This commit is contained in:
wu xiangkai
2022-09-29 15:46:37 +08:00
parent ef9dfbf96c
commit 76dd1b3014

View File

@@ -308,3 +308,36 @@ string集合每个string对象可以0个或多个值每个值都必须属
> 对于包含多个set元素的值其值中元素的顺序和出现次数并不重要'b,b,a,c'和'c,b,b,c,a'在插入后都会变为'a,b,c' > 对于包含多个set元素的值其值中元素的顺序和出现次数并不重要'b,b,a,c'和'c,b,b,c,a'在插入后都会变为'a,b,c'
> 可以通过find_in_set('value',set_col)来查询某个值是否在set_col中 > 可以通过find_in_set('value',set_col)来查询某个值是否在set_col中
### char和varchar类型
对于char类型其长度是固定的并且长度需要在创建表字段时指定长度位于0到255之间。当char类型的值在存储时***会右填充空格直到长度到达指定长度M***。当char类型的值在获取时***会删除尾随填充的空格除非PAD_CHAR_TO_FULL_LENGTH的sql mode被启用***。
> 如果字段类型被设置为char类型并且pad_char_to_full_length关闭那么如果向char类型字段中存入字符串***在取出存入字符串时,存入字符串末尾若存在空格,那么在取出字符串时会删除尾随空格,即使尾随空格不是存入时填充的而是字符串本身就含有的尾随空格***
> ```sql
> char_col char(30)
>
> # 插入字符串值存在尾随空格
> insert into string_tb(char_col) values (' a ');
> # 获取时,字符串本身含有的尾随空格也会被删除
> # 返回值并不是' a 1'而是' a1'
> select concat(char_col,'1') from string_tb;
> ```
#### varchar类型的存储
相较于char类型varchar类型在存储时会额外存储1到2个字节长度的前缀用来记录该varchar类型的长度以字节为单位。***当该varchar类型值存储不超过255字节时使用一个字节来记录长度否则使用两个字节来记录长度***。
#### varchar和char类型的赋值
如果对一个varchar或char类型的字段进行赋值操作且赋值超过该类型的最大长度
- 如果strict_mode没有开启那么赋的值会被截断并且产生一个warning。
- 如果strict_mode已经被启用那么在截断非空格字符时会产生一个异常并且阻止插入操作。
- 对于varchar类型在插入时超过该列长度限制的尾随空格将会被截断并且会生成一个warning不论strict_mode是否开启。
- 对于char类型在插入时超过该列长度限制的尾随空格也会被截断并且截断操作是静默的并不会生成warning。
#### 在比较varchar类型和char类型时对后缀空格的处理
mysql的collate具有一个pad attribute可以有两个值
- pad space绝大多数的mysql collate都具有pad space属性
- no pad
pad space和no pad的区别
- pad space在比较时尾随空格并不会参加比较尾随空格并不重要
- no pad在比较时尾随空格参与比较尾随空格在比较时重要
> 默认情况下mysql默认字符集为utf8mb4该字符集默认collate为utf8mb4_0900_ai_ci其pad attribute为no pad。故而在默认情况下mysql对字符串进行比较时***忽略大小写并且尾随空格参与比较***。
> 如果某字符串列其collate的pad attribute为pad space且该列拥有unique约束那么在插入值时'a'和'a '同时插入会对该列产生duplicate-key错误。