当前位置: 首页 > article >正文

第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]

第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]

MySQL 支持多种数据类型,这些数据类型可以分为几大类:数值类型、字符串类型、日期和时间类型、二进制类型以及枚举和集合。每种类型都有其特定的用途和存储需求。以下是 MySQL 中常用的数据类型的详细介绍:

1. 数值类型

在MySQL中,数值类型用于存储整数和浮点数。以下是一些常见的数值类型及其示例,包括如何创建表、插入数据以及查询数据。

1. 整数类型

TINYINT
  • 范围:-128 到 127(有符号),0 到 255(无符号)
  • 大小:1 字节
CREATE TABLE TinyIntExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tinyint_col TINYINT
);

INSERT INTO TinyIntExample (tinyint_col) VALUES (100);
INSERT INTO TinyIntExample (tinyint_col) VALUES (-100);
INSERT INTO TinyIntExample (tinyint_col) VALUES (255); -- 无符号时有效
-- 查询所有 TinyIntExample 表中的数据
SELECT * FROM TinyIntExample;


mysql> create database taoyuan;
Query OK, 1 row affected (0.01 sec)

mysql> use taoyuan;
Database changed
mysql> CREATE TABLE TinyIntExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     tinyint_col TINYINT
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO TinyIntExample (tinyint_col) VALUES (100);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO TinyIntExample (tinyint_col) VALUES (-100);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO TinyIntExample (tinyint_col) VALUES (255);
ERROR 1264 (22003): Out of range value for column 'tinyint_col' at row 1
mysql> select * from TinyIntExample;
+----+-------------+
| id | tinyint_col |
+----+-------------+
|  1 |         100 |
|  2 |        -100 |
+----+-------------+
2 rows in set (0.00 sec)

mysql>

在这里插入图片描述

SMALLINT
  • 范围:-32768 到 32767(有符号),0 到 65535(无符号)
  • 大小:2 字节
CREATE TABLE SmallIntExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    smallint_col SMALLINT
);

INSERT INTO SmallIntExample (smallint_col) VALUES (10000);
INSERT INTO SmallIntExample (smallint_col) VALUES (-10000);
INSERT INTO SmallIntExample (smallint_col) VALUES (65535); -- 无符号时有效
-- 查询所有 SmallIntExample 表中的数据
SELECT * FROM SmallIntExample;

mysql> CREATE TABLE SmallIntExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     smallint_col SMALLINT
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO SmallIntExample (smallint_col) VALUES (10000);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO SmallIntExample (smallint_col) VALUES (-10000);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO SmallIntExample (smallint_col) VALUES (65535);
ERROR 1264 (22003): Out of range value for column 'smallint_col' at row 1
mysql> select * from SmallIntExample;
+----+--------------+
| id | smallint_col |
+----+--------------+
|  1 |        10000 |
|  2 |       -10000 |
+----+--------------+
2 rows in set (0.00 sec)

mysql>

在这里插入图片描述

MEDIUMINT
  • 范围:-8388608 到 8388607(有符号),0 到 16777215(无符号)
  • 大小:3 字节
CREATE TABLE MediumIntExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    mediumint_col MEDIUMINT
);

INSERT INTO MediumIntExample (mediumint_col) VALUES (1000000);
INSERT INTO MediumIntExample (mediumint_col) VALUES (-1000000);
INSERT INTO MediumIntExample (mediumint_col) VALUES (8388608); -- 无符号时有效
INSERT INTO MediumIntExample (mediumint_col) VALUES (8388607);
-- 查询所有 MediumIntExample 表中的数据
SELECT * FROM MediumIntExample;

mysql> CREATE TABLE MediumIntExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     mediumint_col MEDIUMINT
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO MediumIntExample (mediumint_col) VALUES (1000000);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO MediumIntExample (mediumint_col) VALUES (-1000000);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO MediumIntExample (mediumint_col) VALUES (8388608);
ERROR 1264 (22003): Out of range value for column 'mediumint_col' at row 1
mysql> INSERT INTO MediumIntExample (mediumint_col) VALUES (8388607);
Query OK, 1 row affected (0.01 sec)

mysql> select * from MediumIntExample;
+----+---------------+
| id | mediumint_col |
+----+---------------+
|  1 |       1000000 |
|  2 |      -1000000 |
|  3 |       8388607 |
+----+---------------+
3 rows in set (0.00 sec)

