第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]
MySQL 支持多种数据类型,这些数据类型可以分为几大类:数值类型、字符串类型、日期和时间类型、二进制类型以及枚举和集合。每种类型都有其特定的用途和存储需求。以下是 MySQL 中常用的数据类型的详细介绍:
1. 数值类型
在MySQL中,数值类型用于存储整数和浮点数。以下是一些常见的数值类型及其示例,包括如何创建表、插入数据以及查询数据。
1. 整数类型
TINYINT
- 范围:-128 到 127(有符号),0 到 255(无符号)
- 大小:1 字节
sql
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 字节
sql
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 字节
sql
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 字节
sql
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 字节
sql
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 位小数
sql
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 位小数
sql
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
是小数点后的位数
sql
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会用空格填充到指定长度。
sql
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个字符。
- 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
sql
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会用零字节填充到指定长度。
sql
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个字节。
- 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
sql
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个字符。
sql
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个字符。
sql
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个字符。
sql
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个字符。
sql
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'
。
sql
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'
。
sql
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'
。
sql
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
。 - 特性:自动初始化和更新为当前日期和时间。
sql
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
- 描述 :用于存储年份值,格式为
YYYY
或YY
。 - 范围 :从
'1901'
到'2155'
。
sql
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);
查询示例
假设我们已经创建了上述表并插入了一些数据,现在我们可以查询这些数据:
sql
-- 查询所有 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提供了许多内置函数来处理日期和时间数据。以下是一些常用的函数示例:
获取当前日期和时间
sql
SELECT CURRENT_DATE(); -- 获取当前日期
SELECT CURRENT_TIME(); -- 获取当前时间
SELECT NOW(); -- 获取当前日期和时间
SELECT CURRENT_TIMESTAMP(); -- 获取当前日期和时间
日期和时间的格式化
sql
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 格式化日期和时间
日期和时间的计算
sql
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 当前日期加上一天
SELECT DATE_SUB(NOW(), INTERVAL 1 HOUR); -- 当前时间减去一小时
提取日期和时间部分
sql
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会用零字节填充到指定长度。
sql
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个字节。
- 存储:实际存储时只占用实际长度加一个或两个字节(取决于行的长度)。
sql
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个字节。
sql
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个字节。
sql
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个字节。
sql
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个字节。
sql
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;
查询示例
假设我们已经创建了上述表并插入了一些数据,现在我们可以查询这些数据:
sql
-- 查询所有 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;
二进制数据的插入和查询
-
插入二进制数据:
- 使用
UNHEX
函数将十六进制字符串转换为二进制数据。 - 使用
LOAD_FILE
函数从文件系统中加载二进制文件内容。
- 使用
-
查询二进制数据:
- 使用
HEX
函数将二进制数据转换为十六进制字符串以便查看。
- 使用
通过这些示例,你可以看到如何在MySQL中使用不同的二进制类型来存储和查询数据。选择合适的数据类型对于确保数据的准确性和性能非常重要。
5.枚举和集合
在MySQL中,枚举(ENUM)和集合(SET)是两种特殊的数据类型,用于存储一组预定义的值。它们在某些场景下非常有用,可以提高数据的完整性和查询效率。
1. 枚举(ENUM)
枚举类型允许你定义一个列,该列只能从一组预定义的值中选择。这些值在创建表时定义,并且在插入数据时必须是这些值之一。
创建表
sql
CREATE TABLE EnumExample (
id INT AUTO_INCREMENT PRIMARY KEY,
status ENUM('New', 'Processing', 'Completed', 'Cancelled')
);
插入数据
sql
INSERT INTO EnumExample (status) VALUES ('New');
INSERT INTO EnumExample (status) VALUES ('Processing');
INSERT INTO EnumExample (status) VALUES ('Completed');
INSERT INTO EnumExample (status) VALUES ('Cancelled');
查询数据
sql
SELECT * FROM EnumExample;
注意事项
- 枚举值是区分大小写的。
- 如果插入的值不在预定义的枚举值中,MySQL会抛出错误。
- 枚举值在内部是以整数形式存储的,从1开始编号。例如,'New' 对应 1,'Processing' 对应 2,依此类推。
2. 集合(SET)
集合类型允许你定义一个列,该列可以包含一组预定义值的任意组合。这些值在创建表时定义,并且在插入数据时可以是这些值的任意子集。
创建表
sql
CREATE TABLE SetExample (
id INT AUTO_INCREMENT PRIMARY KEY,
permissions SET('Read', 'Write', 'Execute')
);
插入数据
sql
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');
查询数据
sql
SELECT * FROM SetExample;
注意事项
- 集合值是区分大小写的。
- 如果插入的值不在预定义的集合值中,MySQL会抛出错误。
- 集合值在内部是以位掩码的形式存储的,每个值对应一个位。例如,'Read' 对应 1,'Write' 对应 2,'Execute' 对应 4。
高级用法
枚举(ENUM)的内部存储
枚举值在内部是以整数形式存储的。你可以使用 ORD
函数获取枚举值的内部整数表示:
sql
SELECT id, order_status, ORD(order_status) AS enum_value FROM Orders;
集合(SET)的内部存储
集合值在内部是以位掩码的形式存储的。你可以使用 FIND_IN_SET
函数检查某个值是否存在于集合中:
sql
SELECT id, roles, FIND_IN_SET('Admin', roles) AS has_admin FROM UserRoles;
总结
枚举(ENUM)和集合(SET)是MySQL中非常有用的特殊数据类型,可以用来限制列的值,确保数据的完整性和一致性。
选择合适的数据类型
选择合适的数据类型对于数据库性能和存储效率非常重要。以下是一些选择数据类型的建议:
- 尽量使用最小的合适类型 :例如,如果一个列只需要存储0到100之间的整数,使用
TINYINT
而不是INT
。 - 避免使用不必要的大字段 :例如,如果一个列只需要存储少量文本,使用
VARCHAR(255)
而不是TEXT
。 - 考虑数据的精度和范围 :例如,对于货币计算,使用
DECIMAL
而不是FLOAT
或DOUBLE
以确保精度。 - 使用适当的时间类型 :例如,如果只需要存储日期,使用
DATE
而不是DATETIME
。
通过合理选择数据类型,你可以优化数据库的性能并减少存储空间的使用。