MySQL数值操作
显示宽度
可以在类型名称后面的括号中指定显示宽度,显示宽度就是SELECT结果的显示宽度,与范围无关。
显示宽度只用于显示,并不能限制取值范围和占用空间。
如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是 INT整型所允许的最大值。
INT(5) ZEROFILL表示数值宽度小于5位时在数字前面填满0;
默认情况是用空格填充,经过试验发现空格没有填充,所以如果不加ZEROFILL,其实意义不大。
如不指定则INT的默认宽度为INT(11);
UNSIGNED:可以用于取消符号位,如果一个列指定为ZEROFILL,则该列自动添加UNSIGNED属性。
AUTO_INCREMENT:这个属性只可以用于整数类型,一般从1开始,没添加一行自动增加1,如果插入一个数据的AUTO_INCREMENT值为NULL,实际插入值为列中当前最大值加1。
一个表中最多只能有一列具有AUTO_INCREMENT属性。AUTO_INCREMENT列应定义为NOT NULL,并定义为UNIQUE或者PRIMARY KEY。
创建带有AUTO_INCREMENT的列的三种方式:
1 - CREATE TABLE (id INT AUTO_INCREMENT NOT NULL PRIMARY KEY);
2 - CREATE TABLE (id INT AUTO_INCREMENT NOT NULL,..other column..,PRIMARY KEY(ID));
3 - CREATE TABLE (id INT AUTO_INCREMENT NOT NULL,..other column..,UNIQUE(ID));
浮点数操作
浮点数和定点数都可以用类型名加(M,D)来修饰。
其中M为数字位数(整数位+小数位),小数点后面有D位。即表示保留M位有效数字,其中小数有D位。
Float(5,5) Double(5,5) Decimal(5,5)
MYSQL保存值时采用了四舍五入,所以float(7,4)中插入999.00009 实际存储为 999.0001
另外,最好不要指定float和double的精度,而是采用由实际硬件和操作系统决定的默认精度。
而decimal则通常要指定精度,因为其默认值是(10,0)。
float和double存储数据超过精度时会进行四舍五入。
decimal存储超过精度时会报错。(MySQL报异常但是能四舍五入后存入)
BIT类型
BIT类型用于存放位字段值。BIT(M)可以存放多个二进制数,M~(1,64),默认为1位;
对于BIT类型的字段,直接查询显示一个笑脸。
正确查询方式:
select bin(bitColumn),hex(bitColumn) from tablename;
bin()与hex()分别为二进制操作与十六进制操作。
BIT类型插入时,先将值转化为二进制数,然后插入,如果超过位数会则插入失败。
比如 colunmA bit(1) 如果插入值为2 (10)超过限制的1位,则报错。
日期时间类型
日期时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-31 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 1970010108001 | 2038年的某个时刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
这些数据类型的区别如下:
- 如果表示年月日,则用DATE。
- 如果表示时分秒,则用TIME。
- 如果表示年月日时分秒,则用DATETIME。
- 如果需要经常插入或者更新日期时间为当前系统时间,则用TIMESTAMP,
返回后将格式设置为”YY-MM-DD HH:MM:SS“。 - 如果只表示年份,则使用YEAR
日期时间存储
如果存储时日期超出有效范围,将所有位以0填充并存储。
Create table t(time1 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
time2 TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00');
default 用于设置该列的默认值,在插入为NULL时会自动设为默认值。
CURRENT_TIMESTAMP 为当前的时间戳。
TIMESTAMP的另一个特性是插入时会转为本地时区,取出时也会转为本地时区。
TIMESTAMP存入时,如果从后往前读可以匹配为一个有效时期,则补全存储。否则存0值
now() 获取当前时间。
任何标点符号都可以作为日期部分或时间部分的分隔符。
参考资料:《深入浅出MySQL》