第一章, 数据类型
- 存储超过定义的宽度,其实没有影响, 对插入的数据有任何影响,还是按照类型的实际精度进行保存,这是,宽度格式实际已经没有意义,左边不会再填充任何的“0”字符。
- 如果一个列指定为zerofill,则MySQL 自动为该列添加UNSIGNED 属性。
整数类型还有一个属性:AUTO_INCREMENT。在需要产生唯一标识符或顺序值时,
可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从1 开始,每行增加1。
在插入NULL 到一个AUTO_INCREMENT 列时,MySQL 插入一个比该列中当前最大值大1 的值。
一个表中最多只能有一个AUTO_INCREMENT列。对于任何想要使用AUTO_INCREMENT 的列,
应该定义为NOT NULL,并定义为PRIMARY KEY 或定义为UNIQUE 键。例如,可按下列
任何一种方式定义AUTO_INCREMENT 列:
CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
CREATE TABLE AI(ID INT AUTO_INCREMENT NOT NULL ,PRIMARY KEY(ID));
CREATE TABLE AI (ID INT AUTO_INCREMENT NOT NULL ,UNIQUE(ID));
关于bit, mysql 8.0 行为已经和mysql 5.6 行为不一致
第一个timestamp 默认值是current_timestamp, 但第二个timestamp 默认为0
timestamp 和时区相关, 插入日期时, 先转换为本地时区后存放, 取出时,也是先取出,后转换本地时区。 TIMESTAMP的取值范围为19700101080001到2038年的某一天
举例
MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用CHAR 或
VARCHAR 列都没有关系。两者都是作为CHAR 类型处理。
InnoDB 存储引擎:建议使用VARCHAR 类型。对于InnoDB 数据表,内部的行存储
124
格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在
本质上,使用固定长度的CHAR 列不一定比使用可变长度VARCHAR 列性能要好。因而,主
要的性能因素是数据行使用的存储总量。由于CHAR 平均占用的空间多于VARCHAR,因此使
用VARCHAR 来最小化需要处理的数据行的存储总量和磁盘I/O 是比较好的。
从上面的例子中,可以看出ENUM 类型是忽略大小写的,对’M’、’f’在存储的时候将它们都转
成了大写,还可以看出对于插入不在ENUM 指定范围内的值时,并没有返回警告,而是插
入了enum(‘M’,’F’)的第一值’M’,这点用户在使用时要特别注意。