MySQL常用数据类型 length 专题

MySQL-data_type数据类型

1、查看数据类型

mysql> help data type    //通过help对数据进行查看,以及使用的方法

2、MySQL常见的数据类型

整数int定点小数dec浮点数float字符串varchar时间-时区布尔bool

前言========================================

在MySQL数据库中,进行数据存储时,难免会出现数据类型转换,其中就包括:隐式类型转换、显示类型转换

1、隐式类型转换:有害、无害

①对于新建表列

  数字:int、decimal

  字符串:varchar

  日期:date

②查select、增insert时,对于常量

  数字:不要加引号(非一定)

  字符串:一定要加上引号

  日期:可以加上引号,也可以不加---最好是加上

2、显式类型转换:调用cast函数

格式:

  cast(expr as type)

  ---将任意类型的表达式expr转换成指定类型type的值

mysql> select cast(19950101 as date);
+------------------------+
| cast(19950101 as date) |
+------------------------+
| 1995-01-01             |
+------------------------+

常见的类型转换:

  字符串char--->数字、日期

  数字--->字符串、日期

  日期date--->数字、字符串

===========================================

常用的数据类型:

一、整数:

  每个整型类型可以指定一个最小显示宽度(注意:这个宽度并不表示存储的值有多大)

tinyint
从 -2^7 (-128) 到 2^7 - 1 (123) 的整型数据。存储大小为 1 个字节。
unsigned 是从 0 到 255 的整型数据。
所以建表的时候 只能是tinyint(3),哪怕你建tinyint(100),他最大还是3位这么多。

smallint
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。
unsigned 是从 0 到 65535 的整型数据。
所以建表的时候 只能是smallint(5),哪怕你建smallint(100),他最大还是5位这么多。

int
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字).存储大小为 4 个字节。
unsigned 是从 0 到 4294967296 的整型数据。
所以建表的时候 只能是int(10),哪怕你建int(100),他最大还是10位这么多。

bigint
从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整型数据(所有数字)。存储大小为 8 个字节。
unsigned 是(自己算吧)
所以建表的时候 只能是bigint(20),哪怕你建bigint(100),他最大还是20位这么多。

基本格式:

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

①M:指定显示宽度(默认是M=10),以实际的取值范围为准,值超过显示宽度,显示宽度自动增加 【小结一下,如果设置ZEROFILL,则会按照设置的length来补0,如果超过设置的length,则不需要补0】

②unsigned:无符号的,表示只允许正数,所以取值范围取绝对值且最大值*2

    (例:int unsigned range is 0 to 4294967295)

③zerofill: 填充0(如果声明了zerofill,该列会自动设为unsigned)

影响数字的显示方式:

  如果一个数字的宽度小于所允许的最大宽度,这个值前面会用0填充

  如果宽度大于所允许的最大宽度但不超过取值范围,以实际的取值范围为准,不填0;超出取值范围的报错不存储【MariaDB中超出后,数据会异常,但insert不会报错】

示例:

MariaDB [test]> CREATE TABLE `t1` (  `id` int(9) unsigned zerofill DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.02 sec)

MariaDB [test]>
MariaDB [test]>
MariaDB [test]> insert into t1 values(1.123);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(123);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(12300);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> insert into t1 values(1234567890);
Query OK, 1 row affected (0.00 sec)

MariaDB [test]>
MariaDB [test]> select * from t1;
+------------+
| id         |
+------------+
|  000000001 |
|  000000123 |
|  000012300 |
| 1234567890 |
+------------+
4 rows in set (0.00 sec)

MariaDB [test]> insert into t1 values(12345678901);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> insert into t1 values(-1);
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test]> select * from t1;
+------------+
| id         |
+------------+
|  000000001 |
|  000000123 |
|  000012300 |
| 1234567890 |
| 4294967295 |
|  000000000 |
+------------+
6 rows in set (0.00 sec)

MariaDB [test]>

mysql> create table t1(id int zerofill);  #默认显示宽度10
mysql> insert into t1 values(-1);  #取值范围:0--4294967295
ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
mysql> insert into t1 values(123);
mysql> insert into t1 values(12300);
mysql> insert into t1 values(1.123);

