MySQL字段类型
一、字符编码与配置文件
''' MySQL的服务端字符编码默认使用的是latinl 所以我们在写入中文的时候会出现乱码情况 我们可以临时在把这个表的字符编码给改成utf8 但是这样的话态麻烦了这样每次都需要改 所以我们可以直接把配置文件给改了 ''' """ 但是官方说了他们自己的配置文件最好不要动 那么我们可以复制一份修改 my-default.ini windows下MySQL默认的配置文件 拷贝上述文件并且重命名为my.ini 然后在该文件中编写上列代码: [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8 这些都是在度娘上找的到的 注意如果配置文件涉及到了mysqld相关的配置修改 那么需要重启服务端才可以生效 因为MySQL每次登入的时候都会运行一遍配置文件 所以我们可以在配置文件中的[mysql]下把用户名和密码写上user='root' password='密码' 这样我们在登入的时候只需要写上 mysql 就可以登入了 """
二、存储引擎
# 存储引擎我们可以简单的理解为针对相同的数据采用不同的存取方式 show engines; # 查看所有的存储引擎 我们主要知道其中的四种 # 1.MySIAM MySQL5.5之前版本默认的存储引擎 存储数据的速度快 但是功能较少 安全性不高 # 2.InnoDB MySQL5.6之后版本默认的存储引擎 存储速度没有MySIAM快 但是有行锁、外键、支持事务等诸多功能 安全性高 # 3.MeMory 基于内存的存储引擎 速度快 但是断电数据就会消失 # BlackHole 黑洞 任何写进去的数据都会立刻丢失 类似于垃圾站 ps:MySQL中默认是大小写不敏感的(忽略大小写) # 不同存储引擎之间底层文件的不同 我们可以创建四个表 让每个表的存储引擎对于上方四个 create table t1(id int) engine=innodb; create table t2(id int) engine=myisam; create table t3(id int) engine=memory; create table t4(id int) engine=blackhole; InnoDB .frm 表结构 .ibd 表数据、表索引(加快数据查询) MyISAM .frm 表结构 .MYD 表数据 .MYI 表索引(加快数据查询) Memory .frm 表结构 BlackHole .frm 表结构 我们看表中的数据 insert into t1 values(1); # innodb是可以看到数据的 insert into t2 values(1); # myisam也是可以看到数据的 insert into t3 values(1); # memory只要mysql不重启数据或则电脑不关机数据就会还在 insert into t4 values(1); # blackhole是没有数据 写进去也看不见
三、创建表的完整语法
''' create table 表名( 字段名1 字段类型(数字) 约束条件, 字段名2 字段类型(数字) 约束条件, 字段名3 字段类型(数字) 约束条件 )engine=存储引擎; 1.字段名和字段类型是一定要写的(至少一个) 2.数字和约束条件是可写可不写的 3.约束条件可以写多个 空格隔开即可 4.最后一个约束条件后面不能加逗号
5.存储引擎默认innodb '''
四、字段类型之整型
MySQl的整型有多种
tinyint、smallint、int、bigint而每种的存储范围是不一样的,而且还有负数 负号还要占一个字节
# 1.验证整型是否自带负号 create table t6(id tinyint); insert into t6 values(-129),(256); 当我们写进去的数字超出范围时 我们查看数据时发现会自动把数据自动填充为边界值(-128,255) 这样数据失真了 就没有了任何意义 上述所有整型都默认带有负号 # 2.自定义移除负号 '''unsigned 约束条件之一 意思是不要负号''' create table t7(id tinyint unsigned); insert into t7 values(-129),(256); 我们查看数据的时候 发现MySQl还是会帮我们填充至临界值(0,256) ''' 我们插入数据超出范围的时候 MySQL应该不要让我们插入 而不是修改值这样是没有意义的 数据库应该直接报错(这个特性MySQL是有的 只不过被我们修改了>>配置文件) ''' # 1.命令临时修改 set session sql_mode='strict_trans_tables' # 当前客户端操作界面有效 set global sql_mode='STRICT_TRANS_TABLES' # 服务端不重启永久有效 # 2.配置文件永久修改 在[mysqld]下面添加下面这行代码即可 sql_mode='STRICT_TRANS_TABLES'
五、字符类型之浮点型
# 浮点型有三种可以表示: float double decimal 三者都可以表示 只不过它们的精确度不一样 # 使用方式: float(255,30) double(255,30) decimal(65,30) # 第一个数字是表示 总共多少位 第二个数字是表示 小数位是多少位 # 验证精确度 create table t8(id float(255,30)); create table t9(id double(255,30)); create table t10(id decimal(65,30); insert into t8 values(1.11111111111111111111111111111); insert into t9 values(1.11111111111111111111111111111); insert into t10 values(1.11111111111111111111111111111); 查看数据我们可以发现: t8: 1.111111164093017600000000000000 t9: 1.111111111111111200000000000000 t10: 1.111111111111111111111111111110 float < double < decimal """ 一般情况下float足够使用了 如果想追求非常完美的精确度 可以使用字符串来代替 """
六、字段类型之字符类型
# 表示字符类型有两种 # 1.char 定长 char(4) 表示最大只能存储四个字符 如果超出直接报错 没有超出范围 用空格填充 # 2.varchar 变长 varchar(4) 表示最大只能存储四个字符 如果超出直接报错 没有超出范围 就有几位存几位 # 验证两者的区别 create table t11(id int, name char(4)); create table t12(id int, name varchar(4)); # 1.结果发现我们在存入数据的时候两者类型只要超出四个字符就会报错 主意 这个配置sql_mode='strict_trans_tables'没有写上的话是不会报错的 # 2.验证定长和变长特性 char_length() # 统计字段数据的长度 """ 默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格 然后在读取的时候又会自动将填充的空格移除 如果想取消该机制 需要sql_mode set global sql_mode='strict_trans_tables,pad_char_to_full_length'; 上述目录是替换 不是新增 所以之前的配置也要写上 这样在查看数据的时候我们就可以看到char和varchar的区别了 """ # 3.char和varchar的区别 char 整存整取 速度快 浪费存储空间 varchar 节省存储空间 存取数据的速度慢于char ''' char(4) a son jacktom lili char在存没有超出字符范围的数据的时候是按照空格填充一起存储的 取数据的时候也是按照4个字符4个字符取 所以会很快 varchar(4) 1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili varchar在存没有超出范围的数据的时候是 在你存数据的前面加上一个报头然后计算你存的数据是多少位数一起存到报头中 取得时候就会先让报头然后计算存储的数据是多少位数然后拿到数据 所以费时间 但是使用的时候两者的使用频率都很高 就比如存储姓名>>>: varchar ''' 现在很多使用varcahr的
七、数字的含义
数字大部分情况下都是用来限制字段的存储长度 但是整型除外!!! 不是用来限制存储的长度 而是展示的长度 create table t13(id int(3)); create table t14(id int(3) zerofill); # zerofill 约束条件 不够按0填充 # 就是如果我存进去的数字是 12的话 那么展示的时候就会变成 012 总结 以后涉及到整型字段的定义 类型后面不需要加括号写数字 除非有业务需求必须固定位数 eg: 00000000013 00123123031 快递单号
八、字段类型之枚举与集合
# 1.枚举 多选一 eg: 性别(男,女,其他) create table t15( id int, name varchar(32), gender enum('male','female','others') ); insert into t15 values(1,'jason','male'); ''' 我们在填写数据的时候在写性别的时候就只能写着三种的一个 如果写其他的那么就会报错不写也会报错 ''' # 2.集合 多选多(包含多选一) eg: 爱好(唱、跳、rap) create table t16( id int, name varchar(32), hobbies set('read','run','music','rap') ); insert into t16 values(1, 'jason', 'read,music'); # 可以写一个也可以写多个 在引号中编写 用逗号隔开 不能不写、写错
九、日期类型
# 表示日期类型的有三种: date 年月日 datetime 年月日时分秒 time 时分秒 year 年份 create table t17( id int, name varchar(32), birth date, reg_time datetime, study_time time, join_time year ); insert into t17 values(1,'jason','2022-11-11','2000-11-11 11:11:11','11:11:11','1995'); select * from t17; +------+-------+------------+---------------------+------------+-----------+ | id | name | birth | reg_time | study_time | join_time | +------+-------+------------+---------------------+------------+-----------+ | 1 | jason | 2022-11-11 | 2000-11-11 11:11:11 | 11:11:11 | 1995 | +------+-------+------------+---------------------+------------+-----------+
十、约束条件
''' 写入数据有两种方式: insert into 表名 values(数据,数据) 默认按照创建表的字段顺序添加 insert into 表名(字段名) values(数据) 可以自定义字段顺序 ''' 1.unsigned 无负号 id int unsigned 2.zerofill 零填充 id int zerofill 3.not null 非空 name varchar(32) not null # 就是写入数据的时候不能为空 但是如果就写一个'' 也是能写入到表中的 4.default 默认值 name varchar(32) default 'jason' # 就是在写入数据的时候如果我们不写的话那么数据默认就是 default后面的数据 写了就是写了的数据 5.unique 唯一值 id int unique 单列唯一 # 就是id这段数据只能不能重复 重复就写不进去了 unique(host,port) 联合唯一 # 联合唯一就是括号内 host可以一样 port也可以一样 但是两者和起来的时候不能一样 eg: create table t5(id int,host varchar(32),port int, unique(host,port)); insert into t5 values(1,'127.0.0.1',8080); insert into t5 values(2,'127.0.0.1',8081); insert into t5 values(3,'127.0.0.2',8081); # 上面三个都不会报错 insert into t5 values(4,'127.0.0.1',8080); # 如果一样就会直接报错