MySQL 常见的数据类型有字符串类型、数字类型、时间类型、二进制类型。具体的分类如下图:
1. 字符串类型
字符串类型用于存储字符和字符串数据,主要包含三种具体的类型:定长字符串、变长字符串以及字符串大对象。各种数据库对于字符串类型的支持如下:
| 数据类型 | Oracle | MySQL | SQL Server | PostgreSQL |
|---|---|---|---|---|
| 定长字符串 | CHAR(n) | CHAR(n) | CHAR(n) | CHAR(n) |
| 变长字符串 | VARCHAR2(n) | VARCHAR(n) | VARCHAR(n) | VARCHAR(n) |
| 字符串大对象 | CLOB | TEXT | VARCHAR( MAX ) | TEXT |
在 SQL 中,输入字符串类型的常量和数据时,需要使用单引号引用。
1.1 定长字符串
CHAR(n) 表示长度固定的字符串,其中 n 表示字符串的长度。常见的定义方式包括:
- CHAR,长度为 1 的字符串,只能存储 1 个字符;
- CHAR(5),长度为 5 的字符串。
对于定长字符串,如果输入的字符串长度不够,将会使用空格进行填充。通常来说,只有存储固定长度的数据时,才会考虑使用定长字符串类型。例如 18 位身份证,6 位邮政编码等。
1.2 变长字符串
VARCHAR(n) 表示长度不固定的字符串,其中 n 表示允许存储的最大长度。对于变长字符串,如果输入的字符串长度不够定义的最大长度,则存储实际的内容。
CHAR VARYING和CHARACTER VARYING是VARCHAR的同义词,可以通用。 Oracle 中使用 VARCHAR2 表示变长字符串类型。
变长字符串类型一般用于存储长度不固定的内容。
1.3 字符串大对象
CLOB 表示字符串大对象,通常用于存储普通字符串类型无法支持的更长的字符串数据。例如整篇文章、备注、评论等。
-
Oracle使用CLOB类型存储大型字符串; -
MySQL提供了TINYTEXT、TEXT、MEDIUMTEXT以及LONGTEXT分别用于存储不同长度的文本数据; -
SQL Server使用VARCHAR( MAX )存储大文本数据; -
PostgreSQL提供了TEXT类型存储任意长度的字符串;
CHARACTER LARGE OBJECT和CHAR LARGE OBJECT是CLOB的同义词,可以通用。
2. 数字类型
数字类型主要分为两类:精确数字和近似数字。各种数据库对于数字类型的支持如下:
| 数据类型 | Oracle | MySQL | SQL Server | PostgreSQL |
|---|---|---|---|---|
| 精确数字 | SMALLINT INTEGER NUMERIC(p, s) |
SMALLINT INTEGER BIGINT NUMERIC(p, s) |
SMALLINT INTEGER BIGINT NUMERIC(p, s) |
SMALLINT INTEGER BIGINT NUMERIC(p, s) |
| 近似数字 | BINARY_FLOAT BINARY_DOUBLE |
FLOAT DOUBLE PRECISION |
REAL DOUBLE PRECISION |
REAL DOUBLE PRECISION |
2.1 精确数字
精确数字类型用于存储整数或者包含固定小数位的数字。其中, SMALLINT 、 INTEGER 和 BIGINT 都可以表示整数。
对于 MySQL 、 SQL Server 以及 PostgreSQL ,
-
SMALLINT支持 -32768 ~ 32767; -
INTEGER支持 -2147483648 ~ 2147483647; -
BIGINT支持 -263 ~ 263-1。
Oracle 中的 SMALLINT 和 INTEGER 都是 NUMBER(38,0) 的同义词; Oracle 不支持 BIGINT 关键字。
INT 是 INTEGER 的同义词,可以通用。 MySQL 中还提供了 TINYINT ,支持 -128 ~ 127; MEDIUMINT 支持 -8388608 ~ 8388607。另外,MySQL 中的所有整型分为有符号类型(例如 INTEGER 、 INTEGER SIGNED )和无符号类型(例如 INTEGER UNSIGNED ),无符号整型支持的正整数范围扩大了一倍。
NUMERIC(p, s) 和 DECIMAL(p, s) 可以看作相同的类型,用于存储包含小数的精确数字。
其中,精度 p 表示总的有效位数,刻度 s 表示小数点后允许的位数。例如,123.04 的精度为 5,刻度为 2。 p 和 s 是可选的, s 为 0 表示整数。 SQL 标准要求 p ≥ s ≥ 0 并且 p > 0 。
DEC 是 DECIMAL 的同义词,可以通用。 Oracle 中的 NUMERIC 和 DECIMAL 都是 NUMBER 的同义词。
整数类型通常用于存储数字 id、产品数量、课程得分等数字; NUMERIC 用于存储产品价格、销售金额等包含小数并且准确度要求高的数据。
2.2 近似数字
近似数字也称为浮点型数字,一般使用较少,主要用于科学计算领域。
REAL 表示单精度浮点数,通常精确到小数点后 6 位;DOUBLE PRECISION 表示双精度浮点数,通常精确到小数点后 15 位。浮点数运算更快,但是可能丢失精度;浮点数的比较运算可能会导致非预期的结果。
-
Oracle使用BINARY_FLOAT和BINARY_DOUBLE表示浮点数。 -
MySQL使用FLOAT表示单精度浮点数,同时区分有符号和无符号的浮点数。
3. 日期时间类型
-
DATE存储年、月、日; -
TIME存储时、分、秒,以及秒的小数部分; -
TIMESTAMP同时包含年、月、日、时、分、秒,以及秒的小数部分。
各数据库的差异:
-
Oracle中的DATE类型包含了额外的时、分、秒,不支持TIME类型。 -
SQL Server使用DATETIME2和DATETIMEOFFSET表示时间戳。 -
MySQL还支持DATETIME表示时间戳。
4. 二进制类型
二进制类型用于存储二进制数据,例如文档、图片,视频等。二进制类型具体包含以下三种:
-
BINARY(n),固定长度的二进制数据,n表示二进制字符数量; -
VARBINARY(n),可变长度的二进制数据,n表示支持的最大二进制字符数量; -
BLOB,二进制大对象。
各数据库差异:
-
Oracle支持BLOB二进制类型; -
MySQL支持BINARY、VARBINARY以及TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB二进制类型; -
SQL Server支持BINARY、VARBINARY以及VARBINARY ( MAX )二进制类型; -
PostgreSQL支持BYTEA二进制类型。
5. 如何选择数据类型
一般来说,先确定基本的类型:
- 文本数据,只能使用字符串类型;
- 数值数据,尤其是需要进行数学运算的数据,选择数字类型;
- 日期和时间信息,最好使用原生的日期时间类型;
- 文档、图片、音频和视频等,使用二进制类型;或者可以考虑存储在文件服务器上,然后在数据库中存储文件的路径。
接下来需要进一步确定具体的数据类型。在满足数据存储和扩展的前提下,尽量使用更小的数据类型,可以节省一些存储,通常性能也会更好。
对于字符数据,一般使用 VARCHAR 类型;如果数据长度能够确保一致,可以使用 CHAR ;指定最大长度时,满足存储需求的前提下尽量使用更小的值。
不要使用字符串存储日期时间数据,它们无法支持数据的运算。例如获得两个日期之间的间隔,需要依赖应用程序进行转换和处理。
参考:
https://gitbook.cn/gitchat/column/undefined/topic/5db92c23a9c3a53bc3800f0d