日常提交
This commit is contained in:
@@ -308,3 +308,36 @@ string集合,每个string对象可以0个或多个值,每个值都必须属
|
||||
> 对于包含多个set元素的值,其值中元素的顺序和出现次数并不重要,'b,b,a,c'和'c,b,b,c,a'在插入后都会变为'a,b,c'
|
||||
|
||||
> 可以通过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错误。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user