mysql> select * from t1;
+------------+
| id         |
+------------+
| 0000000123 |
| 0000012300 |
| 0123456789 |
| 0000000001 |
+------------+

解析:因为建表的设置是int整数,小数点后的数会四舍五入

二、(定点)小数:  decimal(dec)精确小数类型---精确数的存储

  同义词:decimal=dec=numeric=fixed

基本格式:

  DEC[(M[,D])] [UNSIGNED] [ZEROFILL]

①M:精度,(整数位数+小数位数)不包含小数点的数字总位数(1--30),不指定默认为10

②D:小数位数,如果不指定,默认为0

  若位数不够,小数末尾补零;若位数超预算(整数位数=M-D),报错。

示例:

mysql> create table t2(id dec(5,3) unsigned);
##数字总位数5
##整数位数5-3=2(不够没关系;超出报错)
##小数位数3(不够补零;超出四舍五入)

mysql> insert into t2 values(12.345);
mysql> insert into t2 values(1.23);
mysql> insert into t2 values(123);
ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
mysql> insert into t2 values(12.3456);
mysql> select * from t2;
+--------+
| id     |
+--------+
| 12.345 |
|  1.230 |
| 12.346 |
+--------+

dec的小数位数是个定数;

三、浮点数:  float/double单精度、双精度浮点类型

基本格式:

  float[(length) | (<display width>,<scale>)]

  double[(precision) | (<display width>,<scale>)]

两者区别在于值所保留的存储空间数量不同

注意:

  由于对一个浮点数字来说,可用的存储空间有限,如果一个数字非常大或非常小,将存储这个数字的近似值而不是实际值。

①使用一个参数来指定浮点类型

length(precision):在一个浮点数据类型中可以指定长度,来确定具体的浮点类型

  0~24:单精度float,从第7位有效位,进行四舍五入存储

  25~30:双精度double,从第16位有效位,进行四舍五入存储

mysql> create table t3(id float(8));

  //m=8,说明是单精度,存储6位的近似值(第7位四舍五入,后面为0)

mysql> insert into t3 values(123);
mysql> insert into t3 values(1234567);
mysql> insert into t3 values(123456789);
mysql> insert into t3 values(123456789.123456789);

mysql> select * from t3;
+-----------+
| id        |
+-----------+
| 123       |
| 1234570   |
| 123457000 |
| 123457000 |
+-----------+

②使用两个参数来指定浮点类型

  单精度float(m,d):m表示精度(0~24),d表示小数位数

  双精度double(m,d):m表示精度(25~30),d表示小数位数

具有宽度和小数位数的float的同义词:real和float4;指定double=float(30)

示例:设一个字段定义为float(5,3)---单精度浮点,精度5,小数位3(和dec一样)

mysql> create table t_3(id float(5,3) unsigned);
##数字总位数5
##整数位数5-3=2(不够没关系;超出报错)
##小数位数3(不够补零;超出四舍五入)

mysql> insert into t_3 values(123);
ERROR 1264 (22003): Out of range value for column ‘id‘ at row 1
mysql> insert into t_3 values(12.3);
mysql> insert into t_3 values(12.3456);
mysql> insert into t_3 values(1.23456);

mysql> select * from t_3;
+--------+
| id     |
+--------+
| 12.300 |
| 12.346 |
| 1.235  |
+--------+

float的小数位数不是固定的;

超出存储范围,近似值进行存储。

四、字符串:  varchar可变长字符串类型

  1.char(n):固定长度,最多255个字符

  2.varchar(n):固定长度,最多65535个字符

  3.tinytext:可变长度,最多255个字符

  4.text:可变长度,最多65535个字符

  5.mediumtext:可变长度,最多2的24次方-1个字符

  6.longtext:可变长度,最多2的32次方-1个字符

示例:

mysql> create table t4(name varchar(21));
mysql> insert into t4 values(123);
mysql> insert into t4 values(xiaoming);
ERROR 1054 (42S22): Unknown column ‘xiaoming‘ in ‘field list‘  #字符串要用引号引起来
mysql> insert into t4 values(‘xiaoming‘);
mysql> insert into t4 values(‘zhang‘san‘);
    ‘> ^C
