MySQL详解(1)----------数据类型

数据类型

注:以下内容针对MySQL5.0及以上版本

MySQL的数据类型非常多,选择正确的数据类型对于获得高性能至关重要,本文是我结合网上看到的一些blog加上《高性能MySQL》一书上的内容整理而成的。

三大原则:

1,更小的通常更好,应该尽量使用可以正确存储数据的最小数据类型。

2,简单就好,简单数据类型的操作通常需要更少的CPU周期。

3,尽量避免NULL,如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更复杂。

MySQL支持的数据库类型主要分为3类:数字类型、字符串类型和日期时间类型。

数字类型总体可分为整数型和浮点型两类

1、整型

MySQL数据类型 含义(有符号)
tinyint(m) 1个字节 范围(-128~127)
smallint(m) 2个字节 范围(-32768~32767)
mediumint(m) 3个字节 范围(-8388608~8388607)
int(m) 4个字节 范围(-2147483648~2147483647)
bigint(m) 8个字节 范围(+-9.22*10的18次方)

取值范围如果加了unsigned,则最大值翻倍,如tinyint unsigned的取值范围为(0~256)。

int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围。

(MySQL可以为整型类型指定宽度,例如Int(11),对绝大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命令行客户端)用来显示字符的个数。对于存储和计算来说,Int(1)和Int(20)是相同的。)

2、浮点型(float和double)

MySQL数据类型 含义
float(m,d) 单精度浮点型 8位精度(4字节) m总个数,d小数位
double(m,d) 双精度浮点型 16位精度(8字节) m总个数,d小数位

设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。

3、定点数

浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。

decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。

MySQL5.0和更高版本将数字打包保存到一个二进制字符串中(每4个直接存9个数字)。例如,decimal(18,9)小数点两边将各存储9个数字,一共使用9个字节:小数点前的数字用4个字节,小数点后的数字用4个字节,小数点本身占1个字节。

浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储。double占用8个字节。

因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal——例如存储财务数据。但在数据量比较大的时候,可以考虑使用bigint代替decimal。

4、字符串(char,varchar,_text)

MySQL数据类型 含义
char(n) 固定长度,最多255个字符
varchar(n) 固定长度,最多65535个字符
tinytext 可变长度,最多255个字符
text 可变长度,最多65535个字符
mediumtext 可变长度,最多2的24次方-1个字符
longtext 可变长度,最多2的32次方-1个字符

char和varchar:

1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。

2.char(n) 固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n< n>255),所以varchar(4),存入3个字符将占用4个字节。

3.char类型的字符串检索速度要比varchar类型的快。

varchar和text:

1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n< n>255),text是实际字符数+2个字节。

2.text类型不能有默认值。

3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。

5.二进制数据(_Blob)

1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。

2._BLOB存储的数据只能整体读出。

3._TEXT可以指定字符集,_BLO不用指定字符集。

6.日期时间类型

MySQL数据类型 含义
date 日期 ‘2008-12-2‘
time 时间 ‘12:25:36‘
datetime 日期时间 ‘2008-12-2 22:06:44‘
timestamp 自动存储记录修改时间

若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。

数据类型的属性

MySQL关键字 含义
NULL 数据列可包含NULL值
NOT NULL 数据列不允许包含NULL值
DEFAULT 默认值
PRIMARY KEY 主键
AUTO_INCREMENT 自动递增,适用于整数类型
UNSIGNED 无符号
CHARACTER SET name
指定一个字符集

其中的长度以字节为单位

各项数据类型的长度比较


名称


长度


用法


TINYINT(M)

BIT,BOOL,BOOLEAN


1


如果为无符号数,可以存储从0到255的数;

否则可以存储从-128到127的数。


SMALLINT(M)


2


如果为无符号数,可以存储从0到65535的数;

否则可以存储从-32768到32767的数。


MEDIUMINT(M)


3


如果为无符号数,可以存储从0到16777215的数;否则可以存储从-8388608到8388607的数


INT(M)

INTEGER(M)


4


如果为无符号数,可以存储从0到4294967295的数,否则可以存储从-2147483648到2147483647的数。


BIGINT(M)


8


如果为无符号数,可以存储从0到18446744073709551615的数,否则可以存储从-9223372036854775808到9223372036854775807的数。


FLOAT(precision)


4或8


这里的precision是可以直达53的整数。如果precision<=24则转换为FLOAT,如果precision>24并且precision<=53则转换为DOUBLE。


FLOAT(M,D)


4


单精度浮点数。


DOUBLE(M,D),

