一,数据类型
1>> 整数类型 int(5) 5指的是显示宽度(显示的数字个数,不是取值范围)
类型名称 | 说明 | 存储需求 | 取值范围 有符号 | 取值范围 无符号 |
tinyint | 很小的整数 | 1字节 | -128~127 | 0~255 |
smallint | 小的整数 | 2字节 | -32768~32767 | 0~65535 |
mediumint | 中等大小的整数 | 3字节 | -8388608~8388607 | 0~16777215 |
int | 普通大小的整数 | 4字节 | -2147483648~2147483647 | 0~4294967295 |
bigint | 大整数 | 8字节 | -9223372036854775808~ 9223372036854775807 | 0-18446744073709551615 |
2>> 浮点数类型和定点数类型
类型名称 | 说明 | 存储需求 |
float | 单精度浮点数 | 4字节 |
double | 双精度浮点数 | 8字节 |
decimal(M,D) | 定点数 | M+2字节 |
DECIMAL 的存储空间并不是固定的,而由精度值 M 决定,占用 M+2 个字节,
浮点类型和定点类型都可以用(M, D)
来表示,其中M
称为精度,表示总共的位数;D
称为标度,表示小数的位数。
浮点数类型的取值范围为 M(1~255)和 D(1~30,且不能大于 M-2),分别表示显示宽度和小数位数。M 和 D 在 FLOAT 和DOUBLE 中是可选的,FLOAT 和 DOUBLE 类型将被保存为硬件所支持的最大精度。DECIMAL 的默认 D 值为 0、M 值为 10
提示:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 DECIMAL 的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
3 >> 日期与时间类型
类型名称 | 日期格式 | 存储需求 | 日期最大范围 |
year | YYYY | 1字节 | 1901~2155 |
time | HH:MM:SS | 3字节 | 838:59:59 |
date | YYYY-MM-DD | 3字节 | 9999-12-31 |
datetime | YYYY-MM-DD HH:MM:SS | 8字节 | 9999-12-31 23:59:59 |
timestamp | YYYY-MM-DD HH:MM:SS | 4字节 | 2038-01-19 03:14:07 |
1> year 格式的指定
1)以4位字符串或4位数字表示year ,不管是 '2010' 还是2010 ,数据库插入都是2010。
2)以2位字符串表示year,范围 '00' 到 '99'。'00'~'69' 被转换为2000~2069,'70'~'99' 被转换为1970~1999,'0' 和 '00' 作用相同。插入超过取值范围的值将被转换为2000。
3)以2位数字表示的year,取值范围 1~99 。1~69 被转换为2001~2069 ,70~99 被转换为 1970~1999 ,这里0将被转换为0000而不是2000, 所以2000年要用字符串‘0’ 或‘00’ 表示
2 > time 格式表示
1)'D HH:MM:SS' 格式字符串在插入数据库时,D被转换为小时保存,格式为 'D*24+HH'
2)'HHMMSS' 格式或 HHMMSS 格式的数值假定是有意义的时间,且最右边的两位表示秒。如 1112 表示00:11:12秒,这种表示要合法,不合法的将存储为00:00:00 。如117012
3 > date 类型
1)以'YYYY-MM-DD' 或者'YYYYMMDD' 字符串格式表示日期,插入数据库都是2012-12-31这种格式
2)以'YY-MM-DD' 或者'YYMMDD' 字符串格式表示日期,YY表示的是年值,取值与year 一致,范围 '00' 到 '99','00'~'69' 被转换为2000~2069,'70'~'99' 被转换为1970~1999
3)以YY_MM_DD 或者YYMMDD数字格式表示的日期,00~69范围的年值转换为2000~2069;70~99范围的年值转换为1970~1999。如12-12-31库里存的2012-12-31,78-12-31库里存的1978-12-31
4)使用current_date 或者 now() 插入当前系统日期,current_date 返回当前日期值,不包括时间部分,now() 返回日期和时间值,落库时只保留日期部分。
4> datetime 类型
1)以'YYYY-MM-DD HH:MM:SS' 或者'YYYYMMDDHHMMSS' 字符串格式表示日期 时间,插入数据库都是2012-12-31 05:05:05这种格式
2) 以'YY-MM-DD HH:MM:SS' 或者'YYMMDDHHMMSS' 字符串格式表示日期 时间,YY表示的是年值,取值与year 一致,范围 '00' 到 '99','00'~'69' 被转换为2000~2069,'70'~'99' 被转换为1970~1999,如‘980515121214’ 插入数据库的值为1998-05-15 12:12:14。
3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期时间,都以2010-10-12 05:14:14 格式存在库里。2位的年值取值与year 一致,范围 '00' 到 '99','00'~'69' 被转换为2000~2069,'70'~'99' 被转换为1970~1999,如‘980515121214’ 插入数据库的值为1998-05-15 12:12:14。·
5> timestamp 类型
timestamp 的显示格式与 datatime 相同,但取值范围不同 。
timestamp 存储时间是以UTC(世界标准时间)格式保存的,存储时对当前时区进行转换,读取时转换为当前时区,根据时区的不同显示不同的时间。
设置时区 set time_zone = '+10:00' #设置当前时区为东10区
4>> 文本字符串类型
1> char 和 varchar 类型
char(M) 固定长度字符串 M的范围0~255, 不够长度以空格填充,检索时,末尾的空格被删除,适合MyISAM 存储引擎
varchar(M) 变长字符串,M的范围0~65535, 实际长度为字符串长度+1,保存和检索时尾部的空格仍然保留,适合InnoDB 存储引擎
2> text 类型
text 保存非二进制字符字符串,如文章内容,评论等,保存和查询时,不删除尾部空格。只能存储纯文本文件
text 有4种类型:tinytext text mediumtext longtext ,存储空间和数据长度都不同
3 > enum 类型
enum 是一个字符串对象,其值为表创建时在列规定中枚举的一列值。 一次取一个且只能取在列表中的值,不在列表中的值插入时会提示错误信息。
语法: 字段名 enum(' 值1',' 值2',' 值3' ,..... '值n') n 的取值1~65535
create table test1(soc int, level enum('excellent','good','bad'));
insert into test1 values(70,'good'),(90,1),(75,2),(50,3);
4> set 类型
set 是一个字符串对象,有零个或多个值,最多有64个,值为创建表时规定的一列值。在插入表时,可插入定义的列表中的多个字符的组合,自动去除重复, 插入set 列不支持的值,错误提示。
语法: set(' 值1',' 值2',' 值3' ,..... '值n') 尾部空格自动删除
create table test2(s set('a','b','c','d'));
insert into test2 values('a'),('a,b,a'),('c,a,d');
5>> 二进制字符串类型
1> bit 类型
bit 类型是位字段类型,bit(M) M 表示每个值的位数,范围1~64,省略默认为1,如果分配长度小于M,左边用0补齐,如bit(6) b'000101'。
bin() 函数将数字转换为二进制,bin(M+0) 将二进制的结果转换为对应的数字值
2> binary 和varbinary 类型
binary 和 varbinary 类型类似与char 和varchar, binary 为固定长度,不足右边用0补齐,varbinary 为变长,存储长度为实际存储字符串长度+1,包含二进制字节字符串
3> blob 类型
blob 是一个二进制大对象,存储可变数据,有4种类 型tinyblob,blob,mediumblob,longblob,blob 存储的是二进制字符串(字节字符串),text 存储的是非二进制字符串(字符字符串),blob 列没有字符集,排序和比较基于列字节的数值,text 列有一个字符集,根据字符集排序和比较。适合存储图片,音频信息
二,运算符
1>>算数运算符
运算符 | 作用 |
+ | 加法运算 |
- | 减法运算 |
× | 乘法运算 |
/ | 除法运算,返回商 |
% | 求余运算,返回余数 |
2>>比较运算符
运算符 | 作用 | 取值 | 返回结果 |
= | 等于 | 1,一个或俩个参数为null 2,俩个都是字符串 3,俩个都是整数 4,字符串和数字比较 | 1,null 2,按字符串比较 3,按整数比较 4,字符串自动转换为数字比较 |
<=> | 安全的等于 | 1,和等于作用相似 2,俩个参数都为null 3,一个参数为null | 2, 返回1 3,返回0 |
<> 或 != | 不等于 | 1, 判断数字,字符串,表达式 2,不能用于判断空值null | 1,不相等返回1, 相等返回0 2,返回null |
<= | 小于等于 | 1, 左边小于等于右边 2,不能用于判断空值null | 1,返回1, 否则返回0 2,返回null |
>= | 大于等于 | 1, 左边大于等于右边 2,不能用于判断空值null | 1,返回1, 否则返回0 2,返回null |
> | 大于 | 1, 左边大于右边 2,不能用于判断空值null | 1,返回1, 否则返回0 2,返回null |
< | 小于 | 1, 左边小于右边 2,不能用于判断空值null | 1,返回1, 否则返回0 2,返回null |
is null 或 isnull | 判断一个值是否为NULL | 值为NULL | 返回1, 否则返回0 |
is not null | 判断一个值是否不为NULL | 值非NULL | 返回1, 否则返回0 |
least | 在有俩个或多个参数时,返回最小值 | 1,语法:least( 值1,值2,值n) 2, 有一个值为NULL | 1,返回最小值 2,返回NULL |
greatest | 当有俩个或多个参数时,返回最大值 | 1,greatest( 值1,值2,值n) 2, 有一个值为NULL | 1,返回最大值 2,返回NULL |
between and | 判断一个值是否在俩个值之间 | 值在区间内 | 返回1, 否则返回0 |
in | 判断一个值是 in 列表中的任意一个值 | 1,判断值是否在 IN 列表中 2,NULL in () 3, 2 in (1,3,NULL) | 1,在返回1,否则返回0 2, 返回NULL 3,返回NULL |
not in | 判断一个值 不是 in 列表中的任意一个值 | 判断值是否在 IN 列表中 | 不在返回1,否则返回0 |
like | 通配符匹配 | 1,'%' 匹配任何数目的字符 2,'-' 匹配一个字符 3,匹配字符或匹配条件为NULL | 匹配成功返回1,否则返回0 3,返回NULL |
regexp | 正则表达式匹配 | 1,语法:expr regexp 匹配条件 2,'^' 匹配以匹配字符开头的字符串 3,'$' 匹配以匹配字符结尾的字符串 4,'.' 匹配任何一个单字符 5,'*' 匹配任何数量的任何字符 6,[...] 匹配括号内的任何字符 7,expr 或匹配条件为NULL | 1,匹配成功返回1,否则返回0 7,返回NULL |
3>> 逻辑运算符
运算符 | 作用 | 取值 | 返回结果 |
not 或者 ! | 逻辑非 | !0,!10,!NULL | 1,0,NULL |
and 或者 && | 逻辑与 | 1&&10,1&&0,1&&null | 1,0,NULL |
or 或者 || | 逻辑或 | 1 or 0,1 or NULL,0 or NULL,NULL or NULL,0 or 0 | 1,1, NULL,NULL,0 |
xor 等价 a and (not b) | 逻辑异或 | NULL xor NULL,1 xor 1 , 0 xor 0, 1 xor 0 | NULL,0 ,0 ,1 |
4>> 位运算符 (二进制计算)
运算符 | 作用 | 取值 | 返回结果 |
| | 位或 | 对应的位都是0时, | 0,否则为1 |
& | 位与 | 对应的位都是1时 | 1,否则为0 |
^ | 位异或 | 对应的位同时为1或0时 | 0,否则为1 |
<< | 位左移 | 0001<<2 ( 位移都是按二进制数据位移), | 0100 |
>> | 位右移 | 1000>>3 ( 位移都是按二进制数据位移) | 0001 |
~ | 位取反 | ~1000 (取反都是按二进制取反的) | 0001 |