数据类型
整数
类型 | 意义 |
---|---|
tinyint(m) | 1个字节 范围(-128~127) |
smallint(m) | 2个字节 范围(-32768~32767) |
mediumint(m) | 3个字节 范围(-8388608~8388607) |
int(m) | 4个字节 范围(-2147483648~2147483647) |
bigint(m) | 8个字节 范围(±9.22*10的18次方) |
- 如果加 unsigned,则最大值翻倍。
- int(m) 的m是表示 SELECT 查询结果集中的显示宽度,不影响实际的取值范围。且只有当指定了 zerofill 属性时才起作用。
浮点数
类型 | 意义 |
---|---|
float(m,d) | 单精度浮点型 8位精度(4字节) m总个数,d小数位 |
double(m,d) | 双精度浮点型 16位精度(8字节) m总个数,d小数位 |
设一个字段定义为 float(6,3)
- 如果插入一个数 123.45678,实际数据库里存的是 123.457,但总个数还以实际为准,即 6 位。
- 整数部分最大是 3 位,如果插入数 12.123456,存储的是 12.1234
- 如果插入12.12,存储的是12.1200
浮点数和定点数区别
转自:https://www.cnblogs.com/-xlp/p/8617760.html
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
- 从上面的例子中我们看到c1列的值由131072.32变成了131072.31,这就是浮点数的不精确性造成的。
- 在mysql中float、double(或real)是浮点数,decimal(或numberic)是定点数。
- 浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
- 浮点数存在误差问题;
- 对货币等对精度敏感的数据,应该用定点数表示或存储;
- 编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
- 要注意浮点数中一些特殊值的处理。
定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
类型 | 意义 |
---|---|
decimal(m,d) | m<65 是总个数,d<30且 d<m 是小数位 |
字符串
类型 | 意义 |
---|---|
char(n) | 固定长度,最多255个字符 |
varchar(n) | 可变长度,最多65535个字符 |
tinytext | 可变长度,最多255个字符 |
text | 可变长度,最多65535个字符 |
mediumtext | 可变长度,最多2的24次方-1个字符 |
longtext | 可变长度,最多2的32次方-1个字符 |
varchar 与 char 区别:
- char 长度固定,varchar 长度可变
char 如果插入的长度小于定义长度时,用空格填充
varchar 小于定义长度时,按实际长度存储
因长度固定,char 的存取速度还是要比 varchar 要快得多,方便程序的存储与查找,但会占据多余的空间。 - 存储的容量不同
char 最多 255,和编码无关。
varchar 最多能存放 65532 个字符。
varchar和text
- text 不能有默认值
- varchar 可直接创建索引(因为 varchar(n) 指定了最大长度),text创建索引要指定前多少个字符。varchar 查询速度快于 text
blob 与 text
- blob 以二进制方式存储,不分大小写。text 以文本存储
- blob 存储的数据只能整体读出
- text 可以指定字符集,blob 不用指定字符集
日期
类型 | 意义 |
---|---|
date | ‘2008-12-2’ |
time | ‘12:25:36’ |
datetime | ‘2008-12-2 22:06:44’ |
timestamp | 自动存储记录修改时间 |
若定义一个字段为 timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
其他
- BINARY
- VARBINARY
- ENUM
- SET
- Geometry
- Point
- MultiPoint
- LineString
- MultiLineString
- Polygon
- GeometryCollection
- JSON
mysql 类型的属性
mysql建表时,每个字段的属性有三个选项: binary, unsigned, unsigned zerofill,作用如下:
binary
- 针对 CHAR / VARCHAR / TEXT
- binary属性表示以二进制方式存储
在mysql中,存储方式有“文本”和“二进制”两种,主要区别在于前者不区分大小写而后者区分 - 官网文档:https://dev.mysql.com/doc/refman/8.0/en/blob.html
If you use the BINARY attribute with a TEXT data type, the column is assigned the binary (_bin) collation of the column character set.
create table aaaaa(id varchar(2) binary);
create table bbbbb(id text binary);
unsigned
针对数据类型
如:TINYINT[(M)] [UNSIGNED] [ZEROFILL]
有符号的范围是 -128 到 127,无符号的范围是 0 到 255。
zerofill
zerofill 类似一个显示属性
CREATE TABLE `dddd` (`id` int(11) DEFAULT NULL)
可以看到 int(11) ,这代表什么意思呢?整型不就是4个字节,这个10代表什么意思,如果没有 zerofill 这属性,括号类的数字没有意义。
查询结果:
+------+
| id |
+------+
| 1 |
+------+
执行:
alter table dddd change column id id int(11) unsigned zerofill;
再查询:
+-------------+
| id |
+-------------+
| 00000000001 |
+-------------+
大小写敏感
对于一个 varchar 字段,mysql 默认是大小写不敏感的。如果我们的字段本身是敏感的,如下解决。
1. 设置系统参数(全局)
show variables like 'lower%'
my.cnf 中的 [mysqld] 后面添加 lower_case_table_names=1,重启MYSQL服务
2. 只针对单个表
上面是全局设置,如果只针对单个表
alter table user_priv change user_name user_name char(32) binary NOT NULL;
参考:
int(11) 与 int(10) 的区别
https://blog.csdn.net/qq_43843725/article/details/93885092
char 和 varchar 的区别
https://blog.csdn.net/Gane_Cheng/article/details/52316408
mysql 各种类型
https://www.cnblogs.com/-xlp/p/8617760.html