字符与字节的区别
注意:char与varchar后面接的数据大小为存储的字符数,而不是字节数(其实是5.0版本以上是这样)
字符表示无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节。
char与varchar的差异
为方便说明,我们下面定义一个表:
CREATE TABLE `t_users` ( `name` CHAR(10) NOT NULL, `subject` VARCHAR(10) NOT NULL, `description` CHAR(10) NOT NULL ) INSERT INTO `t_users` (`name`, `subject`, `description`) VALUES ('zejin', 'zejin ', 'zejin ');
存数据时的区别
varchar是变长长度,长度范围为0-65535,存储时,如果字符没有达到定义的位数,也不会在后面补空格,在上例subject字段中,实际存储在数据中的数据为'zejin ',当然还有一或两个字节来描述该字节长度
取数据时的区别
数据库取char的数据时,会把后面的空格全部丢弃掉,譬如上例中的description字段取出来时只剩zejin
MysqL> select concat('(',name,')'),concat('(',description,')') from t_users; +----------------------+-----------------------------+ | concat('(',name,')') | concat('(',description,')') | +----------------------+-----------------------------+ | (zejin) | (zejin) | +----------------------+-----------------------------+ 1 row in set (0.00 sec)
也就是说,在char中的尾部存入空格时,最后取出来都会被丢弃。
当然指定PAD_CHAR_TO_FULL_LENGTH时,在取数据时让尾部的空格保留。
而数据库在取varchar数据时,尾部空格会保留,譬如subject字段:
MysqL> select concat('(',subject,')'),concat('(',description,')') from t_users; +-------------------------+-----------------------------+ | concat('(',subject,')') | concat('(',description,')') | +-------------------------+-----------------------------+ | (zejin ) | (zejin) | +-------------------------+-----------------------------+ 1 row in set (0.00 sec)
占用字节差别
Value | CHAR(4) | Storage required | VARCHAR(4) | Storage required |
'' | ' ' | 4 bytes | '' | 1 byte |
'ab' | 'ab ' | 4 bytes | 'ab' | 3 bytes |
'abcd' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
'abcdefgh' | 'abcd' | 4 bytes | 'abcd' | 5 bytes |
可以用上表来表示,当定义char时,不管你存入多少字符,都会占用到你定义的字符数,而用varchar时,则和你输入的字符数有关,会多一到两个字节来记录字节长度,当数据位占用的字节数小于255时,用1个字节来记录长度,数据位占用字节数大于255时,用2个字节来记录长度,还有一位来记录是否为nul值。
注意
MysqL> select name='zejin',name='zejin ' from t_users; +--------------+----------------+ | name='zejin' | name='zejin ' | +--------------+----------------+ | 1 | 1 | +--------------+----------------+ 1 row in set (0.00 sec) MysqL> select name like 'zejin',name like 'zejin ' from t_users; +-------------------+---------------------+ | name like 'zejin' | name like 'zejin ' | +-------------------+---------------------+ | 1 | 0 | +-------------------+---------------------+ 1 row in set (0.00 sec)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。