DOUBLE PRECISION,

REAL


8


双精度浮点。


DECIMAL(M,D),

DEC,NUMERIC,FIXED


M+1或M+2


未打包的浮点数。


DATE


3


以YYYY-MM-DD的格式显示。


DATETIME

HH:MM:SS


8


以YYYY-MM-DD的格式显示。


TIMESTAMP


4


以YYYY-MM-DD的格式显示。


TIME


3


以HH:MM:SS的格式显示。


YEAR


1


以YYYY的格式显示。


CHAR(M)


M


定长字符串。


VARCHAR(M)


最大M


变长字符串。M<=255.


TINYBLOB,

TINYTEXT


最大255


TINYBLOB为大小写敏感,而TINYTEXT不是大小写敏感的。


BLOB,

TEXT


最大64K


BLOB为大小敏感的,而TEXT不是大小写敏感的。


MEDIUMBLOB,

MEDIUMTEXT


最大16M


MEDIUMBLOB为大小写敏感的,而MEDIUMTEXT不是大小敏感的。


LONGBLOB,

LONGTEXT


最大4G


LONGBLOB为大小敏感的,而LONGTEXT不是大小敏感的。


ENUM(VALUE1,….)


1或2


最大可达65535个不同的值。


SET(VALUE1,….)


可达8


最大可达64个不同的值。
时间: 2024-10-10 04:35:04

MySQL详解(1)----------数据类型的相关文章

Linux下彻底卸载mysql详解

Linux下彻底卸载mysql详解 一.使用以下命令查看当前安装mysql情况,查找以前是否装有mysql 1 rpm -qa|grep -i mysql 可以看到如下图的所示: 显示之前安装了: MySQL-client-5.5.25a-1.rhel5 MySQL-server-5.5.25a-1.rhel5 2.停止mysql服务.删除之前安装的mysql 删除命令:rpm -e –nodeps 包名 1 2 rpm -ev MySQL-client-5.5.25a-1.rhel5  rpm

linux上源码安装MySQL详解

最近需要使用MySQL Fabric,这货是MySQL5.6.10之后才出现的utility.手头机器装的是MySQL5.1,所以需要先把旧版MySQL升级成5.6版本.之前没有玩过MySQL,所以这次稍微费了点事.在此,把过程记录下来,希望能给有需求的人提供一点帮助.下面我们就正式开始. 1. 删除老版本MySQL 其实删除老版MySQL是一件很简单的事,但是开始时候由于担心各个包的依赖会导致各种问题,亦步亦趋来得很慢.其实只需要做到这么几步就可以了: 1.1 查看已安装的mysql版本并删除

Ubuntu 16.04下安装MySQL详解

Ubuntu 16.04下安装MySQL详解分别依次输入以下3个命令: sudo apt-get install mysql-server sudo apt install mysql-client sudo apt install libmysqlclient-dev 安装成功后可以通过下面的命令测试是否安装成功: sudo netstat -tap | grep mysql 出现如下信息证明安装成功: >>> sudo netstat -tap | grep mysql tcp 0

MySql 详解

MySql数据库基础 MySQL各大存储引擎 MySql常用字符集 MySql支持的数据类型 MySql 枚举和集合 详解 MySql 约束条件 MySql 表操作 MySql 多表关系 MySql 范式 MySql 单表查询 MySql 多表查询 MySQL权限详解 Mysql 三大特性详解 原文地址:https://www.cnblogs.com/TMesh-python/p/11731303.html

mysql详解安装

三种安装方式 1 二进制  解压就用 2 YUM/RPM   适用于很多台服务器安装,编译好后,做成RPM包 适用于yum仓库 3 编译安装     自定安装,相当于自己DIY了...5.1安装用make,5.5安装要用cmake 安装二进制详解演示!! 显示系统名.节点名称.操作系统的发行版号.操作系统版本.运行系统的机器 ID 号. [[email protected] ~]# uname -aLinux sky-mysql 2.6.32-573.el6.x86_64 #1 SMP Thu

MySQL详解--锁

来源:http://blog.csdn.net/xifeijian/article/details/20313977#t4 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制的特点,常见的锁

转摘: MySQL详解--锁

原文 http://blog.csdn.net/xifeijian/article/details/20313977 InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题. 背景知识 1.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性

MySQL详解(2)----------存储引擎

存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能. 例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎.内存存储引擎能够在内存中存储所有的表格数据.又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力). 这 些不同的技术以及配套的相关功能在MySQL中被称

转MySQL详解--索引

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tree索引,则只需要进行log100(