数据类型的范围是根据bit位的数量值来计算的。4字节的int占用32bit,所以可以表示的范围为0-2^32。
数值在存储(或调入内存)时,以数值型方式存储比字符型或日期时间类型更节省空间。在整数值存储上,0-255之间的任意整数都只占一个字节,256-65535之间的任意整数都占2个字节,而占用4个字节时便可以代表几十亿个整数之间的任意一个,这显然比字符型存储时每个字符占用一个字节节省空间的多。例如值"100"存储为字符型时占用三个字节,而存储为数值型将只占用一个字节。因此数据库默认将不使用引号包围的值当作数值型,如果明确要存储为字符型或日期时间型则应该使用引号包围以避免歧义。
值 CHAR(4) 存储需求 VARCHAR(4) 存储需求 ----------------------------------------------------------- '' ' ' 4个字节 '' 1个字节 'ab' 'ab ' 4个字节 'ab ' 3个字节 'abcd' 'abcd' 4个字节 'abcd' 5个字节 'abcdefgh' 'abcd' 4个字节 'abcd' 5个字节MySQL在检索或操作char时会删除尾随空格,也就是说在where语句中name='gaoxiaofang '和name='gaoxiaofang'的结果是一样的;若name='gaoxiaofang ',那么concat(name,'x')的结果将是gaoxiaofangx。
而检索或操作varchar时不会删除尾随空格。但是char类型的列和varchar类型的列进行比较会忽略尾随空格,即 char:a=varchar:a。
mysql> create table test(a char(10),b varchar(10)); mysql> insert into test select 'a ','a '; mysql> select concat(a,'x'),concat(b,'x'),a=b from test; +---------------+---------------+-----+ | concat(a,'x') | concat(b,'x') | a=b | +---------------+---------------+-----+ | ax | a x | 1 | +---------------+---------------+-----+ 1 row in set关于char(M)和varchar(M),其长度是M个字符(MySQL早期版本是M字节),其字节数和字符集有关,例如latain1字符集下char(30)表示能存储30个字符也就是30个字节,而utf8字符集下char(30)只能存储30个字符(哪怕是英文字母),但该列将占用30*3=90个字节的空间。
mysql> create table test9(a char(2) charset utf8mb4,b char(2)) charset=latain1; mysql> insert into test9 values('我是','wo'),('wo','wo'); mysql> select length(a),char_length(a),length(b),char_length(b) from test9; +-----------+----------------+-----------+----------------+ | length(a) | char_length(a) | length(b) | char_length(b) | +-----------+----------------+-----------+----------------+ | 6 | 2 | 2 | 2 | | 2 | 2 | 2 | 2 | +-----------+----------------+-----------+----------------+ 2 rows in set (0.00 sec)'varchar(M)的字节数还和存储的字节数有关,每2^8次方字节增加一字节结束符。
关于日期时间的输入方式是非常宽松的,以下几种方式都是被允许的:任意允许的分隔符,建议使用4位的年份。
2011-01-01 18:40:20 2011/01/01 18-40-20 20110101184020对于ENUM,插入数据时忽略大小写。如果enum列是允许NULL的,则NULL值也是有效值。