文档章节

数据库之表的字段类型

o
 osc_wws45aot
发布于 2019/08/20 14:50
字数 1819
阅读 16
收藏 0

精选30+云产品,助力企业轻松上云!>>>

字段类型
1.整型
SMALLINT TINYINT INT BIGINT

TINYINT 
默认是否有符号 默认是带有符号的(-128,127)
超出限制会如何 超出之后只会存最大值或者最小值


create table t6(id TINYINT);


not null 不能为空
unsigned 无正负符号 # 加上unsigned没有负数,区间从零到最大字符数的最大值
zerofill 0填充多余的位数

int的存储宽度是4个Bytes,即32个bit,即2**32

无符号最大值为:4294967296-1

有符号最大值:2147483648-1

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

ps:
mysql> create table t15(x int(8) unsigned);
Query OK, 0 rows affected (0.58 sec)

mysql> insert into t15 values(34578352365896);
Query OK, 1 row affected, 1 warning (0.06 sec)

mysql> select * from t15;
+------------+
| x |
+------------+
| 4294967295 |
+------------+

char后面的数字是用来限制存储数据的长度的

特例:只有整型后面的数字不是用来限制存储数据的长度 而是用来控制展示的数据的位数
int(8) 够/超8位有几位存几位,不够8位空格填充

修改约束条件 不够8位的情况下 用0填充


强调:**对于整型来说,数据类型后的宽度并不是存储限制,
而是显示限制,所以在创建表时,
如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

只要是整型 都不需要指定宽度 因为有默认的宽度 足够显示对应的数据

### 严格模式补充

我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

模糊匹配
like 
%匹配任意多个字符
_匹配任意一个字符

set session 临时有效 只在你当前操作的窗口有效
set global 全局有效 终生有效
set global sql_mode = 'STRICT_TRANS_TABLES';
设置完之后 你只需要重新退出客户端再次进入即可


