mysql系列之二数据类型和运算符

数据库表由多列字段构成,每一个字段指定了不同的数据类型。指定字段得数据类型之后,也就决定了向字段插入的数据内容,例如,当要插入数值的时候,可以将他们存储为整数类型,也可以将它们存储为字符串类型;不同的数据类型也决定了mysql在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算。

1、MySQL数据类型介绍

MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。

(1)数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT和浮点小数据类型FLOAT和DOUBLE、定点小数类型DECIMAL。

(2)日期/时间类型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。

(3)字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。

1.1、整数类型

数值型数据类型主要用来存储数字,MySQL提供了多种数值数据类型。不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也就越大。MySQL主要提供的整数类型有:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。

从表中可以看到,不同类型整数存储所需的字节数是不同的,暂用字节数最小的是TINYINT类型,占用字节最大的是BIGINT类型,相应的占用字节越多的类型所能表示的数值范围越大。

根据占用字节数可以求出每一种数据类型的取值范围,例如TINYINT需要1个字节(8 bits)来存储,那么TINYINT无符号数的最大值为2^8-1,即255;TINYINT有符号数的最大值为2^7-1,即127。其他类型的整数的取值范围计算方法相同。如下图所示:

# 例如:
[hellodb]> CREATE TABLE text1 (A TINYINT,B SMALLINT,C MEDIUMINT,D INT,E BIGINT);
Query OK, 0 rows affected (0.42 sec)

[hellodb]> DESC text1 ;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| A     | tinyint(4)   | YES  |     | NULL    |       |
| B     | smallint(6)  | YES  |     | NULL    |       |
| C     | mediumint(9) | YES  |     | NULL    |       |
| D     | int(11)      | YES  |     | NULL    |       |
| E     | bigint(20)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

可以看到,系统将添加不同默认显示宽度。这些显示宽度能够保证显示每一种数据类型可以取到取值范围内的所有值。例如TINYINT有符号数和无符号的数的取值范围分别为-128-127和0-255,由于负号占了一个数字位,因此TINYINT默认的显示宽度为4,同理,其他整数类型的默认显示宽度与其有符号数的最小值的宽度相同。

注意:显示宽度只用于显示,并不能限制取值范围和占用空间。如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型所允许的最大值。

不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此,应该根据实际需要选择最

合适的类型,这样有利于提高查询的效率和节省存储空间。整数类型是不带小数部分的数值,现实生活中很多地方都需要用到带小数的数值。

1.2、浮点数类型和定点数类型

MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型都可用(M,N)来表示,几种M称为精度,表示总共的位数:N称为标度,是表示小数的位数。具体参照下图:

DECIMAL类型不同于FLOAT和DOUBLE,DECIMAL实际是以串存放的,DECIMAL可能的最大取值范围与DOUBLE一样,但是其有效的取值范围有M和D的值决定。如果改变M而固定D,则其取值范围将随M的变大而变大,从上面图形可以看出,DECIMAL的存储空间并不是固定的,而由其精度值M决定,占用M+2个字节。

注意:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。

# 例如:
[hellodb]> CREATE TABLE text2 (A FLOAT(4,1),B DOUBLE(5,1),C DECIMAL(5,1));
Query OK, 0 rows affected (0.43 sec)

MariaDB [hellodb]> DESC text2;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| A     | float(4,1)   | YES  |     | NULL    |       |
| B     | double(5,1)  | YES  |     | NULL    |       |
| C     | decimal(5,1) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

[hellodb]> INSERT INTO text2 VALUES(5.12,5.15,5.123);
Query OK, 1 row affected, 1 warning (0.06 sec)  #有一个警告信息

[hellodb]> SHOW WARNINGS;   #查看警告信息
+-------+------+----------------------------------------+
| Level | Code | Message                                |
+-------+------+----------------------------------------+
| Note  | 1265 | Data truncated for column ‘C‘ at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)
#可以看到FLOAT和DOUBLE在进行四舍五入时没有给出警告,而给出C字段数值被截断的警告;

[hellodb]> SELECT * FROM text2;   #查看表信息
+------+------+------+
| A    | B    | C    |
+------+------+------+
|  5.1 |  5.2 |  5.1 |
+------+------+------+
1 row in set (0.01 sec)

# FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度,DECIMAL如不指定精度默认为(10,0)。

