一常用数据类型分类
在面向对象软件开发的过程中,通常会先进行需求分析从而得到类和属性,类是面向对象中的概念,对应到数据库中的概念就是实体,类中的属性对应实体中的属性。实体通常以表的形式存在,每个实体对应一张表,表中的每条记录(数据行)就是实体的一个实例,每条记录又包含若干字段(或称为列),每个字段代表实体的一个属性。如果要定义实体的属性,就要为属性命名并指定合适的数据类型。与其他编程语言类似,SQL中规定了用于描述属性的数据类型。常用的数据类型有以下几类:
• 数据值类型
• 字符串类型
• 二进制类型
• 日期类型
二数据值类型
2.1 类型列表


2.2数据类型取值范围

三字符串类型
3.1类型列表

3.2关于排序
• 字符串类型的列以字符为单位,并且可以单独指定字符集和排序规则,比如字符集是utf8mb4 ,
排序规则是utf8_0900_ai_ci
• 二进制的列以字节为单位,可以指定_bin结尾的排序规则,比如排序规则是utf8mb4_bin ,这
时以比较和排序基于数字字符代码值
3.3 CHAR与VARCHAR的区别
• CHAR 固定长度的字符串, M 表示以字符为单位的列长度,取值范围0 ~ 255 ,省略则长度为
1 ,在存储时总是用空格向右填充到指定的长度,获取列的值时会从尾部删除空格。允许定义
CHAR(0),此时列的值只能为NULL或空字符串,主要的目的是为了旧系兼容,比如类中必须有这个属性,但不使用这个属性的值,也就是说值并没有意义,但列又不能没有。
• VARCHAR 可变长度字符串。M 表示以字符为单位的最大列长度,取值范围 0 ~ 65,535 (在所
有列中共享),有效长度取决于实际字符数和使用的字符集,并且用额外的一或两个字节记录实际使用的字节数,当实际字节数不超过 255 个字节用一个字节记录长度,超过 255 个字节时,使用两个字节记录长度,获取列的值时不会从尾部删除空格,插入数据时会删除超出长度的空格。
3.3.1示例
sql
mysql> CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO vc VALUES ('ab ', 'ab ');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
+---------------------+---------------------+
| CONCAT('(', v, ')') | CONCAT('(', c, ')') |
+---------------------+---------------------+
| (ab ) | (ab) |
+---------------------+---------------------+
1 row in set (0.06 sec)
mysql> insert into vc values ('ab ', 'ab ');
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+-------+------+----------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------+
| Note | 1265 | Data truncated for column 'v' at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)

通过下表来说明CHAR和VARCHAR存储字符串的区别,字符集以latin1为例:

3.4如何选择CHAR与VARCHAR
• 如果数据确定长度都一样,就使用定长 CHAR 类型,比如:身份证,md5,学号,邮编。
• 如果数据长度有变化,就使用变长 VARCHAR , 比如:名字,地址,但要规划好长度,保证最长的 字符串能存的进去。
• 定长 CHAR 类型比较浪费磁盘空间,但是效率高。
• 变长 VARCHAR 类型比较节省磁盘空间,但是效率低。
• 定长 CHAR 类型会直接开辟好对应的存储空间。
• 变长 VARCHAR 类型在不超过定义长度范围的情况下用多少开辟多少存储空间。
3.5VARCHAR与TEXT的区别
• 容量大小: VARCHAR 最大支持65535 个字节; TEXT 最大支持65535 个字节,在指定TEXT
长度时,当超过65535 时自动转换为MEDIUMTEXT 类型,当超过16,777,215 时自动转换为LONGTEXT 类型
• 存储位置: VARCHAR 类型的列实际内容小于768个字节时存在当前行,大于768时存在溢出页,当前行保存溢出页的地址; TEXT 类型的列整体保存在溢出页,当前行只保存溢出页地址
• 查询性能:对于频繁查询的VARCHAR 列可以创建索引,提升查询性能; TEXT 类型的列无法直
接创建普通索引,但可以使用 FULLTEXT 索引,由于索引的支持和存储位置的不同, VARCHAR
列的性能高于TEXT 类型的列
• 适用场景:如果存储的数据长度较小且需要创建索引进行检索,可以选择VARCHAR 类型,比如姓名,用户,邮箱等;如果存储的数据长度较大且不需要频繁以该列为条件进行检索可以选择TEXT类型,比如文章内容等。
四日期类型
4.1类型列表


4.2其他
• fsp 为可选设置,用来指定小数秒精度,范围从0到6,值为0表示没有小数部分,如果省略,默认
精度为0
• CURRENT_DATE 和 CURRENT_DATE() 是CURDATE() 的同义词用于获取当前日期
• CURRENT_TIME 和 CURRENT_TIME([fsp]) 是 CURTIME() 的同义词用于获取当前时间
• CURRENT_TIMESTAMP 和 CURRENT_TIMESTAMP([fsp]) 是 NOW() 的同义词用于获取当
前日期和时间