!!!字符串中的单引号用单引号进行转义
mysql> insert into t4 values(‘zhang‘‘san‘);

mysql> select * from t4;
+-----------+
| name      |
+-----------+
| 123       |
| xiaoming  |
| zhang‘san |
+-----------+

若要存储中文字符串,需要进行字符设置

create table tableName(列名 varchar(20) character set utf8);

create table tableName(列名 varchar(20) character set gpk);

1、char和varchar的区别:

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

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

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

2、varchar和text的区别:

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

  ②text类型不能有默认值。

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

五、日期时间时区

  date:日期 ‘2008-12-02‘

  time:时间 ‘12:25:36‘

  datetime:日期时间 ‘2008-12-12 22:06:44‘

  timestamp:自动存储记录修改时间(如果数据库里面有timestamp数据类型,就应该考虑时区问题)

示例:

mysql> create table t5(d1 date);
mysql> insert into t5 values(19901101);  #推荐的正统写法
mysql> insert into t5 values(901101);
mysql> insert into t5 values(1990111);  #有问题的写法

mysql> select * from t5;
+------------+
| d1         |
+------------+
| 1990-11-01 |
| 1990-11-01 |
| 0199-01-11 |
+------------+

1、获得当前日期时间的函数

①获得当前日期+时间(date+time)函数:now()、sysdate()

区别:now()在执行开始时值就得到了,sysdate()在函数执行时动态得到值

②获得当前日期curdate()、获得当前时间curtime()

mysql> select curdate(),curtime();
+------------+-----------+
| curdate()  | curtime() |
+------------+-----------+
| 2017-03-21 | 11:00:25  |
+------------+-----------+ 

========================================

1)日期字符串转换函数format:

  date_format(date,format)

---将日期date按照给定的模式format转换成字符串

  time_format(time,format)

---将时间time按照给定的模式format转换成字符串,format中只可以使用时、分、秒、微秒模式元素

format中可使用的模式元素可查官方文档

2)日期字符串转换函数

  str_to_date(str,format)

---将字符串str以指定的模式format转换成日期

mysql> select str_to_date(‘01,5,2013‘,‘%d,%m,%Y‘);

mysql> select str_to_date(‘May 1, 2013‘,‘%M %d,%Y‘);

如果在会话变量@@sql_mode设置中包含no_zero_date和no_zero_in_date时,上述转换将会失败,没有包含这些设置时则转换成功。

========================================

③获得当前 UTC 日期时间函数:utc_date(), utc_time(), utc_timestamp()

2、MySQL时区问题:重点!!!

  注意:当数据库里面有timestamp数据类型的列,就应该考虑时区参数

问:如何判断是否有timestamp数据类型的列?

答:

mysql> select table_name,column_name,data_type

  -> from information_schema.columns

  -> where

  -> data_type=‘timestamp‘;

  ……

  MySQL是安装在Linux操作系统下面,因此MySQL时区跟Linux的时区有很多关联的地方,MySQL里有一个时区叫做系统时区,MySQL系统时区的存在是为MySQL安装后读取Linux操作系统的时区,将自己的系统时区设置为与Linux操作系统一致 的时区:

mysql> show variables like "system_time%";    #查看系统时区

+------------------+-------+

| Variable_name    | Value |

+------------------+-------+

| system_time_zone | CST   |

+------------------+-------+ 

Linux 操作系统的时区(有很多选择)与 mysql 中的系统时区是一致的:

  Linux操作系统的时区

    shell> cat /etc/sysconfig/clock

  区域信息目录:/usr/share/zoneinfo

系统时区的选择对后续 mysql 的操作影响不大,但是,MySQL中的time_zone的全局时区,会对我们的MySQL产生影响:

mysql> show variables like "time_zone%";  #查看数据库时区

+------------------+--------+

| Variable_name    | Value  |

+------------------+--------+

| time_zone        | SYSTEM |

+------------------+--------+

问:为什么说time_zone正确与否会对MySQL产生影响?(也就是timestamp列的工作过程)