mysql>

在这里插入图片描述

INT 或 INTEGER
  • 范围:-2147483648 到 2147483647(有符号),0 到 4294967295(无符号)
  • 大小:4 字节
CREATE TABLE IntExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    int_col INT
);

INSERT INTO IntExample (int_col) VALUES (100000000);
INSERT INTO IntExample (int_col) VALUES (-100000000);
INSERT INTO IntExample (int_col) VALUES (4294967295); -- 无符号时有效
INSERT INTO IntExample (int_col) VALUES (2147483647);
-- 查询所有 IntExample 表中的数据
SELECT * FROM IntExample;


mysql> CREATE TABLE IntExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     int_col INT
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO IntExample (int_col) VALUES (100000000);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO IntExample (int_col) VALUES (-100000000);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO IntExample (int_col) VALUES (4294967295);
ERROR 1264 (22003): Out of range value for column 'int_col' at row 1
mysql> INSERT INTO IntExample (int_col) VALUES (2147483647);
Query OK, 1 row affected (0.02 sec)

mysql> select * from IntExample;
+----+------------+
| id | int_col    |
+----+------------+
|  1 |  100000000 |
|  2 | -100000000 |
|  3 | 2147483647 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

在这里插入图片描述

BIGINT
  • 范围:-9223372036854775808 到 9223372036854775807(有符号),0 到 18446744073709551615(无符号)
  • 大小:8 字节
CREATE TABLE BigIntExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    bigint_col BIGINT
);

INSERT INTO BigIntExample (bigint_col) VALUES (1000000000000);
INSERT INTO BigIntExample (bigint_col) VALUES (-1000000000000);
INSERT INTO BigIntExample (bigint_col) VALUES (18446744073709551615); -- 无符号时有效
INSERT INTO BigIntExample (bigint_col) VALUES (9223372036854775807);
-- 查询所有 BigIntExample 表中的数据
SELECT * FROM BigIntExample;


mysql> CREATE TABLE BigIntExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     bigint_col BIGINT
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO BigIntExample (bigint_col) VALUES (1000000000000);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO BigIntExample (bigint_col) VALUES (-1000000000000);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO BigIntExample (bigint_col) VALUES (18446744073709551615);
ERROR 1264 (22003): Out of range value for column 'bigint_col' at row 1
mysql> INSERT INTO BigIntExample (bigint_col) VALUES (9223372036854775807);
Query OK, 1 row affected (0.01 sec)

mysql> select * from BigIntExample;
+----+---------------------+
| id | bigint_col          |
+----+---------------------+
|  1 |       1000000000000 |
|  2 |      -1000000000000 |
|  3 | 9223372036854775807 |
+----+---------------------+
3 rows in set (0.00 sec)

mysql>

在这里插入图片描述

2. 浮点数类型

FLOAT
  • 范围:单精度浮点数,4 字节
  • 精度:大约 7 位小数
CREATE TABLE FloatExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    float_col FLOAT
);

INSERT INTO FloatExample (float_col) VALUES (123.456);
INSERT INTO FloatExample (float_col) VALUES (-123.456);
INSERT INTO FloatExample (float_col) VALUES (1.234567e+38); -- 最大值
-- 查询所有 FloatExample 表中的数据
SELECT * FROM FloatExample;

mysql> CREATE TABLE FloatExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     float_col FLOAT
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO FloatExample (float_col) VALUES (123.456);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO FloatExample (float_col) VALUES (-123.456);
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO FloatExample (float_col) VALUES (1.234567e+38);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM FloatExample;
+----+------------+
| id | float_col  |
+----+------------+
|  1 |    123.456 |
|  2 |   -123.456 |
|  3 | 1.23457e38 |
+----+------------+
3 rows in set (0.00 sec)

mysql> 

在这里插入图片描述

DOUBLE
  • 范围:双精度浮点数,8 字节
  • 精度:大约 15 位小数
CREATE TABLE DoubleExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    double_col DOUBLE
);

INSERT INTO DoubleExample (double_col) VALUES (123.4567890123456);
INSERT INTO DoubleExample (double_col) VALUES (-123.4567890123456);
INSERT INTO DoubleExample (double_col) VALUES (1.7976931348623157e+308); -- 最大值
-- 查询所有 DoubleExample 表中的数据
SELECT * FROM DoubleExample;

