基本数据类型
【一】整形
整形默认带符号,如果希望使用无符号,可以设置约束条件unsigned
一个字节代表8位 11111111
整数类型
字节
无符号数的取值范围
有符号数的取值范围
TINYINT
1
0~255
-128~127
SMALLINT
2
0~65535
-32768~32767
MEDIUMINT
3
0~16777215
-8388608~8388607
INT
4
0~4294967295
-2147483648~2147483647
BIGINT
8
0~18446744073709551615
-9223372036854774808~9223372036854774807
create table t1(
tiny_int tinyint,
tiny_int_unsign tinyint unsigned
);
create table t2(
small_int smallint ,
small_int_unsign smallint unsigned
);
create table t3(
medium_int mediumint,
medium_int_unsign mediumint unsigned
);
create table t4(
int_type int ,
int_type_unsign int unsigned
);
create table t5(
big_int bigint ,
big_int_unsign bigint unsigned
);
【1】TINYINT
# tinyint
insert into t1(tiny_int) values (256 );
insert into t1(tiny_int) values (128 );
# tinyint unsigned
insert into t1(tiny_int_unsign) values (128 );
insert into t1(tiny_int_unsign) values (-128 );
【2】SMALLINT
insert t2 values (-32768 ,0 );
insert t2 values (32767 ,65535 );
【3】MEDIUMINT
insert t3 values (-8388608 ,0 );
insert t3 values (8388607 ,16777215 );
【4】INT
insert t4 values (-2147483648 ,0 );
insert t4 values (2147483647 ,4294967295 );
【5】BIGINT
insert t5 values (-9223372036854774808 ,0 );
insert t5 values (9223372036854774807 ,18446744073709551615 );
【6】整形数据的指定宽度
当你指定整数类型的字段宽度时,它会影响显示的宽度,但不会改变数据的存储方式或范围。
# 通过约束条件zerofill来展示
create table t6(int_width tinyint(3 ) unsigned zerofill);
insert t6 values (255 );
insert t6 values (24 );
insert t6 values (2 );
当指定宽度后,哪怕超出整数类型【TINYINT】的最大取值范围后,并不会报错,但是会被变成最大值
注:目前测下来只有tinyint是不会报错,其他整数类型均会报错
create table t7(int_width int (5 ) zerofill);
insert t7 values (9999999 );
insert t7 values (255 );
insert t7 values (4294967300 );
【二】浮点型
数据类型
字节数
取值范围
FLOAT
4
-2^128~2 ^128,即-3.40E+38~+3.40E+38
DOUBLE
8
-2^1024~ 2^1024,即-1.79E+308~1.79E+308
DECIMAL
设置位数和精度。
65 ~ 30
create table t1(
float_type float ,
double_type double ,
decimal_type decimal
);
对于浮点数而言,字段类型后的宽度,有两个参数,限制的是(最大的位数,小数位数占总位数的多少位)
insert t1(float_type,double_type,decimal_type)
values (
1.111111111111111111111111 ,
1.111111111111111111111111 ,
1.111111111111111111111111
);
float (255 ,30 ):总位数255 ,小数点后30 位
double (60 ,30 ):总位数60 ,小数点后30 位
decimal (60 ,30 ):总位数60 ,小数点后30 位
三者的区别在于精度的区别
FLOAT:
单精度浮点数,占用 4 个字节。
精度为大约 7 位小数。
DOUBLE:
双精度浮点数,占用 8 个字节。
精度为大约 15 位小数。
DECIMAL
DECIMAL 类型不会有精度损失问题,因为它精确地存储指定位数的小数。
需要注意的是,DECIMAL 类型在存储和计算上通常会占用更多的存储空间和计算资源
create table t3(
float_type float (255 ,30 ),
double_type double (60 ,30 ),
decimal_type decimal (60 ,30 )
);
insert t2(float_type,double_type,decimal_type)
values (
1.111111111111111111111111 ,
1.111111111111111111111111 ,
1.111111111111111111111111
);
一定注意,浮点数的指定宽度的第一个参数是总位数
如decimal(5,2),意为总位数5位,其中2位是小数点
最大的值为999.99
【三】字符串
【1】char
定长类型 超出位数就报错 如果位数不够 使用空格填充
【2】varchar
不定长类型 超出位数报错 不够5位的 有几位存几位
【3】验证是否补充了空格
默认情况下,没有对char类型填充空格,如果想看填充了空格,需要设置严格模式
PAD_CHAR_TO_FULL_LENGTH
SQL语句:set session sql_mode='*,PAD_CHAR_TO_FULL_LENGTH'
create table t1(
str1 char (6 ),
str2 varchar (6 )
);
insert t1(str1,str2) values ('abc' ,'abc' );
select * from t1;
select char_length (str1) from t1;
select char_length (str2) from t1;
create table t1(
str1 char (6 ),
str2 varchar (6 )
);
insert t1 value ('你好' ,'你好' );
insert t1 value ('你好' );
为什么第二个插入语句会报错?
# 在 SQL 中,插入语句的格式通常是 INSERT INTO 表名 (列1 , 列2 , 列3 , ...) VALUES (值1 , 值2 , 值3 , ...);。当你省略列名时,系统期望你提供与表中列数量相匹配的值。
# 可以通过指定字段传值
insert t1(str1) vaule('你好' )
【四】日期
date:年月日
datetime:年月日 时分秒
'YYYY-MM-DD HH:MM:SS'
2000-1-2 11:11:11
timestamp:时间戳
与 DATETIME
类似,但在插入或更新时会自动转换为当前时区。
time:时分秒
year:年
create table t2(
date_type date ,
datetime_t datetime,
timestamp_t timestamp ,
time_t time ,
year_t year
);
# 传入数据必须按照格式填写否则将会报错
insert t2(date_type,datetime_t,timestamp_t,time_t,year_t) values
('2001-1-1' ,'2001-1-1 11:11:11' ,'2001-1-1 11:11:11' ,'11:11:11' ,2001 )
;
insert t2(date_type,datetime_t,timestamp_t,time_t,year_t) values
('2001/1/1' ,'2001年1月1日 11:11:11' ,'2001-1-1 11:11:11' ,'11:11:11' ,2001 )
;
【五】枚举
【1】enum:多选一
create table t1(
str enum('a' ,'b' ,'c' )
);
insert t1(str) value ('a' );
insert t1(str) value ('a,b' );
# 只能传一个值
【2】set:多选多
create table t2(
str set ('a' ,'b' ,'c' )
);
insert t2(str) value ('a' );
insert t2(str) value ('a,b' );
insert t2(str) value ('a,b,c' );
insert t2(str) value ('a,b,b' );
【六】严格模式
【1】查看严格模式
SELECT @@GLOBAL .sql_mode;
SELECT @@SESSION .sql_mode;
show variables like "%mode";
【2】常见的严格模式介绍
STRICT_TRANS_TABLES:
当插入或更新数据时,对事务安全表(支持事务的表)进行更严格的数据验证。
STRICT_ALL_TABLES:
NO_ZERO_DATE:
NO_ZERO_IN_DATE:
ERROR_FOR_DIVISION_BY_ZERO:
NO_AUTO_CREATE_USER:
ONLY_FULL_GROUP_BY:
要求 GROUP BY
子句中的列必须是 SELECT
列的子集,而不是任意表达式。
NO_ENGINE_SUBSTITUTION:
如果指定的存储引擎不可用,不要尝试使用其他存储引擎,而应产生错误。
NO_UNSIGNED_SUBTRACTION:
当从无符号整数中减去较大的无符号整数时,不进行溢出处理。
【3】修改严格模式
请注意,启用严格模式可以帮助捕获一些潜在的数据问题,但也可能导致某些旧的应用程序或脚本出现问题。在启用严格模式之前,请确保了解其可能的影响,并测试应用程序的兼容性。
一般建议在修改前,将原有的严格模式进行备份,防止无法恢复至未改动之前的状态
【3.1】临时修改
set session sql_mode = '' ;
【3.2】永久修改
set global sql_mode = '' ;
通过my.ini
或my.conf
配置文件进行设置
如果不进行严格模式的配置,MySQL将默认设置部分的严格模式
本人就没有在配置文件中配置严格模式,所有严格模式有很多
[mysqld ]
...
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了