答:

  ①当有timestamp列是,一个会话连接上来,这个会话默认的时区就等于time_zone的时区,当然会话时区也可以被修改。

  ②往timestamp列里存数据的时候,mysql会先查询存数据的会话所在的时区,mysql把会话对应的时区与存储的时间结合换算出时间所对应的0时区,再把这个时间存储到timestamp列中,所以timestamp列存储都是相对于0时区的时间。

  ③当用户查询数据的时候,mysql会将timestamp列中相对应于0时区的数据转换成会话对应的时区,反应给用户。

  ④当会话对应的时区与存储时间的时区不对应时,存储的时间仍然会被转换为0时区对应的时间进行存储,那么这时我们存储的时间就是错误的,所以我们必须保证会话时区与存储时间的时区一致。

mysql> select @@global.time_zone;    #查看全局时区

mysql> select @@session.time_zone;    #查看会话时区(默认等于全局时区)

1.临时设置时区(全局):

①‘+8:00‘格式

  mysql> set @@global.time_zone=‘+8:00‘;

②‘Asia/Shanghai‘格式

  mysql> set @@global.time_zone=‘Asia/Shanghai‘;

  ERROR 1298 (HY000): Unknown or incorrect time zone: ‘Asia/Shanghai‘

加载系统时区:

  shell> mysql_tzinfo_to_sql /usr/share/zoneinfo |mysql -uroot -p123 mysql

  mysql> set @@global.time_zone=‘Asia/Shanghai‘;

2.永久设置时区:

修改配置文件vim /etc/my.cnf

[mysqld]区域中添加default_time_zone=Asia/Shanghai

时区的正确实践(只有timestamp数据类型的才有意义):

  ①insert以前,你的values对应的时间到底是哪个时区,然后设置set @@session.time_zone为对应的时区

  ②select获取以前,你想得到什么时区的时间,就设置set @@session.time_zone为对应的时区。

示例:

会话1:当前会话

mysql> select @@global.time_zone;
+--------------------+
| @@global.time_zone |
+--------------------+
| +08:00             |
+--------------------+

mysql> create table t9(tm timestamp);

mysql> insert into t9 values(‘2017-3-22 10:10‘);

mysql> select * from t9;
+---------------------+
| tm                  |
+---------------------+
| 2017-03-22 10:10:00 |
+---------------------+

会话2:客户端登录会话(东10区用户)

设置会话时区

mysql> set @@session.time_zone=‘+10:00‘;

mysql> use test; select * from t9;
Database changed

+---------------------+
| tm                  |
+---------------------+
| 2017-03-22 12:10:00 |
+---------------------+ 

六、布尔bool或boolean=tinyint(1)

A value of zero is considered false,nonzero values are considered true.

示例:

mysql> create table t7(num bool);

mysql> insert into t7 values(true);
mysql> insert into t7 values(false);
mysql> insert into t7 values(123);
mysql> insert into t7 values(1);
mysql> insert into t7 values(0);
mysql> insert into t7 values(128);    #范围在-128~127
ERROR 1264 (22003): Out of range value for column ‘num‘ at row 1

mysql> select * from t7;
+------+
| num  |
+------+
|    1 |
|    0 |
|  123 |
|    1 |
|    0 |
+------+

七、位

位主要是用来存放二进制数,select查询默认显示10进制,可以使用bin()、hex()函数来进行查询

bin()---显示二进制格式

hex()---显示十六进制格式

示例:

mysql> create table t7(id bit(4));

mysql> insert into t7 values(2);
mysql> insert into t7 values(13);

mysql> select bin(id),hex(id) from t7;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 10      | 2       |
| 1101    | D       |
+---------+---------+ 

原文地址:https://www.cnblogs.com/softidea/p/12043608.html

时间: 2024-11-04 18:01:23

MySQL常用数据类型 length 专题的相关文章

Mysql常用数据类型归纳总结1