mysql> CREATE TABLE DoubleExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     double_col DOUBLE
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO DoubleExample (double_col) VALUES (123.4567890123456);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO DoubleExample (double_col) VALUES (-123.4567890123456);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO DoubleExample (double_col) VALUES (1.7976931348623157e+308);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM DoubleExample;
+----+------------------------+
| id | double_col             |
+----+------------------------+
|  1 |      123.4567890123456 |
|  2 |     -123.4567890123456 |
|  3 | 1.7976931348623157e308 |
+----+------------------------+
3 rows in set (0.00 sec)

mysql>

在这里插入图片描述

DECIMAL
  • 范围:定点数,用于精确计算,例如货币
  • 格式DECIMAL(M, D),其中 M 是总位数,D 是小数点后的位数
CREATE TABLE DecimalExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    decimal_col DECIMAL(10, 2)
);

INSERT INTO DecimalExample (decimal_col) VALUES (12345.67);
INSERT INTO DecimalExample (decimal_col) VALUES (-12345.67);
INSERT INTO DecimalExample (decimal_col) VALUES (9999999.99); -- 最大值
-- 查询所有 DecimalExample 表中的数据
SELECT * FROM DecimalExample;


mysql> CREATE TABLE DecimalExample (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     decimal_col DECIMAL(10, 2)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO DecimalExample (decimal_col) VALUES (12345.67);
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO DecimalExample (decimal_col) VALUES (-12345.67);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO DecimalExample (decimal_col) VALUES (9999999.99);
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM DecimalExample;
+----+-------------+
| id | decimal_col |
+----+-------------+
|  1 |    12345.67 |
|  2 |   -12345.67 |
|  3 |  9999999.99 |
+----+-------------+
3 rows in set (0.00 sec)

mysql>

在这里插入图片描述

通过这些示例,你可以看到如何在MySQL中使用不同的数值类型来存储和查询数据。选择合适的数据类型对于确保数据的准确性和性能非常重要。

2. 字符串类型

在MySQL中,字符串类型用于存储文本数据。以下是一些常见的字符串类型及其示例,包括如何创建表、插入数据以及查询数据。

1. 固定长度字符串类型

CHAR
  • 描述:固定长度的字符串,最大长度为255个字符。
  • 存储:如果插入的字符串长度小于定义的长度,MySQL会用空格填充到指定长度。
CREATE TABLE CharExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    char_col CHAR(10)
);

INSERT INTO CharExample (char_col) VALUES ('Hello'); -- 实际存储为 'Hello     '
INSERT INTO CharExample (char_col) VALUES ('World'); -- 实际存储为 'World     '
-- 查询所有 CharExample 表中的数据
SELECT * FROM CharExample;

在这里插入图片描述

2. 可变长度字符串类型

VARCHAR
  • 描述:可变长度的字符串,最大长度为65,535个字符。
  • 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
CREATE TABLE VarcharExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    varchar_col VARCHAR(50)
);

INSERT INTO VarcharExample (varchar_col) VALUES ('Hello');
INSERT INTO VarcharExample (varchar_col) VALUES ('World');
-- 查询所有 VarcharExample 表中的数据
SELECT * FROM VarcharExample;

3. 二进制字符串类型

BINARY
  • 描述:固定长度的二进制字符串,最大长度为255个字节。
  • 存储:如果插入的字符串长度小于定义的长度,MySQL会用零字节填充到指定长度。
CREATE TABLE BinaryExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    binary_col BINARY(10)
);

INSERT INTO BinaryExample (binary_col) VALUES (UNHEX('48656C6C6F')); -- 'Hello'
INSERT INTO BinaryExample (binary_col) VALUES (UNHEX('576F726C64')); -- 'World'
-- 查询所有 BinaryExample 表中的数据
SELECT * FROM BinaryExample;

在这里插入图片描述

VARBINARY
  • 描述:可变长度的二进制字符串,最大长度为65,535个字节。
  • 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
CREATE TABLE VarbinaryExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    varbinary_col VARBINARY(50)
);

INSERT INTO VarbinaryExample (varbinary_col) VALUES (UNHEX('48656C6C6F')); -- 'Hello'
INSERT INTO VarbinaryExample (varbinary_col) VALUES (UNHEX('576F726C64')); -- 'World'
-- 查询所有 VarbinaryExample 表中的数据
SELECT * FROM VarbinaryExample;

