1 字符类型 char 和 varchar
- # 官网: https://dev.mysql.com/doc/refman/5.7/en/char.html
- # 注意: char 和 varchar 括号内的参数指的都是字符的长度
- #char 类型: 定长, 简单粗暴, 浪费空间, 存取速度快
字符长度范围: 0-255(一个中文是一个字符, 是 utf8 编码的 3 个字节)
存储:
存储 char 类型的值时, 会往右填充空格来满足长度
例如: 指定长度为 10, 存 > 10 个字符则报错, 存 < 10 个字符则用空格填充直到凑够 10 个字符存储
检索:
在检索或者说查询时, 查出的结果会自动删除尾部的空格, 除非我们打开 pad_char_to_full_length SQL 模式 (设置 SQL 模式: SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
查询 sql 的默认模式: select @@sql_mode;)
#varchar 类型: 变长, 精准, 节省空间, 存取速度慢
字符长度范围: 0-65535(如果大于 21845 会提示用其他类型 .mysql 行最大限制为 65535 字节, 字符编码为 utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
存储:
varchar 类型存储数据的真实内容, 不会用空格填充, 如果'ab', 尾部的空格也会被存起来
强调: varchar 类型会在真实数据前加 1-2Bytes 的前缀, 该前缀用来表示真实数据的 bytes 字节数 (1-2Bytes 最大表示 65535 个数字, 正好符合 mysql 对 row 的最大字节限制, 即已经足够使用)
如果真实的数据 < 255bytes 则需要 1Bytes 的前缀 (1Bytes=8bit 2**8 最大表示的数字为 255)
如果真实的数据 > 255bytes 则需要 2Bytes 的前缀 (2Bytes=16bit 2**16 最大表示的数字为 65535)
检索:
尾部有空格会保存下来, 在检索或者说查询时, 也会正常显示包含空格在内的内容
可以用这两个函数验证:
length(): 查看字节数
char_length(): 查看字符数
总结
# 常用字符串系列: char 与 varchar
注: 虽然 varchar 使用起来较为灵活, 但是从整个系统的性能角度来说, char 数据类型的处理速度更快, 有时甚至可以超出 varchar 处理速度的 50%. 因此, 用户在设计数据库时应当综合考虑各方面的因素, 以求达到最佳的平衡
# 其他字符串系列 (效率: char>varchar>text)
TEXT 系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY 系列 BINARY VARBINARY
text:text 数据类型用于保存变长的大字符串, 可以组多到 65535 (2**16 ? 1) 个字符.
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.
2, 枚举类型和集合
字段的值只能在给定范围中选择, 如单选框, 多选框
enum 单选 只能在给定的范围内选一个值, 如性别 sex 男 male / 女 female
set 多选 在给定的范围内可以选择一个或一个以上的值 (爱好 1, 爱好 2, 爱好 3...)
- mysql> create table consumer(
- -> id int,
- -> name varchar(50),
- -> sex enum('male','female','other'),
- -> level enum('vip1','vip2','vip3','vip4'),# 在指定范围内, 多选一
- -> fav set('play','music','read','study') #在指定范围内, 多选多
- -> );
- Query OK, 0 rows affected (0.03 sec)
- mysql> insert into consumer values
- -> (1,'赵云','male','vip2','read,study'),
- -> (2,'赵云 2','other','vip4','play');
- Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
- mysql> select * from consumer;
- +------+---------+-------+-------+------------+
- | id | name | sex | level | fav |
- +------+---------+-------+-------+------------+
| 1 | 赵云 | male | vip2 | read,study |
| 2 | 赵云 2 | other | vip4 | play |
- +------+---------+-------+-------+------------+
- rows in set (0.00 sec)
来源: http://www.bubuko.com/infodetail-2642044.html