美文网首页
CHAR和CARCHAR的知识总结

CHAR和CARCHAR的知识总结

作者: 哆啦在这A梦在哪 | 来源:发表于2020-05-21 10:36 被阅读0次

本位基于MySQL5.7.24。CHAR和VARCHAR都可以用来表示字符类型,其不同在于两者的存储与检索、最大长度和尾部空格串的处理等方面。

1 基础总结

下表是CHAR和CARCHAR的知识总结:

image.png

char与varchar的基础总结

以下几点需要特别引起注意:

1> 虽然在声明时,两种类型的m都可以指定为0,实际上最长长度为0只能存放空字符串。

2> 关于长度范围,CHAR在声明时,m只能是0255之间的数字;VARCHAR在声明时,m只能是04294967295范围的数字。

2 存储

CHAR是定长字符串类型,在声明时指定其长度m,在进行数据写入时,如果写入的字符串未达到指定长度m,那么会在左侧使用空格补齐到长度m,所以,声明为m长度的CHAR类型,不论其存放的字符串长短,统一都会占用m字节。

VARCHAR是变长字符串类型,在声明时虽然指定其长度m,仅指其能存放字符串的最长长度,在存储时,如果存放的字符串长度不超过255,VARCHAR会额外申请一个字节用于存放实际字符串的长度,如果超过255,会额外申请两个字节的空间用于存放实际字符串的长度,所以根据VARCHAR实际存放的字符长度不同,其所占空间也会不同。例如在CHAR(4)和VARCHAR(4)中存放不同数据类型,其结果如下表所示:

image.png

char与varchar的存储

上表中最后一行,展示了当存储字符串超出其声明的最大长度时的提现,如果sql_mode未使用严格模式,则会如上表所示的样子,按最大长度截取,但是会产生警告;如果设置了严格模式,则会报错,如下图所示:


image.png

超长字符串的裁剪

Char类型的数据在存储时会自动裁剪右侧的空格串,而VARCHAR则不会,如下图所示:

image.png

右侧空格串的裁剪

为了使结果更明显,上图中使用concat对输出结果进行了调整,可以看到CHAR在存储时,自动裁剪了右侧的空格串。

3 数据的校验

CHAR、VARCHAR(以及TEXT)类型在进行比较时,会自动裁剪后侧的空格串,然后进行比较,如下图所示:

image.png

字符串的校验1

对于此规则,如果在该类型的列上有唯一索引,那么插入裁剪右侧空格串后相同的字符串会报错。

如果需要将右侧的空格字符串参与比较,使用like即可,如下图所示:

image.png

字符串的比较校验2

4 总结

本文总结梳理了MySQL数据库char与varchar类型的知识并给出了相应样例,在实际应用中如何选择合适的数据类型是非常重要的,其最重要的区别在于定长与变长,一般来说,能适用于char的地方varchar一定可以使用。

如提前知道需要存放的数据内容,如邮政编码、彩票号码等固定位数的字符串,则可以使用char类型,如不能确定长度的情况下,应该使用varchar。

在使用中要注意超过最大长度和不到最大长度时两种类型的不同处理。

对于字符串比较时的右侧空格串裁剪规则要引起注意,不同字符串因比较结果相同可能会引发不明显的错误结果。
注意:不同数据库如oracle中也有点不同,比如存储数据的位数等等,具体问题具体分析

相关文章

  • CHAR和CARCHAR的知识总结

    本位基于MySQL5.7.24。CHAR和VARCHAR都可以用来表示字符类型,其不同在于两者的存储与检索、最大长...

  • char [] 和 char*

    作者按:无参考价值。 今天在看紫书时候,发现作者在WERTYU题目和Palindrome题目中定义了以下三个变量:...

  • char和char *

    星号 * 和取地址符&的关系 1.星号 * 代表一个内存地址,是一个数字 ,说明这个变量是个指针。比如 char ...

  • char * 和char[]的区别

    如下代码块char pngPath[10]; 在下面的sprintf函数中报错了但是char *pngPath可...

  • char * 和 char []的区别

    区别: 1:char* s1=”abc”;s1是一个指针,s1所指向的地址的内容是不可改变的,但是s1可以指向其他...

  • const char* 和 char*

    char *向const char *转化 char * 向const char *可以直接赋值 const ch...

  • BAT大厂Android面试Java基础知识问题和答案整理(一)

    Java基础知识整理 [x] java中==和equals和hashCode的区别 [x] int、char、lo...

  • JAVA面试题汇总

    (一) java基础面试知识点 java中==和equals和hashCode的区别int、char、long各占...

  • Java for Android 面试题

    (一) java基础面试知识点 java中==和equals和hashCode的区别 int、char、long各...

  • mysql 数据库

    Mysql字段类型 时间类型 复合类型 总结1 手机号 char(11)姓名 char(20)价格 decimal...

网友评论

      本文标题:CHAR和CARCHAR的知识总结

      本文链接:https://www.haomeiwen.com/subject/utxzohtx.html