在这里插入图片描述

4. 文本类型

TINYTEXT
  • 描述:最多255个字符的文本。
  • 存储:最多255个字符。
CREATE TABLE TinytextExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tinytext_col TINYTEXT
);

INSERT INTO TinytextExample (tinytext_col) VALUES ('Short text');
-- 查询所有 TinytextExample 表中的数据
SELECT * FROM TinytextExample;

在这里插入图片描述

TEXT
  • 描述:最多65,535个字符的文本。
  • 存储:最多65,535个字符。
CREATE TABLE TextExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    text_col TEXT
);

INSERT INTO TextExample (text_col) VALUES ('This is a longer text that can be up to 65,535 characters.');
-- 查询所有 TextExample 表中的数据
SELECT * FROM TextExample;
MEDIUMTEXT
  • 描述:最多16,777,215个字符的文本。
  • 存储:最多16,777,215个字符。
CREATE TABLE MediumtextExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    mediumtext_col MEDIUMTEXT
);

INSERT INTO MediumtextExample (mediumtext_col) VALUES ('This is an even longer text that can be up to 16,777,215 characters.');
-- 查询所有 MediumtextExample 表中的数据
SELECT * FROM MediumtextExample;
LONGTEXT
  • 描述:最多4,294,967,295个字符的文本。
  • 存储:最多4,294,967,295个字符。
CREATE TABLE LongtextExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    longtext_col LONGTEXT
);

INSERT INTO LongtextExample (longtext_col) VALUES ('This is the longest text type in MySQL, capable of storing up to 4,294,967,295 characters.');
-- 查询所有 LongtextExample 表中的数据
SELECT * FROM LongtextExample;

通过这些示例,你可以看到如何在MySQL中使用不同的字符串类型来存储和查询数据。选择合适的数据类型对于确保数据的准确性和性能非常重要。

3. 日期和时间类型

在MySQL中,日期和时间类型用于存储日期和时间信息。以下是一些常见的日期和时间类型及其示例,包括如何创建表、插入数据以及查询数据。

1. 日期类型

DATE
  • 描述:用于存储日期值,格式为 YYYY-MM-DD
  • 范围:从 '1000-01-01''9999-12-31'
CREATE TABLE DateExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    date_col DATE
);

INSERT INTO DateExample (date_col) VALUES ('2023-10-01');
INSERT INTO DateExample (date_col) VALUES ('2023-12-31');
-- 查询所有 DateExample 表中的数据
SELECT * FROM DateExample;

在这里插入图片描述

2. 时间类型

TIME
  • 描述:用于存储时间值,格式为 HH:MM:SS
  • 范围:从 '-838:59:59''838:59:59'
CREATE TABLE TimeExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    time_col TIME
);

INSERT INTO TimeExample (time_col) VALUES ('12:34:56');
INSERT INTO TimeExample (time_col) VALUES ('23:59:59');

3. 日期和时间类型

DATETIME
  • 描述:用于存储日期和时间值,格式为 YYYY-MM-DD HH:MM:SS
  • 范围:从 '1000-01-01 00:00:00''9999-12-31 23:59:59'
CREATE TABLE DateTimeExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    datetime_col DATETIME
);

INSERT INTO DateTimeExample (datetime_col) VALUES ('2023-10-01 12:34:56');
INSERT INTO DateTimeExample (datetime_col) VALUES ('2023-12-31 23:59:59');
TIMESTAMP
  • 描述:用于存储日期和时间值,格式为 YYYY-MM-DD HH:MM:SS
  • 范围:从 '1970-01-01 00:00:01' UTC'2038-01-19 03:14:07' UTC
  • 特性:自动初始化和更新为当前日期和时间。
CREATE TABLE TimestampExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    timestamp_col TIMESTAMP
);

INSERT INTO TimestampExample (timestamp_col) VALUES ('2023-10-01 12:34:56');
INSERT INTO TimestampExample (timestamp_col) VALUES ('2023-12-31 23:59:59');

-- 自动初始化和更新
CREATE TABLE AutoTimestampExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO AutoTimestampExample (created_at) VALUES (DEFAULT);
UPDATE AutoTimestampExample SET id = id + 1 WHERE id = 1;
-- 查询所有 AutoTimestampExample 表中的数据
SELECT * FROM AutoTimestampExample;

