MySQL数据类型和运算符
mysql支持多种数据类型,主要有下面三种:
- 数值数据类型
- 日期/时间类型
- 字符串类型
整数类型
不同数据类型有不同的取值范围,可存储的值的范围越大,则所需的存储空间也越大。
整数类型主要有:
tinyint,smallint,mediumint,int(integer),bigint
整数类型的属性可以添加auto_increment自增约束条件。
类型名称 | 说明 | 存储需求 | 有符号数 | 无符号数 |
tinyint | 很小的整数 | 1个字节 | -129~127 | 0~255 |
smallint | 小的整数 | 2个字节 | -32768~32767 | 0~65535 |
mediumint | 中等大小的整数 | 3个字节 | -8388608~8388607 | 0~16777215 |
int(integer) | 普通大小的整数 | 4个字节 | -2147483648~2147483647 | 0~4294967295 |
bigint | 大整数 | 8个字节 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
示例:
1 create table tb_emp1 ( 2 id int(11), 3 name varchar(25), 4 deptId int(11), 5 salary float 6 );
id字段的数据类型为int(11),后面的数字11是该数据类型指定的显示宽度,是指定能够显示的数值中数字的个数。
显示宽度和数据类型的取值范围无关。显示宽度只是指明了mysql最大可能显示的数字个数。数值的位数小于指定的宽度则会由空格填充;
如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值仍可以插入。
如果不指定显示宽度,则系统会为每一种类型指定默认的宽度值。示例:
1 create table tmp1 ( 2 x tinyint, 3 y samllint, 4 z mediumint, 5 m int, 6 n bigint 7 );
1 desc tmp1;
系统添加的默认显示宽度可以保证取到取值范围内的所有值。
浮点数类型和定点数类型
类型名称 | 说明 | 存储需求 |
float | 单精度浮点数 | 4个字节 |
double | 双精度浮点数 | 8个字节 |
decimal(M,D), dec | 压缩的严格定点数 | M+2个字节 |
decimal不同于float和double,decimal是以串存放的,decimal可能的最大取值范围和double一样,但其有效的取值范围由M和D决定。
decimal的存储空间并不是固定的,而是由M决定的。不论是定点还是浮点类型,用户指定的精度超出精度范围,则会四舍五入进行处理。示例:
1 create table tmp2 ( 2 x float(5,1), 3 y double(5,1), 4 z decimal(5,1) 5 );
向其中插入数据
1 insert into table values (5.12, 5.15, 5.123);
会出现警告,float和double在四舍五入不会警告,但是decimal会。
show warnings;
float和double如果不指定精度,会按照实际的精度(由计算机硬件和操作系统共同决定),而decimal如不指定则默认为(10,0)。
mysql中,定点数是以字符串的形式存储,如果对精度的要求比较高,使用decimal比较好,另外两个浮点数在进行加减法和比较运算时也容易出问题。
使用浮点数要尽量避免做比较运算。
日期与时间类型
类型名称 | 日期格式 | 日期范围 | 存储需求 |
year | yyyy | 1901~2015 | 1字节 |
time | hh:mm:ss | -838:59:59~838:59:59 | 3字节 |
date | yyyy-mm-dd | 1000-01-01~9999-12-3 | 3字节 |
datetime | yyyy-mm-dd hh:mm:ss | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8字节 |
timestamp | yyyy-mm-dd hh:mm:ss | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4字节 |
year
year是一个用来表示年份的单字节类型。
以4位数字或者字符来表示,范围为'1901~2155',输入格式为'YYYY'或者YYYY。
如果只输入两位字符则会分别被转换,'00'~'69'转换为2000~2069,'70'~'99'被转换为1970~1999,'0'和'00'的转换相同。
超过了取值范围,均转换为2000,呵呵,超过了范围明明就error了。输入两位数字的或区别在于0。数字格式的0将变为0000,而字符则会转换为2000。
time
格式为'HH:MM:SS',需要3个字节,范围为-838:59:59~838:59:59,小时部分如此大是因为time不仅可以表示一天的时间,还可以是时间间隔。
如果没有冒号,则mysql觉得最右边两位是秒,不是当天的时间,而是过去了的时间。如果有冒号则肯定是一天中的时间。向表中插入系统时间:
1 insert into tmp4 values (current_time),(now());
date
仅需要日期,不需要小时和分秒,需要3个字节。
1 insert into tmp4 values (current_date),(now());
current_time只返回当前时间,current_date只返回当前日期,now()返回日期和时间值。
datetime
需要同时包含日期和时间信息,要8个字节
timestamp
timestamp显示的格式和datetime相同,显示宽度固定在19个字符,需要4个字节,取值范围比datetime要小。
timestamp的值是以世界标准时间存储的,存取时对当前时区进行转换。
set time_zone='+10:00'
向datetime或者timestamp分配date对象的值,则时间部分均为'00:00:00'
字符串类型
字符串类型除了可以储存字符串类型之外,还可以存储图片和声音的二进制数据。
字符串可以进行区分或者不区分大小写的比较,还可以模糊查找。
类型名称 | 说明 | 存储需求 |
char(M) | 固定长度非二进制字符串 | M字节,1<=M<=255 |
varchar(M) | 变长非二进制字符串 | L+1字节,在此L<=M和1<=M<=255 |
tinytext | 非常小的非二进制字符串 | L+1字节,L<2^8 |
text | 小的二进制字符串 | L+2字节,L<2^16 |
mediumtext | 中等大小的二进制字符串 | L+3字节,L<2^24 |
longtext | 大的二进制字符串 | L+4字节,L<2^32 |
enum | 枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目 |
set | 字符串对象可以有0个或者多个set成员 | 1,2,3,4或8,取决于集合成员的数量 |
varchar,blob和text类型为变长类型,其存储需求取决于列值的实际长度而不是取决于最大的可能取值。
char和varchar
char(M)为固定长度字符串,在定义时指定字符串列长,右侧的空格会被删除。
varchar的实际空间要看存的字符有多长,而且保留右侧多的空格。
1 select concat('(',ch,')'),concat('(',vch,')') from tmp8;
ch在保存'ab '时删除了最后的两个空格,而vch则会保留。
text
保存非二进制字符串,不会删除尾部空格
enum
enum是用来存储枚举值的,字段名 enum('值1', '值2', ... , '值n')
取值时只能在指定的枚举列表中取,而且一次只能取1个,如果创建的成员中有空格时,将自动的删除空格。
enum的值在内部用整数表示,每个枚举值均有一个索引值,从1开始编号,最多枚举65535个元素
enum('first', 'second', 'third')
值 | 索引 |
null | null |
'' | 0 |
first | 1 |
second | 2 |
third | 3 |
示例:
1 create table tmp9 (enm enum('first', 'second', 'third')); 2 insert into tmp9 values ('first'), ('second'), ('third'), (null); 3 select enm, enm+0 from tmp9;
目测不能插入'',enum列总有一个默认的值,如果将enum列声明为null,null则为该列的一个有效值,并且默认为null。
如果enum列被声明为not null,则默认值为列表的第一个元素。enum中的值都是以编号存在的。插入编号值和插入枚举值的效果是一样的。
set
set是一个字符串对象,可以有一个或者是多个值,最多有64个成员。
set('值1', '值2', ... , '值n')。如果set字段中列值又重复,则mysql会自动的删除重复的值
插入的set字段值顺序并不重要,存入时会按照定义的顺序显示;如果插入了不正确的值,将会报错。
转载于:https://www.cnblogs.com/tuhooo/p/5442722.html
MySQL数据类型和运算符相关推荐
- MYSQL数据库——mysql的数据类型和运算符
一.数据类型和运算符 数据库表是由多列字段构成,每一个字段都是表的一个属性,每一列都指定了不用的数据类型.指定了数据类型之后,也就决定了向字段内插入的数据的内容.例如,插入的是数字的时候,既可以将它们 ...
- double类型怎么取余_数据类型和运算符
数据类型和运算符 1.进制 1.1文件存储单位 任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来 . 一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成 ...
- 操作数数据类型 char 对于 sum 运算符无效。_数据类型和运算符
数据类型和运算符 1.进制 1.1文件存储单位 任何数据在计算机中都是以二进制的形式存在的,二进制早期由电信号开关演变而来 . 一个电信号或者一个二进制位统称为Bit位,8个Bit位为一组组成 ...
- 【JavaSE】02-变量、数据类型和运算符
二. 变量.数据类型和运算符 2.1 变量 2.1.1 变量的声明 type varName [=value][,varName[=value]...]; //[ ]中的内容为可选项,即可有可无 数据 ...
- java基础学习 --- 第二节 变量、数据类型和运算符
java基础学习 - 第二节 变量.数据类型和运算符 一.变量 1.变量就是会发生改变的数据,程序运行时,这些数据以变量的形式被保存到计算机的内存中.如图 2.使用变量的步骤: 声明变量 - ...
- JAVA学习脚印2: 数据类型和运算符
JAVA学习脚印2: 数据类型和运算符 本节将记录java中的数据类型和运算符. 1. java中的数据类型 java中变量的数据类型有两种:基本类型(primitive)和引用(reference) ...
- 《Java疯狂讲义》第3章(数据类型和运算符):博主李俊德的阅读笔记与知识拓展
一.问题背景 博主在准备应聘的笔试.面试时,再次采用了多年以来的Java工具书<Java疯狂讲义>,并决定在每章详细复习后都要在博客中写下详细的阅读笔记. 二.阅读笔记与知识拓展--< ...
- iOS开发基础-C语言数据类型和运算符
第2章 数据类型和运算符 2.1 注释 程序注释是源代码的一个重要部分,对于一份规范的程序源代码而言,注释应该占到源代码的1/3以上: 单行注释 //: 多行注释 /*注释开始和*/注释结束,需要指出 ...
- java异或运算结果数据类型_java中的数据类型和运算符的总结归类。
首先学习java肯定先要了解java的发展史,以及java的特点,常见的dos命令,jdk的安装,如何开发java程序等等一下概念行的东西,这里面我都不一一说了. 今天这一章主要想总结一下java中的 ...
最新文章
- 中文版证书_CIA考试多久后才可以领取证书?领取的方式是什么?
- http://www.cnblogs.com/amboyna/archive/2008/03/08/1096024.html
- ubuntu下编译安装PHP
- 花高价招来的阿里P8,我从他那里总结了8大硬核能力,4个经典案例,真香
- 参加第六届中国制造业MES应用年会
- mysql记录的增删改查、单表查询
- VGG19 基本网络结构图
- [NOIP2016 普及组 T1] 买铅笔
- 16款分形图像软件为你创造出惊人的艺术效果
- 心理学与生活 -人格与动机
- 360发起网民隐私保卫战
- 合肥工业大学计算机学院任恒,合肥工业大学计算机与信息学院导师教师师资介绍简介-△张玉红...
- XV6实验-Lab1 Syscalls
- ch376inc.h
- 筑梦品牌:推动品牌建设致力于打造好中国品牌
- android 7原生动态壁纸,手机里都是定制OS?谷歌Android 7.0原生系统壁纸邀你来尝鲜!...
- 2023年美国大学生数学建模竞赛(春季赛)
- Python __file__ 详解
- 网络线缆连接器和线槽
- 农行c语言笔试题,中国农业银行总行计算机类笔试面试经验