浮点数相对于定点数的有点是在长度一定的情况下,浮点数能够表示更大的数据范围:它的缺点是会引起精度问题。

在Mysql中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币,科学数据等)使用DECIMAL的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点型时需要注意,并尽量避免做浮点数比较。

1.3、日期时间类型

MySQL中有多种表示日期的数据类型,主要有:DATETIME、DATE、TIMESTAMP、TIME和YEAR。例如,当只记录年信息的时候,可以只使用YEAR类型,而没有必要使用DATE。每一种类型都有一个合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。日期与时间数据类型如下:

#例如:
1、YEAR
[hellodb]> CREATE TABLE text3(y YEAR);    #创建表text3
Query OK, 0 rows affected (0.40 sec)

[hellodb]> INSERT INTO text3 VALUES(2010),(‘2010‘),(‘2166‘);
Query OK, 3 rows affected, 1 warning (0.22 sec)
Records: 3  Duplicates: 0  Warnings: 1
#插入数据,MySQL给出了一条警告,用SHOW WARNINGS查看警告信息
[hellodb]> SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column ‘y‘ at row 3 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)
#可以看到2166超过了YEAR类型的取值范围,但是插入进去了
[hellodb]> SELECT * FROM text3;
+------+
| y    |
+------+
| 2010 |
| 2010 |
| 0000 |   #插入值超过取值范围,所以改为0000
+------+
3 rows in set (0.00 sec)

[hellodb]> DELETE FROM text3;
Query OK, 3 rows affected (0.03 sec)
#清空表内容
[hellodb]> INSERT INTO text3 VALUES(‘O‘),(‘00‘),(‘77‘),(‘10‘);
Query OK, 4 rows affected, 1 warning (0.03 sec)
Records: 4  Duplicates: 0  Warnings: 1
#插入两位字符串测试
[hellodb]> SELECT * FROM text3;
+------+
| y    |
+------+
| 0000 |
| 2000 |
| 1977 |
| 2010 |
+------+
4 rows in set (0.01 sec)

2、TIME
[hellodb]> CREATE TABLE text4(t TIME);
Query OK, 0 rows affected (0.19 sec)

[hellodb]> INSERT INTO text4 VALUES (‘10:05:05‘),(‘23:23‘),(‘2 10:10‘),(‘3 02‘),(‘10‘);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

[hellodb]> SELECT * FROM text4;
+----------+
| t        |
+----------+
| 10:05:05 |
| 23:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:01 |
+----------+
5 rows in set (0.00 sec)
#注:在使用‘D HH‘格式时,小时一定要使用双位数值,如果是小于10的小时数,应在其前面加0。

[hellodb]> DELETE FROM text4; #清空表内容
Query OK, 5 rows affected (0.02 sec)

[hellodb]> INSERT INTO text4 VALUES(CURRENT_TIME),(NOW());
Query OK, 2 rows affected, 1 warning (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 1
#插入当前时间

[hellodb]> SELECT * FROM text4;
+----------+
| t        |
+----------+
| 17:41:29 |
| 17:41:29 |
+----------+
2 rows in set (0.00 sec)
#注:超出TIME范围但合法的值会被转换为范围最接近的端点,无效的会转换成“00:00:00"。

3、DATE
[hellodb]> CREATE TABLE text5(d DATE);
Query OK, 0 rows affected (0.40 sec)

[hellodb]> INSERT INTO text5 VALUES(‘1998-09-09‘),(‘19980909‘),(‘20101010‘);
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

[hellodb]> SELECT * FROM text5;
+------------+
| d          |
+------------+
| 1998-09-09 |
| 1998-09-09 |
| 2010-10-10 |
+------------+
3 rows in set (0.00 sec)  #不同类型的日期值都正确的都可以插入到表中

[hellodb]> DELETE FROM text5;
Query OK, 3 rows affected (0.02 sec)

[hellodb]> INSERT INTO text5 VALUES(CURRENT_DATE()),(NOW());
Query OK, 2 rows affected, 1 warning (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 1
#插入当前日期
#CURRENT_DATE只返回当前日期值,不包括时间部分。
#NOW()函数返回日期和时间值,在保存到数据库时,只保留了其日期部分。

[hellodb]> SELECT * FROM text5;
+------------+
| d          |
+------------+
| 2016-03-07 |
| 2016-03-07 |
+------------+
2 rows in set (0.01 sec)
时间: 2024-10-23 04:15:04

mysql系列之二数据类型和运算符的相关文章

Java 第二章 变量 、数据类型和运算符 笔记

Java 第二章 变量 .数据类型和运算符 一.变量:存储数据的一个基本单元. 二.变量的声明和赋值: 1)声明并赋值:数据类型 变量名=值;      例:int  price=1000; 2)声明.赋值分两步:数据类型 变量名;   例: int  price; 变量名=值;              price=1000; 三.数据类型2种: 1)基本数据类型8种: Byte 长度:-128~127(-2的7次方到2的7次方减1) Short   -2的15次方到2的15次方减1 Int

