# 设置字符集
# 数据库
create database if not exists dbtest character set 'utf8';
# 表
create table temp(
id int
)character set 'utf8';
# 字段
create table temp2(
id int,
address varchar(15) character set 'gbk'
);
# 整数类型
tinyint,smallint,mediumint,int,bigint
# 浮点数/定点数
浮点数的unsigned范围缩小一半
float(5,2)小数部分有2位,整数部分有3位(-999.99 ~ 999.99)
float(5,2) unsigned只能表示0-999.99
不指定时,默认按照实际的精度(实际硬件和OS决定)
浮点数存在误差
定点数decimal内部是用字符串进行存储的
decimal(M,D)占用字节数M+2,最大取值范围与double一样
decimal(5,2)也是表示(-999.99 ~ 999.99)
不指定M和D时,默认decimal(10,0)
# 日期类型
year: yyyy #范围(1901,2155)
time: HH:mm:ss
date: yyyy-MM-dd #(1000-01-01,9999-12-03)
datetime和timestamp都是yyyy-MM-dd HH:mm:ss
datetime占8字节,(1000-01-01 ~ 9999-12-31),范围更大
timestamp占4字节,(1970-01-01 ~ 2038-01-19)
timestamp底层存储的是距1970的毫秒值
timestamp会根据所在时区的不同展示不同的对应时间,datetime不会
# 字符串
char(M) # 固定M个字符, 不指定默认是1
varchar(M) # 必须指定M,实际占用存储空间为字符串占用字节数 + 1
# 长段文本
tinytext,text,mediumtext,longtext
# 二进制字符串
# 固定M个字节,不指定默认是1,如果字段值不足M个字节,将在右边填充'\0'补齐
binary(M)
# 必须指定M(可变长度)
varbinary(M)
# binary也可存中文,一个中文占3字节
create table test_binary(
f1 binary, # 能装1个字节
f2 binary(3), # 能装3个字节
f3 varbinary(10) # 最多10个字节
);
insert into test_binary values('a','彩','fwf');
# 二进制大对象
tinyblob,blob(64KB),mediumblob(16MB),longblob(4GB)
# 建议
任何字段如果为非负数,必须是unsigned
小数类型使用decimal,禁用float和double
varchar类型是可变长字符串,不预先分配存储空间,长度不要超过5000.
大于5000选择text类型,独立出来一张表,用主键对应,避免影响其他字段索引效率.
<!-- decimal类型比较大小 -->
<!-- priceLeft和priceRight都是java中的BigDecimal类型 -->
<!-- BigDecimal类型可以直接作为参数, 接收前端的数据, 也可以直接赋值给sql中的decimal型数据 -->
<if test="priceLeft != null and priceRight != null">
and price between #{priceLeft} and #{priceRight}
</if>