目录
数值类型
整型
浮点型(float和double)
定点数
日期和时间类型
字符串(字符)类型
char和varchar:
varchar和text
二进制数据(_Blob)
复合类型
json
数据类型的属性
MYSQL数据类型字节长度一览表
MySQL支持多种数据类型,大致可以分为以下几类:
取值范围如果加了unsigned,则可以存储更大范围的正整数,如tinyint unsigned的取值范围为(0~256)。TINYINT UNSIGNED通常用于需要存储较小整数值且不需要负数的情况,例如状态码、布尔值等。
MySQL数据类型 | 含义(有符号) |
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(+-9.22*10的18次方) |
设一个字段定义为float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。整数部分最大是3位,如果插入数12.123456,存储的是12.1234,如果插入12.12,存储的是12.1200.
MySQL数据类型 | 含义 |
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d 若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。 HAR和VARCHAR都是字符串类型,但它们的存储方式略有不同。 char类型的字符串检索速度要比varchar类型的快。 VARCHAR和TEXT都是MySQL中的字符串数据类型,但它们在存储大小、性能和应用场景等方面有所不同。 1. 存储大小:VARCHAR最大长度为65,535字符(包括空格),TEXT最大长度为2^31-1字符(包括空格)。text类型不能有默认值。 2. 性能:由于TEXT类型的数据量很大,因此在执行查询操作时可能会导致性能下降。这是因为MySQL必须将整个TEXT列加载到内存中才能进行处理。相比之下,VARCHAR列通常更小,因此查询速度更快。 3. 应用场景:VARCHAR适合存储较短且重复出现的文本值,例如名称、地址、电子邮件地址等;TEXT则适合存储较长且不太常见的文本值,例如博客文章、评论、产品描述等。 总之,在选择使用VARCHAR还是TEXT时,需要考虑数据量、查询频率和性能等因素。 1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。 2._BLOB存储的数据只能整体读出。 3._TEXT可以指定字符集,_BLO不用指定字符集。 MySQL支持两种复合类型,分别是enum类型和set类型。 Set类型:与 enum 类似,但是 set 类型允许存放多个值,并且可以通过逻辑运算符(AND、OR、NOT)来操作这些值。例如,可以使用 set 类型来表示一个人的兴趣爱好(篮球、足球、乒乓球、羽毛球)。 需要注意的是,enum 和 set 类型都不能使用 NULL 值,也不能使用空字符串。同时,它们也没有顺序的概念,即它们的值不是按照定义的顺序排列的。 MySQL的JSON数据类型允许您将复杂的数据结构存储在单个字段中,从而简化您的数据模型。您可以使用JSON数据类型来存储嵌套对象、数组和混合数据类型。此外,MySQL还提供了许多操作JSON数据的内置函数,如`JSON_EXTRACT()`、`JSON_OBJECT()`等。 定长字符串。日期和时间类型
MySQL数据类型
含义
date
日期 '2008-12-2'
time
时间 '12:25:36'
datetime
日期时间 '2008-12-2 22:06:44'
timestamp
自动存储记录修改时间
字符串(字符)类型
MySQL数据类型
含义
char(n)
固定长度,最多255个字符
varchar(n)
固定长度,最多65535个字符
tinytext
可变长度,最多255个字符
text
可变长度,最多65535个字符
mediumtext
可变长度,最多2的24次方-1个字符
longtext
可变长度,最多2的32次方-1个字符
char和varchar:
CHAR是定长字符串类型,每个字段的长度在创建时就已经确定,并且长度是固定的。这意味着无论实际存储的字符串长度是多少,它们都会占用相同的空间。例如,如果你将CHAR(3)设置为“abc”,那么它将占用3个字节的空间,即使它实际上只包含3个字符。
另一方面,VARCHAR是变长字符串类型,它的长度是根据实际存储的字符串长度动态调整的。这意味着如果你使用VARCHAR存储“abc”,它会只占用3个字节的空间,而不是固定占用3个字节。
因此,当你知道字符串的长度是固定的或者接近固定的时候,使用CHAR可以节省存储空间。但是,如果你不确定字符串的长度,或者需要存储非常长的字符串,使用VARCHAR可以提高存储效率varchar和text
二进制数据(_Blob)
MySQL数据类型
含义
复合类型
Enum类型:可以将一组固定的值作为一个单元来处理,这些值在定义时必须明确给出。例如,可以使用 enum 类型来表示性别(男、女)或者状态(成功、失败、等待)等。-- enum类型的创建和插入数据
-- enum类型只能接受固定列表中的某个值
CREATE TABLE person (id INT, gender ENUM('male', 'female'));
INSERT INTO person VALUES(1, 'male');
SELECT * FROM person;
+----+--------+
| id | gender |
+----+--------+
| 1 | male |
+----+--------+
-- set类型的创建和插入数据
-- set类型可以接受多个值,并且可以进行逻辑运算
CREATE TABLE hobby (hobby SET('basketball','football','pingpong','badminton'));
INSERT INTO hobby VALUES ('basketball'),('basketball, pingpong'),('football, badminton');
SELECT * FROM hobby;
+--------------+
| hobby |
+--------------+
| basketball |
| basketball, pingpong |
| football, badminton |
+--------------+
json
-- 以下是关于MySQL中JSON数据类型的更多示例:
-- 创建表
CREATE TABLE `tableName` (`col1` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `col2` VARCHAR(45), `data` JSON DEFAULT NULL);
INSERT INTO `tableName`(`col1`, `col2`) VALUES (NULL, 'test data'), (NULL, 'other test data');
SELECT * FROM `tableName`;
+----+--------+---------------------+
| col1| col2 | data |
+----+--------+---------------------+
| 1| test data| NULL |
| 2| other test data| NULL |
+----+--------+---------------------+
UPDATE `tableName` SET `data`=CAST('[ { "a":"A", "b":"B"},{ "c":"C"} ]' AS JSON) WHERE `col1`='1';
SELECT * FROM `tableName`;
+----+--------+---------------------+
| col1| col2 | data |
+----+--------+---------------------+
| 1| test data| [ {"a":"A","b":"B"},{"c":"C"} ] |
| 2| other test data| NULL |
+----+--------+---------------------+
DELETE FROM `tableName` WHERE `col1`='2';
SELECT * FROM `tableName`;
+----+--------+---------------------+
| col1| col2 | data |
+----+--------+---------------------+
| 1| test data| [ {"a":"A","b":"B"},{"c":"C"} ] |
+----+--------+---------------------+
```
-- 获取指定属性值
select CAST(JSON_UNQUOTE(JSON_EXTRACT("{\"a\":\"A\", \"b\":\"B\", \"c\":\"C\"}", "$.")) as CHAR) from dual limit 1;
// output: A
select CAST(JSON_UNQUOTE(JSON_EXTRACT("{\"a\":\"A\", \"b\":\"B\", \"c\":\"C\"}", "$.d")) as CHAR) from dual limit 1;
// output: NULL
select CAST(JSON_UNQUOTE(JSON_SEARCH("{\"a\":\"A\", \"b\":\"B\", \"c\":\"C\"}", "one", "all", "$[*].*"))) as CHAR from dual limit 1;
// output: B
select CAST(JSON_UNQUOTE(JSON_SEARCH("{\"a\":\"A\", \"b\":\"B\", \"c\":\"C\"}", "one", "all", "$[?(@.c)].*"))) as CHAR from dual limit 1;
// output: C
-- 修改指定属性值
create or replace function set_key_val() returns string soname 'libset_key_value.so';
-- set a new value to the existing object with specific path
update t1 set jdoc = set_key_val(jdoc,'$["fruit"]', '"apple"') where k = 1 and v = 9876543210;
delete from t1 where k in (1,2,3,4,5);
insert into t1 values ('1','1000000000',cast('{"animal":"cat", "color":"blue", "num":1}' as JSON));
insert into t1 values ('2','1000000001',cast('{"animal":"dog", "food":"meat", "price":12.50}' as JSON));
insert into t1 values ('3','1000000002',cast('{"toy":"ball", "owner":"john", "num":3}' as JSON));
insert into t1 values ('4','1000000003',cast('{"animal":"snake", "food":"mice", "length":2}"' as JSON));
insert into t1 values ('5','1000000004',cast('{"vehicle":"car", "speed":"fast", "manufacturer":"Honda" }' as JSON));
commit;
select * from t1;
-+---------------+------+---------------------------------------------------------+
| k | v | jdoc |
+---------------+------+---------------------------------------------------------+
| 1 | 1000000000 | {"animal":"cat", "color":"blue", "num":1,"fruit":"apple"} |
| 2 | 1000000001 | {"animal":"dog", "food":"meat", "price":12.50} |
| 3 | 1000000002 | {"toy":"ball", "owner":"john", "num":3} |
| 4 | 1000000003 | {"animal":"snake", "food":"mice", "length":2} |
| 5 | 1000000004 | {"vehicle":"car", "speed":"fast", "manufacturer":"Honda"} |
+---------------+------+---------------------------------------------------------+
-- add a new property at root level of an existing document
update t1 set jdoc = set_key_val(jdoc,'$','"hello world!"') where k between 1 and 5;
commit;
select * from t1;
-+---------------+------+----------------------------------------------------------------------------------+
| k | v | jdoc |
+---------------+------+----------------------------------------------------------------------------------+
| 1 | 1000000000 | {"hello world!", "animal":"cat", "color":"blue", "num":1,"fruit":"apple"} |
| 2 | 1000000001 | {"hello world!", "animal":"dog", "food":"meat", "price":12.50} |
| 3 | 1000000002 | {"hello world!", "toy":"ball", "owner":"john", "num":3} |
| 4 | 1000000003 | {"hello world!", "animal":"snake", "food":"mice", "length":2} |
| 5 | 1000000004 | {"hello world!", "vehicle":"car", "speed":"fast", "manufacturer":"Honda"} |
+---------------+------+----------------------------------------------------------------------------------+
```
-- 使用JSONPATH查询
select * from employees where department = $['department']
select * from employees where department like '%Json%'
select * from employees where department is Json
select * from employees where department contains Json
select * from employees where department matches Json
-- 使用JSONPATH进行查询
select * from employees where department @> department like '{'department': ['department']
select * from employees where department @> department contains 'department'
select * from employees where department matches '[]'
--这个例子中,我们创建了一个名为`users`的表,它有三个字段:`id`(主键)、`name`(不能为空)和`info`(默认为空JSON对象)
create table users (
id int auto_increment primary key,
name varchar(256) not null,
info json not null default "{}",
created timestamp default current_timestamp on update current_timestamp);
insert into users values (null, "John Doe", '{"age":30}');
select * from users where info->"$.age" = 30;
-- 第一条语句将一个包含年龄信息的JSON对象插入到`info`字段中。
-- 第二条语句使用JSON路径表达式查找所有年龄在30岁的用户。
数据类型的属性
MySQL关键字
含义
NULL
数据列可包含NULL值
NOT NULL
数据列不允许包含NULL值
DEFAULT
默认值
PRIMARY KEY
主键
AUTO_INCREMENT
自动递增,适用于整数类型
UNSIGNED
无符号
CHARACTER SET name
指定一个字符集
MYSQL数据类型字节长度一览表
数据类型
字节长度
范围或用法
Bit
1
无符号[0,255],有符号[-128,127],天缘博客备注:BIT和BOOL布尔型都占用1字节
TinyInt
1
整数[0,255]
SmallInt
2
无符号[0,65535],有符号[-32768,32767]
MediumInt
3
无符号[0,2^24-1],有符号[-2^23,2^23-1]]
Int
4
无符号[0,2^32-1],有符号[-2^31,2^31-1]
BigInt
8
无符号[0,2^64-1],有符号[-2^63 ,2^63 -1]
Float(M,D)
4
单精度浮点数。天缘博客提醒这里的D是精度,如果D<=24则为默认的FLOAT,如果D>24则会自动被转换为DOUBLE型。
Double(M,D)
8
双精度浮点。
Decimal(M,D)
M+1或M+2
未打包的浮点数,用法类似于FLOAT和DOUBLE,天缘博客提醒您如果在ASP中使用到Decimal数据类型,直接从数据库读出来的Decimal可能需要先转换成Float或Double类型后再进行运算。
Date
3
以YYYY-MM-DD的格式显示,比如:2009-07-19
Date Time
8
以YYYY-MM-DD HH:MM:SS的格式显示,比如:2009-07-19 11:22:30
TimeStamp
4
以YYYY-MM-DD的格式显示,比如:2009-07-19
Time
3
以HH:MM:SS的格式显示。比如:11:22:30
Year
1
以YYYY的格式显示。比如:2009
Char(M)
M
VarChar(M)
M
变长字符串,要求M<=255
Binary(M)
M
类似Char的二进制存储,特点是插入定长不足补0
VarBinary(M)
M
类似VarChar的变长二进制存储,特点是定长不补0
Tiny Text
Max:255
大小写不敏感
Text
Max:64K
大小写不敏感
Medium Text
Max:16M
大小写不敏感
Long Text
Max:4G
大小写不敏感
TinyBlob
Max:255
大小写敏感
Blob
Max:64K
大小写敏感
MediumBlob
Max:16M
大小写敏感
LongBlob
Max:4G
大小写敏感
Enum
1或2
最大可达65535个不同的枚举值
Set
可达8
最大可达64个不同的值
Geometry
Point
LineString
Polygon
MultiPoint
MultiLineString
MultiPolygon
GeometryCollection