java中的数据类型和运算符的总结归类。

首先学习java肯定先要了解java的发展史,以及java的特点,常见的dos命令,jdk的安装,如何开发java程序等等一下概念行的东西,这里面我都不一一说了. 今天这一章主要想总结一下java中的数据类型和运算符2大方面. 再说数据类型之前先说一下标识符的命名规则: 总的命名规则:见名知意.如果有多个单词组成,首单词小写,其余单词的首字母大写(驼峰命名法).1.首字母只能是字母,下划线和$2.其余字母可以字母,下划线,$和数字3.不能使用预留关键字4.严格区分大小写(总体来说和c语音一样)

第二章:数据类型和运算符

第二章:数据类型和运算符 计算机中的进制 **标识符 总的命名规则:见名知意.如果有多个单词组成,首单词小写,其余单词的首字母大写(驼峰命名法).1.首字母只能是字母,下划线和$2.其余字母可以字母,下划线,$和数字3.不能使用预留关键字4.严格区分大小写 数据类型*** 基本数据类型 整型 byte(1个字节) short(2个字节) int(4个字节) long(8个字节) 浮点型 float(4个字节) double(8个字节) 字符型 char(2个字节)采用Unicode码 布尔型 b

MySQL系列(二)

MySql 事务 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 什么是事务(transaction) 保证成批操作要么完全执行,要么完全不执行,维护数据的完整性.也就是要么成功要么失败. 事务可以是n条sql语句(n>=0) 不是所有数据库引擎支持事务,InnoDB引擎支持事务处理 事务四大特性 原子性(Atomic):事务的所有所有操作要么全部执行,要么全部不执行.如果中途出现错误不会停止,而是回滚到事务前的状态 一致性(Cons

第二章 变量,数据类型和运算符

第二章 &变量,数据类型和运算符 英文新识: double 双精度浮点 string  字符串 character  字母 integer  整数 Scanner  扫描仪 score  分数         name  名字     boolean  布尔   true  真          false  假 语法新知: double score =98.5; //声明双精度浮点型变量score存储分数 String name="张大侠";        //声明字符串型变

Java 数据类型和运算符

                                                  Java   数据类型和运算符 Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有:摇尾巴.叫.吃等. 类:类是一个模板,它描述一类对象的行为和状态. 方法:方法就是行为,一个类可以有很多方法.逻辑

2018-1-24 数据类型和运算符

有关于php数据类型和运算符的相关知识: 整体划分: 标量类型: int, float, string, bool 复合类型: array, object 特殊类型: null, resouce 整数类型:int integer 整数进制:十进制.八进制.十六进制 十进制转二进制:$v1 = decbin(123); 注意:参数必须是10进制数字,转换后的结果必然是二进制字符串. 十进制转八进制:$r1 =  decoct(十进制数字): 结果是一个8进制数字字符串. 十进制转十六进制:dech

MySQL 系列(二)Jdbc

MySQL 系列(二)Jdbc 一.Jdbc 基本操作 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; public class TestJdbc { @Test public void run1() throws Exception{ //1.注册驱动 Cl

四、MySQL的数据类型和运算符

4.1.MySQL数据类型介绍 MySQL支持多种数据类型,主要有数值类型.日期/时间类型和字符串类型. 数值数据类型: 包括整数类型   TINYINT.SMALLINT.MEDIUMINT.INT.BIFINT. 浮点小数据类型 FLOAT.DOUBLE 定点小数类型   DECIMAL 日期/时间类型: YEAR.TIME.DATE.DATETIME.TIMESTAMP 字符串类型: CHAR.VARCHAR.BINARY.VARBINARY.BLOB.TEXT.ENUM.SET 整数类