中级网站开发工程师 试题,河北建设厅网站初始密码,番禺网站,wordpress上传图片自动压缩一、数据类型分类 二、数值类型 1.bit类型
测试环境ubuntu
基本语法#xff1a;
bit[(M)]#xff1a;位字段类型#xff0c;M表示每个值的位数#xff0c;范围从1#xff5e;64#xff1b;如果M被忽略#xff0c;默认为1举例#xff1a;
create table testBit(id i…一、数据类型分类 二、数值类型 1.bit类型
测试环境ubuntu
基本语法
bit[(M)]位字段类型M表示每个值的位数范围从164如果M被忽略默认为1举例
create table testBit(id int, a bit(8));
insert into testBit values(10,10);
select * from testBit;#当我们进行查询的时候发现以16进制出现当我们以十六进制进行输出时发现是字符A16进制数还是十进制中的10 如果我们添加一个不在范围内的数据如下图所示mysql直接拒绝了用户的操作 如果我们向mysql特定的类型中插入不合法的数据MySQL一般都是直接拦截我们不让我们做对应的操作 反过来如果我们已经有数据被成功插入到mysql中了一定插入的时候是合法的 所以mysql中一般而言数据类型本身也是一种约束 这种约束倒逼程序员让程序员尽可能进行正确的插入 约束约束使用者 另外如果你不是一个很好的使用者mysql也能保证数据插入的合法性这样就能够保证数据库中的数据是可预期的完整的 测试环境Centos bit使用注意事项 2.tinyint类型
语法
tinyint [unsigned]【测试一】有符号tinyint测试(-128~127)
create table testTinyInt(num tinyint);
insert into testTinyInt values(127);
insert into testTinyInt values(-128);
insert into testTinyInt values(0);
desc testTinyInt;现在插入越界数值mysql会拒绝插入
insert into testTinyInt values(128);
insert into testTinyInt values(-129);【测试二】无符号tinyint测试0255
create table testTinyIntUn(num tinyint unsigned);
insert into testTinyIntUn values (0);
insert into testTinyIntUn values (255);
insert into testTinyIntUn values (128);
select * from testTinyIntUn;
desc testTinyIntUn;现在插入越界数值mysql会拒绝插入
insert into testTinyIntUn values(-1);
insert into testTinyIntUn values(-256);说明
在MySQL中整型可以指定是有符号的和无符号的默认是有符号的可以通过unsigned来说明某个字段是无符号的根据自己实际情况选择不同类型虽然不同类型之间只差几个字节但是用于百万级别千万级别列表情况下省下来的不是一芯半点了
3.int类型
语法
int(M) zerofillM这是可选的参数用于指定显示宽度。M 的值指定了该字段显示的最小位数。如果插入的数值的位数少于 M 指定的位数那么数值将在左侧填充零以达到指定的宽度。ZEROFILL这是一个属性当与 INT 类型一起使用时如果数值的位数少于指定的宽度则在数值的左侧填充零。 需要注意的是
ZEROFILL 不会改变数值的实际存储大小。即使指定了 INT(5) ZEROFILL整数仍然是按照 INT 的标准大小通常是4字节存储的。如果数值超过了 M 指定的位数那么 ZEROFILL 不会起作用数值将按原样显示而不会填充零。ZEROFILL 自动为该字段添加 UNSIGNED 属性这意味着你不能在该字段中存储负数。
4.float类型
float[(m,d)] [unsigned]m指定显示长度d指定小数位置占用空间4个字节那么整数部分位数为m-d【示例一】设计一个表该表表示的范围是 -99.99~99.99MySQL在保存值时会进行四舍五入
create table testFloat(id int, salary float(4,2));
insert into testFloat values(1, -99.99);
insert into testFloat values(2, -99.991);#多的这一点被拿掉了insert into testFloat values(3, 3);
insert into testFloat values(4, 0.1);只要在当前字段范围内的数值若该数值的小数位数不满d为mysql会自动在后面补0 float类型会进行四舍五入如果五入后超出表示范围则会报错
insert into testFloat values(5, 99.995);【示例二】如果定义的是float(4,2) unsigned 因为把它指定为无符号的数范围是099.99
create table testFloatUn(id int, salary float(4,2) unsigned);
insert into testFloatUn values(100, -0.1);注意在MySQL中使用 FLOAT 或 DOUBLE 数据类型时可能会遇到精度丢失的问题。这是因为 FLOAT 和 DOUBLE 类型是基于IEEE标准的浮点数它们在内部使用二进制格式来表示数值这可能导致某些十进制小数不能精确表示。
create table testFloatDe(num float);
insert into testFloatDe values(123456789.987654321);
select * from testFloatDe;MySQL中的 FLOAT 类型默认精度通常是单精度32位它只能保证大约7到8位十进制数的精度。当你插入一个非常大的数值或者一个包含非常多小数位的数值时超出这个精度的部分就会被舍入或者直接丢失为了避免精度丢失我们使用decimal类型
5.decimal类型
语法
decimal[(m,d)] [unsigned] # 定点数m指定长度d表示小数点的位数decimal(5,2) 表示的范围是 -999.99 ~ 999.99decimal(5,2) unsigned 表示的范围 0 ~ 999.99decimal 和 float 很像但是有区别float 和 decimal 表示的精度不一样
create table testDecimal(id int, salary float(10,8), salary2 decimal(10,8));
insert into testDecimal values(1,12.34567890, 12.34567890);发现decimal的精度更准确因此如果我们希望某个数据表示高精度选择decimal
decimal整数最大位数m为65支持小数最大位数d是30.如果d被省略默认为0。如果m被省略默认是10
三、文本、二进制类型
1.char类型
语法
char(L) #固定长度字符串L是可以存储的长度单位为字符最大长度值可以为255create table testChar(name char(20));
insert into testChar values(zhangsan);
insert into testChar values(张三);无论是汉字还是字符在mysql中都认为是一个字符
在utf_8中一个汉字是3个字节gbk下一个汉字2个字节 char(2)表示可以存放两个字符可以是字母或者汉字但是不能超过2个最多只能是255
create table testChar1(name char(2));
insert into testChar1 values(张三);create table testChar2(name char(256));2.varchar类型
语法
varchar(L) #可变长度字符串L表示字符长度最大长度65535个字节举例
create table testVarchar(id int, name varchar(20));
insert into testVarchar values(1,张三);
insert into testVarchar values(2,lisi);说明关于varchar(len)len到底是多大这个len值和表的编码密切相关
varchar长度可以指定为0到65535之间的值但是有1到3个字节用于记录数据大小所以说有效字节数是65532。当我们的表的编码是utf8时varchar(n)的参数n最大值是65532/321844[因为utf中一个字符占用3个字节]如果编码是gbkvarchar(n)的参数n最大是65532/232766因为gbk中一个字符占用2字节。
2.1.char 和 varchar比较
实际存储char(4)varchar(4)char占用字节数varchar占用字节数abcdabcdabcd4*3124*3113AAA4*3121*314abcde无法存储无法存储数据超出长度数据超出长度
如何选择定长或变长字符串
如果数据确定长度都一样就使用定长即char类型比如身份证手机号md5。如果数据长度有变化,就使用变长(varchar), 比如名字地址但是你要保证最长的能存的进去。定长的磁盘空间比较浪费但是效率高。变长的磁盘空间比较节省但是效率低。定长的意义是直接开辟好对应的空间变长的意义是在不超过自定义范围的情况下用多少开辟多少。
3.日期和时间类型
常用的日期类型有3中分别如下
date日期yyyy-mm-dd占用三个字节datetime时间日期yyyy-mm-dd hh:mm:ss占用八个字节timestamp时间戳从1970年开始经过的秒数表示格式与datetime一致yyyy-mm-dd hh:mm:ss占用四个字节
案例
# 创建表
create table birthday(t1 date, t2 datetime, t3 timestamp);# 插入数据 插入两种时间
insert into birthday(t1,t2) values(2001-1-1,2022-6-7 19:00:00);select * from birthday;ubuntu环境下添加数据时时间戳不会自动补上当前时间 centos环境下添加数据时时间戳会自动补上当前时间
centos环境下更新数据时时间戳会更新当前时间
//创建表
mysql create table birthday(t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)//插入数据:
mysql insert into birthday(t1,t2) values(1997-7-1,2008-8-8 12:11:1); -- 插入两种时间
Query OK, 1 row affected (0.00 sec)mysql select * from birthday;
------------------------------------------------------
| t1 | t2 | t3 |
------------------------------------------------------
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-11-10 21:22:55 | --添加数据时时间戳自动补上当前时间
------------------------------------------------------//更新数据
mysql update birthday set t12000-1-1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql select * from birthday;
------------------------------------------------------
| t1 | t2 | t3 |
------------------------------------------------------
| 2000-01-01 | 2008-08-08 12:01:01 | 2024-11-10 21:23:09 | -- 更新数据时间戳会更新成当前时间
------------------------------------------------------
四、String类型
1.enum
基本语法
enum(可选选项1,可选选项2,可选选项3,...)enum枚举“单选”类型
该设定只是提供了若干个选项的值最终一个单元格中实际只存储了其中一个值而且出于效率考虑这些值实际存储的是“数字”因为这些选项的每个选项值依次对应如下数字123…最多65535个当我们添加枚举值时也可以添加对应的数字编号
enum比如可以用在性别字段中只能选择男女
create table student (name varchar(20), gender enum(男,女));
insert into student values(张三,男);
insert into student values(李四,女);如果选择enum之外的值会报错
insert into student values(王五,保密);这里的enum类似于C/C中的enum第一个选项代表1第二个代表选项代表2
单选选项对应的数字是从1开始编号的而不是从0开始编号的超出enum的选项值会报错
insert into student values(赵六,1);
insert into student values(田七,2);2.set类型
set集合“多选”类型
基本语法
set(可选选项1,可选选项2,可选选项3,...)该设定只是提供了若干个选项的值最终一个单元格中设计可存储了其中任意多个值。最多可以设置64个选项。
【案例】有一个调查表votes需要调查人的喜好比如登山游泳篮球武术中去选择可以多选男女[单选]
create table votes(name varchar(20),gender enum(男,女),# 注意使用数字标识的时候就是正常的从1开始的数组下标hobby set(登山,游泳,篮球,武术) #注意使用数字标识每个爱好的时候想想Linux权限采用比特位位置来和set中爱好对应起来
);插入数据
insert into votes values(张三,男,登山,武术);
insert into votes values(李四,2,登山,武术);
select * from votes where gender2;有如下数据想查找所有喜欢篮球的人 使用如下查询语句
select * from votes where hobby篮球;不能查询出所有爱好为篮球的人
集合查询使用 find_in_set 函数
find_in_set(sub,str_list) 如果 sub 在 str_list 中则返回下标如果不在返回0str_list是用逗号分隔的字符串。
喜好为篮球的人
select * from votes where find_in_set(篮球,hobby);不建议在enum中使用选项对应的枚举值集合值的时候采用数字的方式因为不利于阅读。
set补充
set使用位图的方式存储各个选项第一个选项对应120第二个选项为2(21)第三个选项为4(2 ^ 2)这样存储可以大大提高存储效率 登山000001----1
游泳000010 —2
登山游泳000011 —3