From 76dd1b3014def377cbd65513b98db2816976bd98 Mon Sep 17 00:00:00 2001 From: wu xiangkai Date: Thu, 29 Sep 2022 15:46:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/Data Type.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/mysql/mysql文档/Data Type.md b/mysql/mysql文档/Data Type.md index 1acdd9b..16cc097 100644 --- a/mysql/mysql文档/Data Type.md +++ b/mysql/mysql文档/Data Type.md @@ -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错误。 +