在这里插入图片描述

4. 年份类型

YEAR
  • 描述:用于存储年份值,格式为 YYYYYY
  • 范围:从 '1901''2155'
CREATE TABLE YearExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    year_col YEAR
);

INSERT INTO YearExample (year_col) VALUES (2023);
INSERT INTO YearExample (year_col) VALUES (1990);

查询示例

假设我们已经创建了上述表并插入了一些数据,现在我们可以查询这些数据:

-- 查询所有 DateExample 表中的数据
SELECT * FROM DateExample;

-- 查询所有 TimeExample 表中的数据
SELECT * FROM TimeExample;

-- 查询所有 DateTimeExample 表中的数据
SELECT * FROM DateTimeExample;

-- 查询所有 TimestampExample 表中的数据
SELECT * FROM TimestampExample;

-- 查询所有 YearExample 表中的数据
SELECT * FROM YearExample;

-- 查询所有 AutoTimestampExample 表中的数据
SELECT * FROM AutoTimestampExample;

日期和时间函数

MySQL提供了许多内置函数来处理日期和时间数据。以下是一些常用的函数示例:

获取当前日期和时间
SELECT CURRENT_DATE(); -- 获取当前日期
SELECT CURRENT_TIME(); -- 获取当前时间
SELECT NOW();          -- 获取当前日期和时间
SELECT CURRENT_TIMESTAMP(); -- 获取当前日期和时间
日期和时间的格式化
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 格式化日期和时间
日期和时间的计算
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 当前日期加上一天
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR); -- 当前时间减去一小时
提取日期和时间部分
SELECT YEAR(NOW()); -- 提取年份
SELECT MONTH(NOW()); -- 提取月份
SELECT DAY(NOW()); -- 提取日
SELECT HOUR(NOW()); -- 提取小时
SELECT MINUTE(NOW()); -- 提取分钟
SELECT SECOND(NOW()); -- 提取秒

通过这些示例,你可以看到如何在MySQL中使用不同的日期和时间类型来存储和查询数据。选择合适的数据类型和使用适当的函数可以让你更有效地处理日期和时间信息。

4. 二进制类型

在MySQL中,二进制类型用于存储二进制数据,如图片、文件或其他二进制流。以下是一些常见的二进制类型及其示例,包括如何创建表、插入数据以及查询数据。

1. 固定长度二进制类型

BINARY
  • 描述:固定长度的二进制字符串,最大长度为255个字节。
  • 存储:如果插入的字符串长度小于定义的长度,MySQL会用零字节填充到指定长度。
CREATE TABLE BinaryExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    binary_col BINARY(10)
);

-- 插入二进制数据
INSERT INTO BinaryExample (binary_col) VALUES (UNHEX('48656C6C6F')); -- 'Hello'
INSERT INTO BinaryExample (binary_col) VALUES (UNHEX('576F726C64')); -- 'World'

-- 查询数据
SELECT id, HEX(binary_col) AS hex_value FROM BinaryExample;

2. 可变长度二进制类型

VARBINARY
  • 描述:可变长度的二进制字符串,最大长度为65,535个字节。
  • 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
CREATE TABLE VarbinaryExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    varbinary_col VARBINARY(50)
);

-- 插入二进制数据
INSERT INTO VarbinaryExample (varbinary_col) VALUES (UNHEX('48656C6C6F')); -- 'Hello'
INSERT INTO VarbinaryExample (varbinary_col) VALUES (UNHEX('576F726C64')); -- 'World'

-- 查询数据
SELECT id, HEX(varbinary_col) AS hex_value FROM VarbinaryExample;

3. 大对象二进制类型

TINYBLOB
  • 描述:最多255个字节的二进制大对象。
  • 存储:最多255个字节。
CREATE TABLE TinyblobExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tinyblob_col TINYBLOB
);

-- 插入二进制数据
INSERT INTO TinyblobExample (tinyblob_col) VALUES (UNHEX('48656C6C6F')); -- 'Hello'
INSERT INTO TinyblobExample (tinyblob_col) VALUES (UNHEX('576F726C64')); -- 'World'

-- 查询数据
SELECT id, HEX(tinyblob_col) AS hex_value FROM TinyblobExample;

在这里插入图片描述