```python
show variables like "%mode%"; # 查看数据库配置中变量名包含mode的配置参数
# 修改安全模式
set session # 只在当前操作界面有效
set global # 全局有效

set global sql_mode ='STRICT_TRANS_TABLES' #设置严格模式语句
# 修改完之后退出当前客户端重新登陆即可
'''
ps:
mysql> create database db2;
Query OK, 1 row affected (0.05 sec)

mysql> use db2;
Database changed
mysql> create table t1(name char(4),id int);
Query OK, 0 rows affected (0.27 sec)

mysql> insert into t1 values('li',1);
Query OK, 1 row affected (0.06 sec)

mysql> select * from t1;
+------+------+
| name | id |
+------+------+
| li | 1 |
+------+------+
1 row in set (0.00 sec)

mysql> insert into t1 values('zhang',2);
ERROR 1406 (22001): Data too long for column 'name' at row 1

以上事例:在我们设置严格模式之后,char(4),在向表中插入字符‘zhang’的时候,字符个数超过了限制,就会报错;

2.浮点型
float(255,30) 总共255位 小数部分占30位
double(255,30) 总共255位 小数部分占30位
decimal(65,30) 总共65位 小数部分占30位


create table t2(x float(255,30));
create table t3(x double(255,30));
create table t4(x decimal(65,30));
desc t2;
desc t3;
desc t4;
insert into t2 values(1.11111111111111111111111111111111);
insert into t3 values(1.11111111111111111111111111111111);
insert into t4 values(1.11111111111111111111111111111111);
select * from t2;
select * from t3;
select * from t4;

 

mysql> create table t2(x float(255,30));
Query OK, 0 rows affected (0.27 sec)

mysql> create table t3(x double(255,30));
Query OK, 0 rows affected (0.42 sec)

mysql> create table t4(x decimal(65,30));
Query OK, 0 rows affected (0.29 sec)

mysql> desc t2;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| x | float(255,30) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
1 row in set (0.03 sec)

mysql> desc t3;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| x | double(255,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+
1 row in set (0.03 sec)

mysql> desc t4;
+-------+----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------+------+-----+---------+-------+
| x | decimal(65,30) | YES | | NULL | |
+-------+----------------+------+-----+---------+-------+

mysql> insert into t2 values(1.11111111111111111111111111111111);
Query OK, 1 row affected (0.06 sec)

mysql> insert into t3 values(1.11111111111111111111111111111111);
Query OK, 1 row affected (0.03 sec)

mysql> insert into t4 values(1.11111111111111111111111111111111);
Query OK, 1 row affected, 1 warning (0.03 sec)

mysql> select * from t2;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t3;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select * from t4;
+----------------------------------+
| x |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
精确度
float < double < decimal


3. 字符类型(******)

* 分类
* char(定长)
* varchar(变长)
* 作用:姓名,地址,描述类信息

create table t5(name char(4));
create table t6(name varchar(4));
insert into t5 values('he');
insert into t6 values('he');

select * from t5;
select * from t6;

select char_length(name) from t5;
select char_length(name) from t6; # 仍然无法查看到真正的结果

首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
# 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
# 退出客户端重新登陆


ps:
mysql> set global sql_mode='strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%mode%';
# 退出客户端重新登陆
+----------------------------+---------------------------------------------+
| Variable_name | Value |
+----------------------------+---------------------------------------------+
| binlogging_impossible_mode | IGNORE_ERROR |
| block_encryption_mode | aes-128-ecb |
| gtid_mode | OFF |
| innodb_autoinc_lock_mode | 1 |
| innodb_strict_mode | OFF |
| pseudo_slave_mode | OFF |
| slave_exec_mode | STRICT |
| sql_mode | STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH |
+----------------------------+---------------------------------------------+
select char_length(name) from t5;
select char_length(name) from t6;

mysql> use db2;
Database changed
mysql> select char_length(name) from t5;
+-------------------+
| char_length(name) |
+-------------------+
| 4 |
+-------------------+
1 row in set (0.00 sec)

mysql> select char_length(name) from t6;
+-------------------+
| char_length(name) |
+-------------------+
| 2 |
+-------------------+

char与varchar的区别
char定长
1.浪费空间
2.存取速度快


varchar变长
1.节省空间
2.存取速度慢(较于char比较慢)
存的时候 需要给数据讲一个记录长度的报头
取的时候 需要先读取报头才能读取真实数据
1bytes+egon 1bytes+alex 1bytes+lxx 1bytes+jxx 1bytes+txx 


char(4) varchar(4)
取的时候方便 取的时候比较繁琐了 无法知道数据到底多长
直接按固定的长度取即可


#### 时间类型

* 分类

* date:2019-05-01
* time:11:11:11
* Datetime: 2019-01-02 11:11:11
* Year:2019

* 测试

```mysql
create table student(
id int,
name char(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'egon','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');


4.枚举与集合类型
枚举(enum) 限制某个字段能够存储的数据内容 枚举enum 多选一
集合(set) 限制某个字段能够存储的数据内容 集合set 多选多

mysql>
mysql> create table user(id int,name char(10),gender enum('male','female','others'));
Query OK, 0 rows affected (0.33 sec)

mysql> desc user;
+--------+--------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | char(10) | YES | | NULL | |
| gender | enum('male','female','others') | YES | | NULL | |
+--------+--------------------------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

mysql> insert into user values(1,'zhang','male');
Query OK, 1 row affected (0.06 sec)

mysql> insert into user values(1,'zhang','buming');
#没按限定的内容输入,直接报错。
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> select * from user;
+------+------------+--------+
| id | name | gender |
+------+------------+--------+
| 1 | zhang | male |
+------+------------+--------+


create table teacher(
id int,
name char(10),
gender enum('male','female','other'),
hobby set('read','swim','dbj','walk')
);

insert into teacher values(1,'zhang','male','swim,walk');

select * from teacher;

mysql> create table teacher(
-> id int,
-> name char(10),
-> gender enum('male','female','other'),
-> hobby set('read','swim','dbj','walk')
-> );
Query OK, 0 rows affected (0.29 sec)

mysql> insert into teacher values(1,'zhang','male','swim,walk');
Query OK, 1 row affected (0.10 sec)

mysql> select * from teacher;
+------+------------+--------+-----------+
| id | name | gender | hobby |
+------+------------+--------+-----------+
| 1 | zhang | male | swim,walk |
+------+------------+--------+-----------+
1 row in set (0.00 sec)

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
MySQL实战8 数据库和数据表的管理

MySQL实战 目录 DDL:Data Definition Language数据库定义语言:主要作用是对数据库和表的管理, 这里的表的管理是表本身,不是表里的记录数据值的管理,前面讲的增删改查是对表里的记录数据值...

香沙小熊
2019/04/22
0
0
Mysql之常用操作

一、数据库的相关操作   1.数据库的创建 create database 数据库名   创建一个名为db的数据库;      2.查询数据库 show databases;   查询所有数据库      3.删除数据库 dr...

osc_pv1kc2gm
2018/10/15
0
0
MySQL 数据库

首先我们需要了解什么是数据库?   数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。所谓“数据库”是以一定方式...

osc_0m100sf0
2019/04/11
2
0
一、MySql基本语句(一)

数据库:   库的操作:     1、查询库:show databases;     2、创建库:create database 库名     character set 编码格式(utf8);     3、查看数据库创建语句:show crea...

osc_lrhq0eax
2019/08/30
2
0
mysql建表和建数据库语句

一、数据库操作语言 数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。 SQL 的主要功能是和数据库建立连接,进行增删改查...

osc_vl3n35s2
04/02
3
0

没有更多内容

加载失败,请刷新页面

加载更多

在Bash脚本中,如果发生某种情况,如何退出整个脚本?

问题: I'm writing a script in Bash to test some code. 我正在Bash中编写脚本来测试一些代码。 However, it seems silly to run the tests if compiling the code fails in the first pl......

技术盛宴
12分钟前
11
0
Windows安装Python+OpenCV

1、更新PyCharm中pip来源,使用清华和阿里云:https://pypi.tuna.tsinghua.edu.cn/simple/ http://mirrors.aliyun.com/pypi/simple/ 2、PyCharm查看已安装packets,添加新的安装包,从pip云端...

极客行
35分钟前
17
0
tomcat8配置虚拟目录,实现一个tomcat运行两个项目, tomcat配置URL不区分大小写

<?xml version="1.0" encoding="UTF-8"?><!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distri......

青峰Jun19er
41分钟前
19
0
HBase和MySQL存储方式的差别?或者说是,行存储和列存储的区别?

HBase借鉴列存储的思想,但是最底层依然是依靠键值对来存储数据,HBase为非关系型数据库 而MySQL则是行存储,MySQL为关系型数据库 写过程 行存储因为数据是连续的,所以只需要进行追加即可;...

其乐m
45分钟前
25
0
一个老程序员在互联网寒冬下的感悟

1. 你千万不要认为学习技术就可以换来稳定的生活和高的薪水待遇,你更不要认为那些从事市场开发,跑腿的人,没有前途。 不清楚你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开...

北柠Java
49分钟前
39
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部