1. char和varchar分别称为定长和变长类型

    对于定长char(N)

    不论够不够长度,实际都占据N个长度

    如果不够N个长度,用空格在末尾补到N个长度


    而对于varchar不用空格补齐,但列内容前,有1-2个字节来标志该列的内容长度

    char(M) 宽度在 0<=M<=255

    varchar(M) 宽度在 0<=M<=65535

    定长速度快些

    mysql> create table test(

        -> ca char(6) not null default '',

        -> vac varchar(6) not null default ''

       -> )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个也能插入,但是在查看的时候我们发现会自动把超过的字符去掉

    还有一种错误认识,既然是字符,6个utf8中文,那就是18个字节,我存两个单词不成问题吧

    insert into test values ('hello world','pretty women');

    我们会发现也可以录入,但是在查看的时候还是只有6个字符,后面的都省略了,

    这是因为我使用的mysql版本是5以上的,如果是5以下的会报错不能写入


    这是因为如果定义是utf8存6个字符,就只能存6个utf8的字符,定义是GBK也是一样。


  2. text   文本类型,可以存比较大的文本段,搜索速度慢

    因此,如果不是特别大的内容,建议用varchar  char


    声明text列时,不必给默认值(加了也没用)


    mysql> create table test2(

       -> artice text );

    下面看下

    #blob的意义

    mysql> alter table test2 add img blob;

    这个blob是二进制类型,用来存储图像,音频等二进制信息

    下面我存几个字符看下

    mysql> insert into test2 values ('拔苗助长','朋友别走');

    也插入成功了,这不是存二进制的吗?那还有什么意义呢?

    意义:二进制字符从0-255都有可能出现,

    blob类型在于防止因为字符集的问题,导致信息丢失

    比如:一张图片中有0xFF字节,这个ascii字符集认为非法,在入库的时候,被过滤了,所以主要防止字符集乱码