首页 > 代码库 > 字符型弄详解
字符型弄详解
char和varchar分别称为定长和变长类型
对于定长char(N)
不论够不够长度,实际都占据N个长度
如果不够N个长度,用空格在末尾补到N个长度
而对于varchar不用空格补齐,但列内容前,有1-2个字节来标志该列的内容长度
char(M) 宽度在 0<=M<=255
varchar(M) 宽度在 0<=M<=65535
定长速度快些
mysql> create table test(
mysql> ca char(6) not null default ‘‘,
mysql> vac varchar(6) not null default ‘‘
mysql> )engine simyam charset utf8;
mysql> insert into test values (‘hello‘,‘hello‘);
mysql> select * from test
查看下我们没有看到什么区别
再加一行,在aa后面加两个个空格
mysql> insert into test values (‘aa ‘,‘aa ‘);
再select下查看还是看不出,用下面一句我们就能看到区别了
mysql> select concat(ca,‘!‘),concat(vac,‘!‘) from test;
mysql> select * from test;
+-----------------+-----------------+
| concat (ca,‘!‘) | concat(vac,‘!‘) |
+-----------------+-----------------+
| hello! | hello! |
| aa! | aa ! |
+-----------------+-----------------+
这次能清楚看到区别了,
原因是char型如果不够M个字符,内部用空格补齐,取出时再把右侧空格删掉
这意味着如果右侧本身有空格,将会丢失
concat函数是连接字符串用的
注意:char(M),varchar(M)中的M限制的是字符数,不是字节数
即 char(2) charset utf8 能存2个utf8字符,比如“中国”
例:插入一行
insert into test values (‘中国‘,‘在人民共和国‘);
事实上不是存两个而是6个,因为M代表的是字符。
还有一种错误认识,既然是字符,6个utf8中文,那就是18个字节,我存两个单词不成问题吧
insert into test values (‘hello world‘,‘pretty women‘);
我们会发现会出错:Data too long 说明太长了
这是因为如果定义是utf8存6个字符,就只能存6个utf8的字符,定义是GBK也是一样。
text 文本类型,可以存比较大的文本段,搜索速度慢
因此,如果不是特别大的内容,建议用varchar char
声明text列时,不必给默认值(加了也没用)
mysql> create table test2(
mysql> artice text );
下面看下
#blob的意义
mysql> alter table test2 add img blob;
这个blob是二进制类型,用来存储图像,音频等二进制信息
下面我存几个字符看下
mysql> insert into test2 values (‘拔苗助长‘,‘朋友别走‘);
也插入成功了,这不是存二进制的吗?那还有什么意义呢?
意义:二进制字符从0-255都有可能出现,
blob类型在于防止因为字符集的问题,导致信息丢失
比如:一张图片中有0xFF字节,这个ascii字符集认为非法,在入库的时候,被过滤了,所以主要防止字符集乱码
本文出自 “不变的时光” 博客,转载请与作者联系!