BLOB
  • 描述:最多65,535个字节的二进制大对象。
  • 存储:最多65,535个字节。
CREATE TABLE BlobExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    blob_col BLOB
);

-- 插入二进制数据
INSERT INTO BlobExample (blob_col) VALUES (UNHEX('48656C6C6F20576F726C64')); -- 'Hello World'
INSERT INTO BlobExample (blob_col) VALUES (LOAD_FILE('/path/to/file.jpg')); -- 插入文件内容

-- 查询数据
SELECT id, HEX(blob_col) AS hex_value FROM BlobExample;
MEDIUMBLOB
  • 描述:最多16,777,215个字节的二进制大对象。
  • 存储:最多16,777,215个字节。
CREATE TABLE MediumblobExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    mediumblob_col MEDIUMBLOB
);

-- 插入二进制数据
INSERT INTO MediumblobExample (mediumblob_col) VALUES (UNHEX('48656C6C6F20576F726C64')); -- 'Hello World'
INSERT INTO MediumblobExample (mediumblob_col) VALUES (LOAD_FILE('/path/to/large_file.jpg')); -- 插入大文件内容

-- 查询数据
SELECT id, HEX(mediumblob_col) AS hex_value FROM MediumblobExample;
LONGBLOB
  • 描述:最多4,294,967,295个字节的二进制大对象。
  • 存储:最多4,294,967,295个字节。
CREATE TABLE LongblobExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    longblob_col LONGBLOB
);

-- 插入二进制数据
INSERT INTO LongblobExample (longblob_col) VALUES (UNHEX('48656C6C6F20576F726C64')); -- 'Hello World'
INSERT INTO LongblobExample (longblob_col) VALUES (LOAD_FILE('/path/to/large_file.jpg')); -- 插入大文件内容

-- 查询数据
SELECT id, HEX(longblob_col) AS hex_value FROM LongblobExample;

查询示例

假设我们已经创建了上述表并插入了一些数据,现在我们可以查询这些数据:

-- 查询所有 BinaryExample 表中的数据
SELECT id, HEX(binary_col) AS hex_value FROM BinaryExample;

-- 查询所有 VarbinaryExample 表中的数据
SELECT id, HEX(varbinary_col) AS hex_value FROM VarbinaryExample;

-- 查询所有 TinyblobExample 表中的数据
SELECT id, HEX(tinyblob_col) AS hex_value FROM TinyblobExample;

-- 查询所有 BlobExample 表中的数据
SELECT id, HEX(blob_col) AS hex_value FROM BlobExample;

-- 查询所有 MediumblobExample 表中的数据
SELECT id, HEX(mediumblob_col) AS hex_value FROM MediumblobExample;

-- 查询所有 LongblobExample 表中的数据
SELECT id, HEX(longblob_col) AS hex_value FROM LongblobExample;

二进制数据的插入和查询

  1. 插入二进制数据

    • 使用 UNHEX 函数将十六进制字符串转换为二进制数据。
    • 使用 LOAD_FILE 函数从文件系统中加载二进制文件内容。
  2. 查询二进制数据

    • 使用 HEX 函数将二进制数据转换为十六进制字符串以便查看。

通过这些示例,你可以看到如何在MySQL中使用不同的二进制类型来存储和查询数据。选择合适的数据类型对于确保数据的准确性和性能非常重要。

5.枚举和集合

在MySQL中,枚举(ENUM)和集合(SET)是两种特殊的数据类型,用于存储一组预定义的值。它们在某些场景下非常有用,可以提高数据的完整性和查询效率。

1. 枚举(ENUM)

枚举类型允许你定义一个列,该列只能从一组预定义的值中选择。这些值在创建表时定义,并且在插入数据时必须是这些值之一。

创建表
CREATE TABLE EnumExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status ENUM('New', 'Processing', 'Completed', 'Cancelled')
);
插入数据
INSERT INTO EnumExample (status) VALUES ('New');
INSERT INTO EnumExample (status) VALUES ('Processing');
INSERT INTO EnumExample (status) VALUES ('Completed');
INSERT INTO EnumExample (status) VALUES ('Cancelled');
查询数据
SELECT * FROM EnumExample;

在这里插入图片描述

