MySQL 数据类型
数值类型
floot(M,N) double(M,N): 浮点型
M 表示显示位数,即宽度
N 表示小数部分的精确位数
但是,这两种浮点型都是非精确类型。对于数值类型的高精度需求,显然 floot,double 不能满足。
高精度通常用 decimal 类型
decimal(M, N): 高精度类型
M,N 表示的含义同浮点型:精度 和 标度
deciml 类型规定 位数 M 的上限是 65
字符串
Unicode 和 utf8 的区别:Unicode 是字符编码,不是字符集; utf8 是字符集。Unicode 为每种国家语言中的每个字符设定了统一且
唯一的二进制编码,以满足跨语言和跨平台进行文本转换和处理的要求。
- mysql> show charset; 查看当前版本支持的所有字符集。
mysql> status; 查看当前实例配置的 字符集
mysql> set NAMES 'gbk'; 更改当前会话链接的字符集 - 可以在建表时为每张表指定不同的字符集,也可以为同一张表的每列设置不同的字符集。
mysql> create table t2(a varchar(2) charset gbk, b varchar(4) charset utf8);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table t2 \G;
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`a` varchar(2) CHARACTER SET gbk DEFAULT NULL,
`b` varchar(4) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
1 row in set (0.00 sec)
字符集的排序规则:
每种字符集都有一个默认的排序规则。有一些常用的规则:_ci 结尾表示大小写不敏感;_cs 结尾表示大小写敏感;_bin 表示二进制的比较
mysql> show collation; 查看每种字符集的排序规则
排序规则有什么用?
- 影响大小写字符的比较
utf8 默认的排序规则时 _ci ,也就是大小写不敏感,那么见表的时候 select * from t where c1="a",会同时返回 c1="a" 和 c1="A"
和预期的结果不一致。敏感还是不敏感要视业务需求而定。 - 字符集的排序规则影响索引
在大小写不敏感的列上创建唯一索引时,可能会失败,因为可能会出现重复的列值,建索引时 B+ 树需要先对列值比较。
char 和 varchar
1. char 存储定长字符串,数据库会自动对存储列的右边进行空字符填充,知道字符串达到固定长度。而在读取该列时,会自动将填充的字符删除。
2. varchar 存储时需要在前缀长度列表加上实际存储的字符,该字符占用1-2个字节的空间。当存储的字符串长度小于 255 字节时,其需要1个字节的空间,当大于 255 字节时
需要两个字节的空间。
3. char 和varchar 存储方式不太相同,但是对于两个字符串的比较,都只比较其值,忽略char 存在的右填充。
blob 和 text
1. blob 和 text 可以视为足够大的 varchar 类型。但和 varchar 又略微不同
2. blob 和 text 类型的列上创建索引时,必须制定索引前缀的长度。而 varchar 是可选的。
3. blog 和 text 不能有默认值
4. 在排序时只使用列的前 max_sort_length 个字节(默认时 1024,可以动态设置该参数)
5. 为了有效的存储 blob 和 text 的大对象类型,一般将列的值存放在行溢出页,而数据页存储的行数据只包含 blob 和 text 类型数据列的前一部分数据
6. innodb 中对blob 类型,数据页只存储前20个字节,而该列完整的数据存储在溢出页中。对于 大 varchar 类型的字符串 如varchar(65535)自动转换为 text 或 blob 类型。
SET 和 ENUM
set 和 enum 都是集合类型,知识存储元素的容量不同而已。enum 最多可以枚举 65536 个元素,而 set 最多 64 个。
枚举类型,一般要配合 check 关键字约束。

浙公网安备 33010602011771号