MySQL数据库8(七)列类型

列类型

整数类型

tinyint

迷你整型,系统采用一个字节来保存的整型,一个字节=8byte,最大能表示的数据是0-255。

smallint

小整型,系统采用两个字节来保存的整型,能表示0-65535之间的整型

mediumint

中整型,采用三个字节来保存数据

int

整型,(标准整型),采用四个字节来保存数据。

bigint

大整型,采用八个字节来保存数据。

实际应用中,应该根据对应的数据范围来选定对应的整型类型,通常使用的比较多的是tinyint和int。

无符号标识设定

无符号,表示存储的数据在当前字段中,没有负数(只有正数,如tinyint区间为0-255)

基本语法:在列类型之后加上一个unsigned。

显示长度

显示长度:指数据在数据显示的时候,到底可以显示多长位。

tinyint(3):表示最长可以显示3位,unsigned说明只能是正数,0-255永远不会超过三个字节长度。

tinyint(4):表示最长可以显示4位,-128~127,带符号(有符号位),需要四个字节。

显示长度只是代表了数据是否可以达到指定的长度,但是不会自动满足到指定长度:如果想要数据显示的时候,保持最高位(显示长度),那么还需要给字段增加一个zerofill属性才可以。

zerofill:从左侧开始填充0(左侧不会改变数值大小),所以负数的时候就不能使用zerofill,一旦使用zerofill就相当于确认该字段为unsigned。

数据显示的时候,zerofill会在左侧填充0到指定位,如果不足3位,那么填充到3位,如果本身已经够了或者超出,那么就不再填充。

显示长度可以自己设定,超出长度不超出范围不会影响,只会对不够长度(显示长度)的进行补充

小数型

专门用来存储小数的。

在mysql中将小数类型又分为两类,浮点型和定点型。

浮点型

浮点型又称之为精度类型,是一种有可能丢失精度的数据类型,数据有可能不那么准确(尤其是在超出范围的时候)。

浮点型之所以能够存储较大的数值(不精确),原因就是利用存储数据的位来存储指数。

整型:所有位都为数据位。

浮点型:有部分用于存储数据,部分用于存指数。

float

float又称之为单精度类型,系统提供4个字节用来存储数据,但是能表示的数据范围比整型大的多,大概是10^38;缺点:只能保证大概7个左右的精度(如果数据在7位数以内,那么基本是准确的,但是如果超过了7位数,那么就是不准确的)

基本语法:

float:表示不指定小数位的浮点数

float(M,D):表示一共存储M个有效数字,其中小数部分占D位

float(10,2):整数部分为8位,小数部分为2位

注意:如果数据精度丢失,浮点型是按照四舍五入的方式进行计算。

说明:用户不能直接插入数据超过指定的整数部分长度,但是如果是系统自动进位导致,系统可以承担。

浮点数可以采用科学计数法存储数据

double

double由称之为双精度类型,系统用 8个字节来存储数据,表示的范围约为10^308次方,但是精度也只有15位左右。

定点数

定点数:能够保证数据精确的小数(小数部分可能不精确,超出长度会四舍五入),整数部分一定精确。

decimal

decimal定点数:系统自动根据存储的数据来分配存储空间,每大概9个数就会分配四个字节来进行存储,同时整数和小数部分是分开的。

decimal(M,D):M表示总长度,最大值不能超过65位;D表示小数部分长度,最长不能超过30位。

时间日期型

date

日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01到9999-12-12,初始值为0000-00-00。

time

时间类型:能够表示某个指定的时间,但是系统同样是提供3个自己来存储,对应的格式为:HH-ii-ss,但是mysql中的time类型能够表示的时间范围要到得多,能表示从-838:59:59~838:59:59,在mysql中具体的用处是用来描述时间段。

time类型特殊性:本质是用来表示时间区间,能表示的范围比较大。在进行时间类型录入的时候,可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以是负数),系统会自动将该数字转化成 天数*24小时加上后面的时间。

datetime

日期时间类型:即时将date和 time合并起来,表示的时间,使用8个字节来存储数据,格式为:YYYY-mm-dd HH-ii-ss,能表示的区间1000-01-01 00:00:00到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00

timestamp

时间戳类型:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-mm-dd HH-ii-ss

year

年类型:占用一个字节来保存,能表示1900~2155年,但是year有两种数据插入方式:0-99和四位数的具体年。

year进行两位数插入的时候,有一个区间划分,零界点为69和70;当输入69以下(包括69),那么系统时间为20+数字,如果是70以上(包括70),那么系统时间为19+数字

PHP中有非常强大的时间日期转换函数:date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP的时候,时间的保存通常使用时间戳,从而用整型来保存。

