字符串类型
数据类型 | 长度 | 备注 |
char(x) | 固定长度 | x为1到255之间的整数 |
varchar(x) | 可变长度 | x为1到65535之间的整数,最多65535个字符,64KB |
mediumtext | 最长16MB | |
longtext | 最长4GB | |
tinytext | 最长255b | |
text | 最长64KB | |
注意: 为了维护数据库的一致性,可变长的字符串长度设置最好也能分类。varchar(50) 表示短字符串,varchar(255) 表示中等长度字符串,可以不用经常检查 |
国际字符:所有这些字符串类型都支持国际字符,其中:
- 英文字符占1个字节
- 欧洲和中东语言字符占2个字节
- 像中日这样的亚洲语言的字符占3个字节 所以,如果一列数据的类型为 CHAR(10),MySQL会预留30字节给那一列的值
整数类型
数据类型 | 长度 | 备注 |
tinyint | 1b | [-128, 127] |
unsigned tinyint | 1b | [0, 255] |
smallint | 2b | [-32k, 32k] |
mediumint | 3b | [-8M, 8M] |
int | 4b | [-2B, 2B] |
注意: 如果试图存入超过范围的数字,MySQL会报错 |
MySQL 还可以根据 INT 后面的数字来决定显示成什么样子,但是,这并不影响数字在MySQL中的存储
例如:1 int(4) => 0001
用最小的能满足需求的数据类型,这样数据库大小会更小,查询执行也会更快。
顶点和浮点类型
数据类型 | 类型 | 备注 |
decimal(p, s) | 定点数类型 | p,s分别表示精度(1~65)和小数位数 |
dec | 定点数类型 | 同上 |
numeric | 定点数类型 | 同上 |
fixed | 定点数类型 | 同上 |
float | 浮点数类型 4b | |
double | 双精度浮点数类型 8b |
如果需要记录精确的数字,比如货币金额,就是用 DECIMAL
类型
如果要进行科学计算,要处理很大或很小的数据,而且精确值不重要的话,就用 FLOAT
或 DOUBLE
布尔类型
- bool
- boolean
枚举和集合类型
ENUM() 从固定一系列值中取一个值
ENUM('small','medium','large') 表示这个类型中的值是括号内元素之一
SET() 和 ENUM() 类似,但是可以存多个值
不建议使用:
- 两者的类型不好复用,一旦某个地方修改,所有其他的地方都要修改,不如使用一张关系表,只需要多添加一条查询语句就可以实现
- 如果要修改enum类型中的值,会导致重建整张表,如果表中的数据很多,会非常耗费时间。
日期和时间类型
数据类型 | 大小 | 作用 |
date | 有日期没时间 | |
time | 有时间没日期 | |
datetime | 8b | 包含日期和时间 |
timestamp | 4b | 时间戳,常用来记录一行数据的的插入或最后更新时间 |
year | 专门储存四位的年份 |
blob类型
用 Blob
类型来储存大的二进制数据,包括PDF,图像,视频等等几乎所有的二进制的文件
具体来说,MySQL里共有4种 Blob 类型,它们的区别在于可储存的最大文件大小:
数据类型 | 大小 |
tinyblob | 255b |
blob | 65KB |
mediumblob | 16MB |
longblob | 4GB |
一般来说最好不要把文件存在数据库中,因为关系型数据库是为了处理结构化关系型数据库设计的会导致以下问题:
- 迅速增加数据库的大小
- 弱化数据备份功能
- 出现性能问题
- 在数据库中读取或者存储图像必须额外写代码
JSON类型
sql
复制代码
update products set properties = ' { "dimensions":[1,2,3], "weight":10, "manufacturer":{ "name":"sony" } } ' where product_id = 1;
上面的语句可以用MySQL内置的函数替换
sql
复制代码
update products set properties = json_object( 'weight','10', 'dimensions',json_array(1,2,3), 'manufacturer',json_object('name','sony') ) where product_id = 1;
还可以通过已经有的 MySQL 解析函数解析 JSON 格式
sql
复制代码
select product_id,json_extract(properties,'$.weight') as weight from products where product_id = 1;
还可以使用 -> 更简洁,后面可以继续通过 点 来调用
sql
复制代码
select product_id,properties -> '$.weight' from products where product_id = 1;
但是上面的结果数据都是由引号的,可以使用 ->> 来去掉,只返回值
sql
复制代码
select product_id,properties ->> '$.weight' from products where product_id = 1;
在查询语句里面也可以直接使用
sql
复制代码
select product_id,properties ->> '$.weight' from products where properties ->> '$.weight' = '10';
更新 json 中的某些值 下面的 json_set 和 json_remove 都是拾取一个 json 对象,修改并返回一个新的 json 对象。
我们其实是把这些属性设置到了一个由这个函数返回的新json对象上
sql
复制代码
update products set properties = json_set( properties, '$.weight', 20, '$.age',10 ) where product_id = 1; update products set properties = json_remove( properties, '$.weight', 20, '$.age',10 ) where product_id = 1;