美文网首页
04,列类型与建表语句-2字符串型

04,列类型与建表语句-2字符串型

作者: 小碧小琳 | 来源:发表于2018-11-11 18:25 被阅读0次

    二、字符串型

    通常用到的4个
    char
    varchar
    text
    blob

    2、char与varchar

    2.1、char(N)定长字符串

    ——————————————————————————————————
    思考:为什么不说,char(N)能存N个字节,而是说char(N)能存N个字符长度呢?
    回答:因为,事先会用charset设定字符集,如果是utf8格式,那么就是N个utf8的字符,如果是GBK格式,那么就是N个GBK字符的。

    char(M)和varchar(M)限制的是字符,不是字节。

    比如,char(2) charset utf8能存多少个汉字呢?
    错误理解:能存6个字节,那么一般一个utf8是三个字节,因此只能存两个汉字(utf8字符)。
    正确理解:char能存6个utf8字符,因此能存6个汉字。
    ——————————————————————————————————

    对于“定长”的解释:
    比如,姓名char(6)
    1 张三
    2 李莲英
    3 阿拉木汗

    思考:在磁盘上寻找第三行的姓名,并读出来,那么这个过程中,需要磁头移动去读,那么每次磁头移动多少?
    答:因为是定长,那么每个姓名的长度都是固定的N,因此查找第三个姓名的时候,就走2N个长度即可。

    因此,在寻址的时候,char是比较快的(通过简单的数学运算即可)。比varchar效率高一点。

    但是varchar怎么寻址?怎么快速定位到第三个?
    现在了解不深,这里可能通过,比如id用char来定义,name用varchar来定义,这样通过快速定位id,再定位id后的name。(而且也能充分利用空间,id一定是那几位数的~)
    暂时的想法,以后再理解。

    用空间换时间。

    优点:
    查找速度快。

    缺点:

    • 对于定长N,不论够不够指定的长度,实际都会占据N个长度。
    • 如果不够N个长度,会用空格在末尾补够N个长度,浪费了尾部

    2.1、varchar()定长字符串

    比如,varchar(100),也是存储0-100个字符。

    对于姓名,我们用varchar(20)来表示
    1 张三
    2 李莲英
    3 阿拉木汗

    问:在表头中,第一行,张三开始处,要把张三取出来。那么,往后取几个字符呢???
    在字符前面,添加一个前缀,告诉指针目标有多长。这样,我们在读到张三时,会先读到一个代表长度(比如2),接下来就读2个字符集即可。

    **对于varchar(N),不用空格补齐,但列内容前面,会有1-2个字节来标志该列的内容长度。

    3、text文本类型

    可以存比较大的文本段,搜索速度稍慢。
    因此,不是特别大的内容,建议用char,varchar来代替。
    text不用加默认值(加了也没用)

    一般对于文章内容,新闻内容,论坛内容,用text比较适合。具体能容纳多少字,可以再去查一查使用手册。

    /4、blob,二进制类型

    用来存储图像,音频等二进制信息。

    提问:用2进制存储的意义在哪?

    比如:test2中img是blob类型的。

    为img添加字符串‘张飞赶驴’

    但是,如果存储字符串,发现也能存进去,那么blob这样存储2进制有何意义?

    答:2进制,0-255都有可能出现,blob在于防止因为字符集的问题,导致信息丢失。

    比如,如果没有bolb类型,假如一张图片中,有0xFF字节,这个在ascii字符集中认为非法,在入库的时候就会被过滤。因此,下次在取出这个图片的时候,图片就会损坏了。

    而如果用bolb类型存储,那么就会将图片用2进制存进去,再用2进制原原本本的取出来,就不会出现非法字符集被过滤,导致信息丢失的情况了。比如0xFF会被换成2进制存进去,再取出来。

    相关文章

      网友评论

          本文标题:04,列类型与建表语句-2字符串型

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