字符串类型

char

定长字符:指定长度之后,系统一定会分配指定的空间用于存储数据

基本语法:char(L),L代表字符数(英文字母和中文一样),L长度为0到255

varchar

变长字符:指定长度后,系统会根据实际存储的数据来计算长度,分配合适的长度(数据没有超出长度)

基本语法:varchar(L),L代表字符数,L的长度理论值为0到65535

因为varchar要记录数据长度(系统根据数据长度自动分配长度),所以每二个varchar数据产生后,系统都会在数据后面增加1-2个字节的额外开销:是用来保存数据所占用的空间长度。如果数据本身小于127个字符,额外开销一个字节;如果大于127个,就开销两个字节。

char和varchar数据存储对比(utf8,一个字符都回占用3个字节):


存储数据


Char(2)


Varchar(2)


Char所占字节


Varchar所占字节


A


A


A


2*3=6


1*3+1 =4


AB


AB


AB


2*3=6


2*3+1=7

char和varchar的 区别:

1、char一定会使用指定的空间,varchar是根据数据来定空间

2、char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算

如果确定数据一定是占指定长度,那么适应char类型。

如果不确定数据到底占多少,那么使用varchar类型

如果数据长度超过255个字符,不论是否固定长度,都回使用text,不再使用char和varchar

text

文本类型:本质上mysql提供了两种文本类型

text:存储普通的字符文本

blob:存储二进制文本(图片,文件),一般不会使用blob来存储文件本身,通常是使用一个链接来指向对应的文件本身。

text:系统中提供四种text

tinytext:系统使用一个字节来保存,实际能够存储的数据为:2^8 + 1字符数

text:使用两个字节保存,实际存储为:2^16+2字符数

mediumtext:使用三个字节保存,实际存储为:2^24+3字符数

longtext:使用四个字节保存,实际存储为:2^32+4

注意:

1、在选择对应的存储文本的时候,不用刻意去选择text类型,系统会自动根据存储的数据长度来选择合适的文本类型

2、在选择字符存储的时候,如果数据超过255个字符,那么一定选择text存储

enum

枚举类型:在数据插入之前,先设定几个项,这几个项就是可能最终出现的数据结果。

如果确定某个字段的数据只有那么几个值:如性别,男、女、保密,系统就可以在设定字段的时候规定当前字段只能存放固定的几个值:使用枚举

基本语法:enum(数据值1,数据值2…)

系统提供了1-2个字节来存储枚举数据:通过计算enum列举的具体值来选择时机的存储空间;如果数据值列表在255个以内,那么一个字节就够了,如果超过255但是小于65535,那么系统采用两个字节保存。

枚举enum的存储原理:实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标;当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始

enum(1=>’男’,2=>‘女’,3=>‘保密’);

特性:在mysql中系统是自动进行类型转换的,如果数据用到到“+、-、*、/”系统就会自动将数据转换为数值,而普通字符串转换成数值为0

select 字段名 + 0 from 表名;

既然实际enum字段存储的结果是数值,那么在进行数据插入的时候,就可以使用对用的数值来进行

枚举的意义:

1、规范数据本身,限定只能插入规定的数据项

2、节省存储空间

set

集合:是一种将多个数据选项可以同时保存的数据类型,本质是将指定的项按照对应的二进制位来进行控制,1表示该选项被选中,0表示该选项没有被选中。

基本语法:set(’值1’,’值2 ’…);

系统为set提供了多个字节进行保存,但是系统会自动计算来选择具体的存储单元

1个字节:set中只能有8个选项

2个字节:set中只能有16个选项

3个字节:set中只能有24个选项

8个字节:set中只能有64个选项(最多)

set和enum一样,最终存储大数据字段中的依然是数字而不是真实的字符串,可以数字插入数据。

插入数据:可以插入多个数据,使用逗号进行分割。

数据选项所在的顺序与数据插入顺序无关,最终都会变成选项对应的顺序。

系统按照数据选项顺序编排,从第一个开始进行占位,每一个对应一个二进制位。数据存储时,被选中的项对应的位值为1,否则为0 ,系统在进行存储的时候会自动将得到的最终的二进制颠倒过来,然后再进行转换为10进制(系统要补足八个,如果不够八位,则数据就会变得很大)

和enum类似,也可以进行数字插入。

注意:数字插入的前提是对应的二进制位上都有对应的数据项

set的意义:

1、规范数据

2、节省存储空间

enum和set的对比:

enum:单选框

set:复选框

MySQL记录长度

在mysql中,mysql的记录长度(record = 行 row)总长度不能超过65535个字节

varchar能够存储的理论值为65535个字符:字符在不同的字符集下可能占用多个字节。