一直在用Mysql数据库,Mysql的数据类型也最常打交道的.但关于Mysql的一些常用数据类型了解程度仅限于一知半解,仅仅能满足满足于平时一些最简单的操作.而Mysql常用数据类型的定义以及规范理解的并不是特别的透彻,自己对于这些东西的理解有许多也是出于想当然,经不起推敲和较真.故有此文,帮助自己总结归纳,并加深理解. 整数型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 小数型:FLOAT, DOUBLE, DOUBLE, DECIMAL, REAL 字

mysql常用数据类型

本文对常用的mysql数据类型和java数据类型进行对比. 类型对照简表: java类型 mysql类型 默认值 备注 mybatis的JdbcType String varchar null 一般的字符串都够用 jdbcType="VARCHAR" Integer  int null 4字节 jdbcType="INTEGER" Long  bigint null 8字节 jdbcType="BIGINT" BigDecimal  decima

Mysql 常用数据类型

double:浮点型,double(5,2) 表示最多5位,必须包含两位小数,最大值是 999.99 char:定长字符串类型,char(10) 表示必须放 10 的字节,没有就用空格补充 varchar:变长字符串类型,varchar(10),最多10个字节,如果不足10个,就自动改变长度 text:字符串类型,用于放比较多的文本 blob:二进制数据(声音.图片.视屏等),一般不会直接放入数据库,放很小的图片 date:日期类型,格式为:yyyy-MM-dd time:时间类型,格式为:hh

百万年薪python之路 -- MySQL数据库之 常用数据类型

MySQL常用数据类型 一. 常用数据类型概览 # 1. 数字: 整型: tinyint int bigint 小数: float: 在位数比较短的情况下不精确 double: 在位数比较长的情况下不精确 0.000001230123123123 存成: 0.000001230000 decimal: (如果用小数,则推荐使用decimal) 精准 内部原理是以字符串形式去存 # 2. 字符串: char(10): 简单粗暴,浪费空间,存取速度快. root存成root000000 varcha

MySQL基础数据类型

一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql常用数据类型概览: #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的情况下不精准 doub

【MySQL】数据类型之数字相关

" 目录 #. 数值类型 1. 数值范围验证 /. 有符号 /. 无符号 2. int类型显示长度验证 #. 浮点型 1. 验证 /. 建表 /. 精度 #. 日期类型 1. 验证 /. year /. date.time.datatime /. timetamp /. datetime 与 timestamp 区别 /. 注意事项 详见链接 MySQL常用数据类型概括: 1. 数字:整型:tinyint int bigint小数: float: 在位数比较短的情况下不精确 double:在位数

MySQL常用的数据类型及函数_20160920

1.常用数据类型 针对创建数据表时候 需要指定字段的数据类型,我整理的是工作常用的几种  可以参考看下数据类型 http://www.w3school.com.cn/sql/sql_datatypes.asp 2.函数处理 2.1 对文本(字符串)的处理 工作中我们经常需要用到对字符串的处理,取字段的某一部分/拼接/替换/字段长度等等 MySQL中内置许多函数支持这些操作. 下面sql代码是工作中用到,整理出来,可以直接在sqlyog中测试 SELECT INSTR("abc",&qu

MySql基础知识、存储引擎与常用数据类型

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主要讲解了数据库的一些基础知识,介绍了MySql的存储引擎,最后讲了MySql常用的数据类型 1.基础知识 1.1.数据库概述 简单地说:数据库(Database或DB)是存储.管理数据的容器: 严格地说:数据库是"按照某种数据结构对数据进行组织.存储和管理的容器". 总结:数据永远是数据库的核心. 1.2.关系数据库管理系统 通过"数据库管理系统",数据

Mysql的常用数据类型以及用途总结

数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.在实际编程中,选择列的基本类型的时候,基本原则就是选择可以满足数据的最小类型. ① 字符串数据类型:分别为定长串和不定长串. 一. 定长串结束长度固定的字符,其长度是创建表是指定的,不允许多于指定的字符数据,它们分配的存储空间与指定的一样多,CHAR属于定长串类型. 二. 变长串存储长度可变的文本,有些变长数据类型具有最大的定长,而有些则是完全变长的,不管哪种只有指定的数据得到保存(不会添加额外的空格保存),TEXT属于变长串类