04,列类型与建表语句-2字符串型
二、字符串型
通常用到的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进制存进去,再取出来。