Varchar能够存储的长度:(varchar有1~2个放置长度的字节)

utf8最多只能存储21844个字符(65535/3 - 1)

gbk最多只能存储32766个字符(65535/2 - 1)

原文地址:https://www.cnblogs.com/sun-yanglu/p/9581630.html

时间: 2024-10-29 19:06:11

MySQL数据库8(七)列类型的相关文章

mysql数据库中的boolean类型

mysql数据库中没有boolean类型,用tinyint类型代替,1代表true,0代表false

使用Python向MySQL数据库中存入json类型数据

0.说明 因为出于个人项目的需要,获取到的数据都是json类型的,并且都要存入MySQL数据库中,因为json类型数据不像一般的文本数据,所以在存入MySQL时需要注意的问题很多. 在网上找了很多方法,整理了一下比较实用可靠的,总结下来就是下面的过程: MySQL表中需要保证存储json数据的列类型为BLOB: 使用sql语句时,使用MySQLdb.excape_string函数来对json数据进行转义: 查询数据时,将结果使用json.loads就能够得到原来的Python数据类型: 下面就来

【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度:如果是BLOB和TEXT类型,必须指定 length,下同. 修改表结构 ALTER mytable ADD INDEX

mysql之数据表列类型和列约束一

mysql数据表在定义列时,需要确定列的数据类型,以及列的相关属性或是说约束,那么mysql的列类型大致可分为如下: 列类型可分为如下: 1.数值类型 又分为整数和小数 2.时间和日期类型 3.字符类型 稍微有C基础的同学应该不是很陌生,这里呢我不会讲解太多,稍微解释一下就行. 整数部分 整数部分要注意的地方就是字节以及有符号和无符号的区别 我们知晓1byte=8bit 那么2的8次方就是0-255之间 有进制转换的同学应该知道了,那么有符号和无符号是指他需要1位来标识正负数,所以要减去1位,自

MySQL从库的列类型不一致导致的复制异常问题

官方文档:https://dev.mysql.com/doc/refman/5.6/en/replication-features-differing-tables.html slave_type_conversions  这个参数在mysql5.5.3 引入,目的是启用row 格式的bin-log 的时候,如果主从的column 的数据类型不一致,会导致复制失败,mysql5.5.3 之后支持,主库是int 从库是bigint 这种类型的复制, 这个参数的意义就是控制些类型转换容错性. 如果从

Java基础知识—发送Emai和访问MySQL数据库(七)

概述 Java程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) .Java访问数据则需要 使用JDBC 连接 MySQL 数据库.JDBC起到数据库驱动作用. E-Mail的发送 第三方包的下载地址方式,加载之后在对应的项目中导入该库文件. 访问 JavaMail 官网下载最新Jar文件: 访问 JAF(版本 1.1.1)官网下载最新JAR文件: 以下是下载之后,编写测试代码,能够借助网易

MySQL数据库(七)—— 用户管理和权限管理

一.管理用户 1.查询用户 第一步:切换到MySQL数据库 use mysql; 第二步:查询user表 select * from user; 两条记录都是root用户 ,其中第一条记录表示本机访问,第二条记录是远程访问. 注意:通配符%表示可以在任意主机登录查询数据库 2.新增用户 语法:create user '用户名'@'主机名' identified by '密码'; 3.删除用户 语法:drop user '用户名'@'主机名' 4.修改用户密码 语法:update user set

Mysql数据库里面的String类型依照数字来排序以及按时间排序的sql语句

今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决的方法: 如: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY -ID DESC 或者: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY (ID + 1) mysql时间格式化,按时间段查询MYSQL语句   2011-04-15 09:01:08| 

Mysql数据库里面的String类型按照数字来排序以及按时间排序的sql语句

今天做项目的时候,遇到个小小的问题,在数据库中查询的时候,要用String类型的ID进行一下排序!(注:ID字段为 varchar 类型) 解决办法: 如: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY -ID DESC 或者: Sql代码 SELECT * FROM  Student WHERE 1 = 1 ORDER BY (ID + 1) mysql时间格式化,按时间段查询MYSQL语句   2011-04-15 09:01:08| 

Mysql数据库按照varchar字符串类型排序和按照int整型类型排序的区别和注意点及解决方案

自己建表的时候,把一个字段类型创建为varchar(2) ,其实应该建为int(2)的.因为我只允许输出数字.这本来也没什么,无非就是占点空间,懒得改了.但是今天在后台发现排序有问题.于是,没办法,改 之.下面简单说一下MySQL的varchar排序问题,引以为戒. 下面,我从数据库里面以server_id排一下序,大家来看一下排序后的结果: select server_id from cardserver where game_id = 1 order by server_id desc li