2Python全栈之路系列之MysQl基本数据类型

简介:

Python全栈之路系列之MySQL基本数据类型


MySQL中定义数据字段的类型对你数据库的优化是非常重要的。

MySQL支持多种类型,大致可以分为三类:

  1. 数字类型

  2. 日期和时间类型

  3. 字符串类型


数字类型

类型 大小 用途
BIT - 二进制
TINYINT 1字节 小整数值
INT or INTEGER 4字节 大整数值
BIGINT 8字节 极大整数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值
FLOAT 4字节 单精度浮点数值
DOUBLE 8字节 双精度浮点数值
BOOL, BOOLEAN - 布尔值
  • BIT[(M)]

二进制位(101001),m表示二进制位的长度(1-64),默认m=1

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]

小整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-128 to 127 0 to 255

特别的: MySQL中无布尔值,使用tinyint(1)构造。

  • INT[(M)] [UNSIGNED] [ZEROFILL]

整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-2147483648 to 2147483647 0 to 4294967295

整数类型中的m仅用于显示,对存储范围无限制。例如: int(5),当插入数据2时,select时数据显示为:00002

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]

大整数,数据类型用于保存一些范围的整数数值范围:

范围(有符号) 范围(无符号)
-9223372036854775808 to 9223372036854775807 0 to 18446744073709551615
  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。

特别的:对于精确数值计算时需要用此类型decaimal能够存储精确值的原因在于其内部按照字符串存储。

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

  • 无符号:
    -3.402823466E+38 to -1.175494351E-38,
    0
    1.175494351E-38 to 3.402823466E+38

  • 有符号:
    0
    1.175494351E-38 to 3.402823466E+38

数值越大,越不准确

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。

  • 无符号:
    -1.7976931348623157E+308 to -2.2250738585072014E-308
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308

  • 有符号:
    0
    2.2250738585072014E-308 to 1.7976931348623157E+308

数值越大,越不准确

  • BOOL, BOOLEAN

这些类型是TINYINT的同义词。零值被认为是假的。非零值被认为是正确的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql>  SELECT  IF(0,  'true' 'false' );
+ ------------------------+
| IF(0,  'true' 'false' ) |
+ ------------------------+
false                   |
+ ------------------------+
1 row  in  set  (0.00 sec)
mysql>  SELECT  IF(1,  'true' 'false' );
+ ------------------------+
| IF(1,  'true' 'false' ) |
+ ------------------------+
true                    |
+ ------------------------+
1 row  in  set  (0.00 sec)
mysql>  SELECT  IF(2,  'true' 'false' );
+ ------------------------+
| IF(2,  'true' 'false' ) |
+ ------------------------+
true                    |
+ ------------------------+
1 row  in  set  (0.00 sec)

然而,真假的值仅仅是为了分别为1和0,别名,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql> SELECT IF( 0  =  FALSE,  'true' 'false' );
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| IF( 0  =  FALSE,  'true' 'false' ) |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| true                           |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1  row  in  set  ( 0.01  sec)
mysql> SELECT IF( 1  =  TRUE,  'true' 'false' );
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| IF( 1  =  TRUE,  'true' 'false' ) |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| true                          |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1  row  in  set  ( 0.00  sec)
mysql> SELECT IF( 2  =  TRUE,  'true' 'false' );
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| IF( 2  =  TRUE,  'true' 'false' ) |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| false                         |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1  row  in  set  ( 0.00  sec)
mysql> SELECT IF( 2  =  FALSE,  'true' 'false' );
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| IF( 2  =  FALSE,  'true' 'false' ) |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| false                          |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
1  row  in  set  ( 0.00  sec)

时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

类型 大小(字节) 格式 用途
DATE 3 YYYY-MM-DD 日期值
DATETIME 8 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP 8 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
TIME 3 HH:MM:SS 时间值或持续时间
YEAR 1 YYYY 年份值
类型 范围
DATE '1000-01-01' to '9999-12-31'
DATETIME '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'
TIMESTAMP '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999'
TIME '-838:59:59.000000' to '838:59:59.000000'
YEAR 1901 to 2155

字符串类型

类型 大小(字节) 用途
CHAR(M) 0 to 255 固定长度的字符串,即使数据小于M长度,也会占用M长度
VARCHAR(M) 0 to 65535 一个可变长度的字符串,M表示在字符的最大列长度
TEXT[(M)] 0 to 65535 长文本列
MEDIUMTEXT 0 to 16777215 中等长度文本列
LONGTEXT 4294967295 or 4GB 极大文本列
ENUM('value1','value2',...)
枚举类型
SET('value1','value2',...)
集合类型
  • VARCHAR(M)注

虽然VARCHAR(M)使用起来较为灵活,但是从整个系统的性能角度来说,CHAR(M)数据类型的处理速度更快,有时甚至可以超出VARCHAR(M)处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡

  • ENUM('value1','value2',...)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE  TABLE  shirts (
     name  VARCHAR (40),
     size  ENUM( 'x-small' 'small' 'medium' 'large' 'x-large' )
);
 
INSERT  INTO  shirts ( name size VALUES  ( 'dress shirt' , 'large' ), ( 't-shirt' , 'medium' ),
   ( 'polo shirt' , 'small' );
   
mysql>  SELECT  name size  FROM  shirts  WHERE  size  'medium' ;
+ ---------+--------+
name     size    |
+ ---------+--------+
| t-shirt | medium |
+ ---------+--------+
1 row  in  set  (0.00 sec)
 
UPDATE  shirts  SET  size  'small'  WHERE  size  'large' ;
COMMIT ;
  • SET('value1','value2',...)

SET是一个字符串对象,它可以有0更多个值,每个值均必须选自一个允许值列表中,该列表在表创建时被指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql>  CREATE  TABLE  myset (col  SET ( 'a' 'b' 'c' 'd' ));
Query OK, 0  rows  affected (0.01 sec)
 
mysql>  INSERT  INTO  myset (col)  VALUES  ( 'a,d' ), ( 'd,a' ), ( 'a,d,a' ), ( 'a,d,d' ), ( 'd,a,d' );
Query OK, 5  rows  affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql>  SELECT  col  FROM  myset;
+ ------+
| col  |
+ ------+
| a,d  |
| a,d  |
| a,d  |
| a,d  |
| a,d  |
+ ------+
rows  in  set  (0.00 sec)









本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1925859,如需转载请自行联系原作者
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
836 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
665 1
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
976 45
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
1438 15
|
SQL 关系型数据库 MySQL
Python中使用MySQL模糊查询的方法
本文介绍了两种使用Python进行MySQL模糊查询的方法:一是使用`pymysql`库,二是使用`mysql-connector-python`库。通过这两种方法,可以连接MySQL数据库并执行模糊查询。具体步骤包括安装库、配置数据库连接参数、编写SQL查询语句以及处理查询结果。文中详细展示了代码示例,并提供了注意事项,如替换数据库连接信息、正确使用通配符和关闭数据库连接等。确保在实际应用中注意SQL注入风险,使用参数化查询以保障安全性。
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
560 2
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
275 5
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
305 1
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
408 4
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
233 3

推荐镜像

更多