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

示例:

 create table tb_emp1 (
id int(11),
name varchar(25),
deptId int(11),
salary float
);

id字段的数据类型为int(11),后面的数字11是该数据类型指定的显示宽度,是指定能够显示的数值中数字的个数。

显示宽度和数据类型的取值范围无关。显示宽度只是指明了mysql最大可能显示的数字个数。数值的位数小于指定的宽度则会由空格填充;

如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值仍可以插入。

如果不指定显示宽度,则系统会为每一种类型指定默认的宽度值。示例:

 create table tmp1 (
x tinyint,
y samllint,
z mediumint,
m int,
n bigint
);
 desc tmp1;

系统添加的默认显示宽度可以保证取到取值范围内的所有值。

浮点数类型和定点数类型

类型名称 说明 存储需求
float 单精度浮点数 4个字节
double 双精度浮点数 8个字节
decimal(M,D), dec 压缩的严格定点数 M+2个字节

decimal不同于float和double,decimal是以串存放的,decimal可能的最大取值范围和double一样,但其有效的取值范围由M和D决定。

decimal的存储空间并不是固定的,而是由M决定的。不论是定点还是浮点类型,用户指定的精度超出精度范围,则会四舍五入进行处理。示例:

 create table tmp2 (
x float(5,1),
y double(5,1),
z decimal(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觉得最右边两位是秒,不是当天的时间,而是过去了的时间。如果有冒号则肯定是一天中的时间。向表中插入系统时间:

 insert into tmp4 values (current_time),(now());

date

仅需要日期,不需要小时和分秒,需要3个字节。

 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的实际空间要看存的字符有多长,而且保留右侧多的空格。

 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

示例:

 create table tmp9 (enm enum('first', 'second', 'third'));
insert into tmp9 values ('first'), ('second'), ('third'), (null);
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字段值顺序并不重要,存入时会按照定义的顺序显示;如果插入了不正确的值,将会报错。

MySQL数据类型和运算符的更多相关文章

  1. 第四章 MySQL数据类型和运算符

    5.1 MySQL数据类型介绍 一.数据类型简介 (1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容 (2) 不同的数据类型也决定了 My ...

  2. PostgreSQL自学笔记:5 数据类型和运算符

    5 数据类型和运算符 5.1 PostgreSQL 数据类型介绍 5.1.1 整数类型 整型类型 字节 取值范围 smallint 2字节 -2^15 ~ 2^15 int integer 4字节 - ...

  3. IOS开发新手教程(一)-数据类型和运算符

    OC语法入门(一) 数据类型和运算符 1.1凝视 凝视和其它语言一样,同意单行 ,多行凝视,一份规范的代码里面须要有一些正式的凝视,例如以下凝视: /* 这是多行 凝视 */ //这是多行凝视 OC语 ...

  4. Java 第二章 变量、数据类型和运算符

    第二章      变量.数据类型和运算符 什么是变量: 变量代表一块内存区域,变量类型不一样,这一块内存的大小也不一样. #在编程语言里面,你可以通过定义变量,向内存里添加数据或者修改内存已有的数据. ...

  5. Java1变量数据类型和运算符

    day02_变量数据类型和运算符   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class jh_01_数据类型说明 {     public  ...

  6. Java中的变量,数据类型和运算符

    变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...

  7. 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...

  8. MySQL基础之数据类型和运算符

    早些年学习MySQL的笔记,发在博客园上,以便后续回顾学习: 1. 数据类型为int(11),注意到后面的数字11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数.其他数据类型也可 ...

  9. 03 MySQL之数据类型和运算符

    01-数据类型 MySQL支持多种数据类型,主要有 数值类型.日期/时间类型和字符串类型. 1.1 整数类型 1.2 浮点数类型和定点数类型 单精度浮点类型(FLOAT)和双精度浮点类型 (DOUBL ...

随机推荐

  1. maven 错误处理

    如果是方法找不到或者返回参数变了,那么肯定是包被升级了,那么到仓库下把对应的包删掉,然后maven自动下载最新的. 如果是包找不到,或者类找不到,那么把maven ->update maven可 ...

  2. jquery api 常见 事件操作

    change.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  3. HDUOJ---1867 A + B for you again

    A + B for you again Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. 如何查看USB方式连接Android设备的外接设备信息

    1,USB存储设备(如:U盘,移动硬盘): //USB存储设备 插拔监听与 SD卡插拔监听一致. private USBBroadCastReceiver mBroadcastReceiver; In ...

  5. JAVA RMI远程方法调用简单实例[转]

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

  6. Java中堆内存和栈内存详解【转】

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  7. 从一个activity返回

    页面之间的跳转有startActivity 和startActivityForResult两种, 返回的话用finish方法,如下示例 MyActivity.this.finish();那你返回按钮使 ...

  8. JMeter学习笔记--JMeter属性和变量

    JMeter属性统一定义在jmeter.properties文件中.JMeter属性在测试脚本的任何地方都是可见的(全局),通常被用来定义一些JMeter使用的默认值.如属性remote_hosts定 ...

  9. extjs fileuploadfield default value

    网上有非常多fileupload的demo,最有用的还是官方doc里面的sample. 可是真实业务中.可能会用到改动功能.这个时候就须要在打开的时候,给input框赋初始值. How to give ...

  10. 使用用户自定义类型作为map的key

    有时候我们想把用户自定义类型作为std::map的键值.方法一)最简单的方法就是实现该自定义类型的<操作符,代码如下:class Foo{public:    Foo(int num_)     ...