响应式网站服务,网站开发虚拟主机管理系统,宣传册设计与制作用什么软件,78创业商机网阅读导航 引言一、数据类型分类二、数值类型取值范围三、tinyint 类型1. #x1f4bb;数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float数值越界测试⭕有符号案例⭕无符号案例 四、bit 类型1. 基本语法2. 使用示例✅创建表并插入数据✅使用 BIT 存储多个设置✅查询和格式化 BIT 数据✅更新 BIT 数据 五、小数类型1. float基本语法使用示例⭕有符号案例⭕无符号案例 2. decimal基本语法使用示例 引言
在上一篇文章里我们学习了MySQL中如何操作表比如怎么创建、修改和删除它们。但要想数据库真正发挥作用还得了解怎么存储数据这就涉及到了数据类型。数据类型决定了列里可以存什么类型的信息比如数字、文字还是日期等。
本篇文章我们就来聊聊MySQL中的数据类型看看它们是怎么帮助我们把数据存得既准确又高效的。准备好我们这就开始吧
一、数据类型分类
分类数据类型说明数值类型BIT(I)位类型。I指定位数默认值1范围1-64数值类型TINYINT [UNSIGNED]带符号的范围-128到127无符号范围0到255.默认有符号数值类型BOOL使用0和1表示真和假数值类型SMALLINT [UNSIGNED]带符号是-215到215-1无符号是216-1数值类型INT [UNSIGNED]带符号是-231到231-1无符号是232-1数值类型BIGINT [UNSIGNED]带符号是-263到263-1无符号是264-1数值类型FLOAT[(M,D)][UNSIGNED]指定显示长度d指定小数位数占用4字节数值类型DOUBLE[(M, D)][UNSIGNED]表示比float精度更大的小数占用空间8字节数值类型DECIMAL (M,D)[UNSIGNED]定点数指定长度D表示小数点的位数文本、二进制类型CHAR(size)固定长度字符串最大255文本、二进制类型VARCHAR(SIZE)可变长度字符串最大长度65535文本、二进制类型BLOB二进制数据文本、二进制类型TEXT大文本不支持全文索引不支持默认值时间日期日期类型DATEyyy-mm-dd/DATETIMEyyyy-mm-dd hh:mm:ss/TIMESTAMP时间戳ENUM类型ENUMENUM是一个字符串对象其值来自表创建时在列规定中显示枚举的一列值SET类型SETSET是一个字符串对象可以有零或多个值其值来自表创建时规定的允许的一列值。指定包括多个set成员的set列值时各成员之间用逗号间隔开。这样set成员值本身不能包含逗号。
二、数值类型取值范围
类型字节最小值带符号的最大值带符号的最大值无符号的TINYINT1-128127255SMALLINT2-327683276765535MEDIUMINT3-8388608838860716777215INT4-214748364821474836474294967295BIGINT8-9223372036854775808922337203685477580718446744073709551615
三、tinyint 类型
1. 数值越界测试
⭕有符号案例
首先我们创建了一个名为t1的表该表包含一个名为num的列其数据类型为TINYINT。
mysql create table t1(num tinyint);
Query OK, 0 rows affected (0.02 sec)接下来向t1表中插入了一个值1。
mysql insert into t1 values(1);
Query OK, 1 row affected (0.00 sec)然后尝试向t1表中插入一个值128。但是128超出了TINYINT有符号的有效值域因此MySQL抛出了一个错误。
mysql insert into t1 values(128); -- 越界插入报错
ERROR 1264 (22003): Out of range value for column num at row 1通过SELECT查询来查看t1表中的所有数据。由于只有第一个INSERT操作成功所以查询结果将只包含第一个插入的值1。
mysql select * from t1;
-----
| num |
-----
| 1 |
-----注意在MySQL中整型可以指定是有符号的和无符号的默认是有符号的可以通过UNSIGNED来说明某个字段是无符号的。
⭕无符号案例
mysql create table t2(num tinyint unsigned);mysql insert into t2 values(-1); -- 无符号范围是 0 - 255
ERROR 1264 (22003): Out of range value for column num at row 1mysql insert into t2 values(255);
Query OK, 1 row affected (0.02 sec)mysql select * from t2;
------
| num |
------
| 255 |
------
1 row in set (0.00 sec)四、bit 类型
1. 基本语法
bit[(M)] : 位字段类型。M表示每个值的位数范围从1到64。如果M被忽略默认为1。2. 使用示例
BIT[(M)] 类型在 MySQL 中用于存储二进制数据其中 M 表示位字段的长度范围从 1 到 64。如果省略 M则默认为 1。
✅创建表并插入数据
假设我们有一个表用于存储用户的ID和他们的某些二进制设置例如是否启用了某个功能。
create table user_settings (user_id INT AUTO_INCREMENT PRIMARY KEY,feature_enabled BIT(1) NOT NULL DEFAULT b0
);-- 插入数据
INSERT INTO user_settings (feature_enabled) VALUES (b1); -- 启用功能
INSERT INTO user_settings (feature_enabled) VALUES (b0); -- 禁用功能在这个例子中feature_enabled 列是一个 BIT(1) 类型的字段用于存储单个位的值0 或 1表示功能是否启用。
✅使用 BIT 存储多个设置
如果你需要存储多个二进制设置可以使用更大的 BIT 字段。
create table user_profiles (user_id INT AUTO_INCREMENT PRIMARY KEY,settings BIT(8) NOT NULL DEFAULT b00000000
);-- 假设 settings 的每一位代表一个不同的设置
-- 例如第1位是邮件通知第2位是短信通知依此类推
INSERT INTO user_profiles (settings) VALUES (b10101010);✅查询和格式化 BIT 数据
当你从 BIT 类型的列中检索数据时你可能想要以更易于理解的方式查看这些数据。
-- 查询并格式化 BIT 数据
SELECT user_id, BIN(settings) AS binary_settings FROM user_profiles;-- 如果你只对某些位感兴趣可以使用位运算
-- 例如检查邮件通知是否启用假设它是第1位
SELECT user_id, (settings b00000001) AS mail_notifications FROM user_profiles;
✅更新 BIT 数据
你可以使用位运算符来更新 BIT 字段中的值。
-- 假设我们要启用用户ID为1的用户的邮件通知第1位
UPDATE user_profiles
SET settings settings | b00000001
WHERE user_id 1;-- 禁用短信通知假设它是第2位
UPDATE user_profiles
SET settings settings ~b00000010
WHERE user_id 1;五、小数类型
1. float
基本语法
float[(m, d)] [unsigned] : M指定显示长度d指定小数位数占用空间4个字节使用示例
⭕有符号案例
小数float(4,2)表示的范围是-99.99 ~ 99.99MySQL在保存值时会进行四舍五入
mysql create table t6(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)mysql insert into t6 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)mysql insert into t6 values(101, -99.991); #多的这一点被拿掉了
Query OK, 1 row affected (0.00 sec)mysql select * from t6;
--------------
| id | salary |
--------------
| 100 | -99.99 |
| 101 | -99.99 |
--------------
2 rows in set (0.00 sec)⭕无符号案例
如果定义的是float(4,2) unsigned 这时因为把它指定为无符号的数范围是 0 ~ 99.99
mysql create table t7(id int, salary float(4,2) unsigned);
Query OK, 0 rows affected (0.01 sec)mysql insert into t7 values(100, -0.1);
Query OK, 1 row affected, 1 warning (0.00 sec)mysql show warnings;
----------------------------------------------------------------
| Level | Code | Message |
----------------------------------------------------------------
| Warning | 1264 | Out of range value for column salary at row 1 |
----------------------------------------------------------------
1 row in set (0.00 sec)mysql insert into t7 values(100, -0);
Query OK, 1 row affected (0.00 sec)mysql insert into t7 values(100, 99.99);
Query OK, 1 row affected (0.00 sec)2. decimal
基本语法
decimal(m, d) [unsigned] : 定点数m指定长度d表示小数点的位数decimal(5,2) 表示的范围是 -999.99 ~ 999.99decimal(5,2) unsigned 表示的范围 0 ~ 999.99decimal和float很像但是有区别float和decimal表示的精度不一样
使用示例
mysql create table t8 ( id int, salary float(10,8), salary2
decimal(10,8));mysql insert into t8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)mysql select * from t8;
--------------------------------
| id | salary | salary2 |
--------------------------------
| 100 | 23.12345695 | 23.12345612 | # 发现decimal的精度更准确因此如果我们希望某个数据表示高精度选择decimal
--------------------------------经过上面的例子可以发现decimal的精度更准确因此如果我们希望某个数据表示高精度就选择decimal。