平时使用char类型定义字段时,往往会指定其长度M,即char(M)。其实M指的是字符数,即这个字段最多存储多少个字符,M可不指定,默认为1,范围是[0,255],单个字母、数字、中文等都是占用一个字符。utf8字符集下一个中文字符占用3个字节。这个怎么去测试呢。举个例子
先来创建一个表
CREATETABLE`char_lanlan1`(`col1`charDEFAULTNULL,`col2`char(5)DEFAULTNULL,`col3`char(10)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8;执行下方语句来测试char(x)中x的范围。
altertablechar_tb1addcolumncol4char(0);altertablechar_tb1addcolumncol4char(0);如果是下方的语句,则会报错了
altertablechar_tb1addcolumncol5char(256);VARCHAR用于存储可变字符串,是最常见的字符串数据类型。它比CHAR更节省空间,因为它仅使用必要的空间。VARCHAR需要1或2个额外字节记录字符串长度,如果列的最大长度不大于255字节则只需要1字节。
CHAR是定长的,根据定义的字符串长度分配足够的空间。CHAR会删除末尾空格。假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.
CHAR适合存储很短的字符串,或所有值都接近同一个长度,例如存储密码的MD5值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR不容易产生碎片。对于非常短的列,CHAR在存储空间上也更有效率,例如用CHAR来存储只有Y和N的值只需要一个字节,但是VARCHAR需要两个字节,因为还有一个记录长度的额外字节。
在检索效率上来讲,CHAR>VARCHAR,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用VARCHAR.例如存储用户MD5加密后的密码,则应该使用CHAR。
适用场景:字符串列的最大长度比平均长度大很多、列的更新很少、使用了UTF8这种复杂字符集,每个字符都使用不同的字节数存储。
什么是事务
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个SQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚。所有受到影响的数据将返回到事物开始以前的状态;如果单元中的所有SQL语句均执行成功,则事物被顺利执行。