MySQL数据库数据类型

目录

数值类型

整型

浮点型(float和double)

定点数

日期和时间类型

字符串(字符)类型

char和varchar:

varchar和text

二进制数据(_Blob)

复合类型

json

数据类型的属性

MYSQL数据类型字节长度一览表


MySQL支持多种数据类型,大致可以分为以下几类:

  • 数值类型(整数类型、浮点数类型和定点数类型)
  • 日期和时间类型
  • 字符串(字符)类型
  • 二进制类型
  • 复合类型
  • json
数值类型
整型

取值范围如果加了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和double)

设一个字段定义为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,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

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:

HAR和VARCHAR都是字符串类型,但它们的存储方式略有不同。

CHAR是定长字符串类型,每个字段的长度在创建时就已经确定,并且长度是固定的。这意味着无论实际存储的字符串长度是多少,它们都会占用相同的空间。例如,如果你将CHAR(3)设置为“abc”,那么它将占用3个字节的空间,即使它实际上只包含3个字符。

另一方面,VARCHAR是变长字符串类型,它的长度是根据实际存储的字符串长度动态调整的。这意味着如果你使用VARCHAR存储“abc”,它会只占用3个字节的空间,而不是固定占用3个字节。

因此,当你知道字符串的长度是固定的或者接近固定的时候,使用CHAR可以节省存储空间。但是,如果你不确定字符串的长度,或者需要存储非常长的字符串,使用VARCHAR可以提高存储效率

char类型的字符串检索速度要比varchar类型的快。

varchar和text

VARCHAR和TEXT都是MySQL中的字符串数据类型,但它们在存储大小、性能和应用场景等方面有所不同。

1. 存储大小:VARCHAR最大长度为65,535字符(包括空格),TEXT最大长度为2^31-1字符(包括空格)。text类型不能有默认值。

2. 性能:由于TEXT类型的数据量很大,因此在执行查询操作时可能会导致性能下降。这是因为MySQL必须将整个TEXT列加载到内存中才能进行处理。相比之下,VARCHAR列通常更小,因此查询速度更快。

3. 应用场景:VARCHAR适合存储较短且重复出现的文本值,例如名称、地址、电子邮件地址等;TEXT则适合存储较长且不太常见的文本值,例如博客文章、评论、产品描述等。

总之,在选择使用VARCHAR还是TEXT时,需要考虑数据量、查询频率和性能等因素。

二进制数据(_Blob)

1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。

2._BLOB存储的数据只能整体读出。 

3._TEXT可以指定字符集,_BLO不用指定字符集。        

MySQL数据类型 含义
BIT(M)
位字段类型 ,大约 (M+7)/8 字节
BINARY(M)
固定长度二进制字符串 ,M 字节
VARBINARY (M)
可变长度二进制字符串 ,M+1 字节
TINYBLOB (M)
非常小的 BLOB ,L+1 字节,在此, L<2^8
BLOB (M)
BLOB ,L+2 字节,在此, L<2^16
MEDIUMBLOB (M)
中等大小的 BLOB ,L+3 字节,在此, L<2^24
LONGBLOB (M)
非常大的 BLOB ,L+4 字节,在此, L<2^32
位字段类型。 M 表示每个值的位数,范围为 1 64 。如果 M 被省略,默认值为 1 。如果为 BIT(M) 列分配的值的长度小于 M 位,在值的左边用 0 填充。例如,为 BIT(6) 列分配一个值 b'101' ,其效果与分配b'000101' 相同。
BIT 数据类型用来保存位字段值,例如以二进制的形式保存数据 13 13 的二进制形式为 1101 ,在这里需要位数至少为 4 位的 BIT 类型,即可以定义列类型为 BIT(4) 。大于二进制 1111 的数据是不能插入 BIT(4)类型的字段中的。
复合类型

MySQL支持两种复合类型,分别是enum类型和set类型。

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类型:与 enum 类似,但是 set 类型允许存放多个值,并且可以通过逻辑运算符(AND、OR、NOT)来操作这些值。例如,可以使用 set 类型来表示一个人的兴趣爱好(篮球、足球、乒乓球、羽毛球)。

-- 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     |
+--------------+

需要注意的是,enum 和 set 类型都不能使用 NULL 值,也不能使用空字符串。同时,它们也没有顺序的概念,即它们的值不是按照定义的顺序排列的。

json
json 是一种特殊字符串,轻量级的数据格式,不同程序不同语言数据交换格式。
JSON JavaScript Object Notation, JS 对象简谱 ) 是一种轻量级的数据交换格式。它基于
ECMAScript ( 欧洲计算机协会制定的 js 规范 ) 的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
mysql 5.7 开始增加了 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 '[]'
  

MySQL的JSON数据类型允许您将复杂的数据结构存储在单个字段中,从而简化您的数据模型。您可以使用JSON数据类型来存储嵌套对象、数组和混合数据类型。此外,MySQL还提供了许多操作JSON数据的内置函数,如`JSON_EXTRACT()`、`JSON_OBJECT()`等。

以下是一个简单的MySQL JSON数据类型的例子:
--这个例子中,我们创建了一个名为`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

你可能感兴趣的:(数据库,mysql)