注意事项
  • 枚举值是区分大小写的。
  • 如果插入的值不在预定义的枚举值中,MySQL会抛出错误。
  • 枚举值在内部是以整数形式存储的,从1开始编号。例如,‘New’ 对应 1,‘Processing’ 对应 2,依此类推。

2. 集合(SET)

集合类型允许你定义一个列,该列可以包含一组预定义值的任意组合。这些值在创建表时定义,并且在插入数据时可以是这些值的任意子集。

创建表
CREATE TABLE SetExample (
    id INT AUTO_INCREMENT PRIMARY KEY,
    permissions SET('Read', 'Write', 'Execute')
);
插入数据
INSERT INTO SetExample (permissions) VALUES ('Read');
INSERT INTO SetExample (permissions) VALUES ('Write');
INSERT INTO SetExample (permissions) VALUES ('Read,Write');
INSERT INTO SetExample (permissions) VALUES ('Read,Write,Execute');
查询数据
SELECT * FROM SetExample;

在这里插入图片描述

注意事项
  • 集合值是区分大小写的。
  • 如果插入的值不在预定义的集合值中,MySQL会抛出错误。
  • 集合值在内部是以位掩码的形式存储的,每个值对应一个位。例如,‘Read’ 对应 1,‘Write’ 对应 2,‘Execute’ 对应 4。

高级用法

枚举(ENUM)的内部存储

枚举值在内部是以整数形式存储的。你可以使用 ORD 函数获取枚举值的内部整数表示:

SELECT id, order_status, ORD(order_status) AS enum_value FROM Orders;
集合(SET)的内部存储

集合值在内部是以位掩码的形式存储的。你可以使用 FIND_IN_SET 函数检查某个值是否存在于集合中:

SELECT id, roles, FIND_IN_SET('Admin', roles) AS has_admin FROM UserRoles;

总结

枚举(ENUM)和集合(SET)是MySQL中非常有用的特殊数据类型,可以用来限制列的值,确保数据的完整性和一致性。

选择合适的数据类型

选择合适的数据类型对于数据库性能和存储效率非常重要。以下是一些选择数据类型的建议:

  • 尽量使用最小的合适类型:例如,如果一个列只需要存储0到100之间的整数,使用 TINYINT 而不是 INT
  • 避免使用不必要的大字段:例如,如果一个列只需要存储少量文本,使用 VARCHAR(255) 而不是 TEXT
  • 考虑数据的精度和范围:例如,对于货币计算,使用 DECIMAL 而不是 FLOATDOUBLE 以确保精度。
  • 使用适当的时间类型:例如,如果只需要存储日期,使用 DATE 而不是 DATETIME

通过合理选择数据类型,你可以优化数据库的性能并减少存储空间的使用。


http://www.kler.cn/a/420663.html

相关文章:

  • uniapp实现加密Token并在每次请求前动态更新(vue、微信小程序、原生js也通用!)
  • 【设计模式系列】单例模式(二十)
  • 《Python基础》之Numpy库
  • 源码分析之Openlayers的核心EventTarget类的实现
  • 【Git操作】-- 将已存在的项目复制一份到另一个分组空间下
  • Python酷库之旅-第三方库Pandas(251)
  • 实战优化公司线上系统JVM:从基础到高级
  • 《Vue零基础入门教程》第十三课:条件渲染
  • PowerShell:查找并关闭打开的文件
  • Modern Effective C++ 条款二十三:理解std::move和std::forward
  • java 网络编程 详解
  • 数据结构判断两棵树是否相等
  • 九,[极客大挑战 2019]LoveSQL1
  • JavaWeb—— 构建互联网世界的 “魔法砖石” 与实战密码
  • 企业品牌曝光的新策略:短视频矩阵系统
  • 多模态抑郁估计论文研读|Multi-modal Depression Estimation Based on Sub-attentional Fusion
  • 【QNX+Android虚拟化方案】123 - 如何配置qnx侧GPIO_IRQ中断和PMIC_GPIO_IRQ中断
  • 【Android】View工作原理
  • Linux 内核系统架构
  • Kafka-Consumer源码分析
  • USB 声卡全解析:提升音频体验的得力助手
  • 网络安全之常用安全设备功能及作用_设备管理器安全设备是什么
  • Runway 技术浅析(六):文本到视频(Text-to-Video)
  • GPT时代的BI革命:智能报表系统如何颠覆传统决策
  • qt音频实战
  • Vue 实现无线滚动效果