精华内容
下载资源
问答
  • MySQL创建数据库和创建数据

    万次阅读 多人点赞 2019-10-20 23:44:40
    MySQL 是最常用的数据库,数据库操作,基本都是增删改查操作,简称CRUD。 这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。 一、数据库操作语言 数据库操作时,需要使用专门的数据库...

    MySQL 创建数据库和创建数据表

    MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。

    在这之前,需要先安装好 MySQL ,然后创建好数据库、数据表、操作用户。

    一、数据库操作语言

    数据库在操作时,需要使用专门的数据库操作规则和语法,这个语法就是 SQL(Structured Query Language) 结构化查询语言。

    SQL 的主要功能是和数据库建立连接,进行增删改查的操作。SQL是关系型数据库管理系统的标准语言。

    SQL 语言的作用:

    1. 数据定义语言 DDL(Data Definition Language) 。用于创建数据库,数据表。

    2. 数据操作语言 DML(Data Manipulation Language) 。用于从数据表中插入、修改、删除数据。

    3. 数据查询语言 DQL(Data Query Language) 。用于从数据表中查询数据。

    4. 数据控制语言 DCL(Data Control Language) 。用来设置或修改数据库用户或角色的权限。

    使用 SQL 操作数据库时,所有的 SQL 语句都以分号结束。(切换数据库时可以不用分号)

    在 SQL 语句中,不区分大小写,编写 SQL 语句时可以根据情况用大小写的区别来增加可读性。

    二、创建数据库

    1. 连接 MySQL

    输入 mysql -u root -p 命令,回车,然后输入 MySQL 的密码(不要忘记了密码),再回车,就连接上 MySQL 了。

    mysql -u root -p

    最初,都是使用 root 用户登录,工作中如果一直用 root 用户登录,因为权限太大,风险是很大的,所以等创建好权限适合的用户后,就不要经常登录 root 用户了。

    2. 查看当前的数据库

    使用 show databases; 查看当前安装的 MySQL 中有哪些数据库。

    show databases;

    刚安装 MySQL 时,默认有四个数据库,information_schema,mysql,perfomance_schema,sys 。通常情况下,我们不会直接使用这四个数据库,但千万不要把这四个数据库删了,否则会带来很多不必要的麻烦。如果不小心删了,建议是重新安装 MySQL ,在重装之前把自己的数据迁移出来备份好,或者从其他服务器上迁移一个相同的数据库过来。

    3. 创建数据库

    使用 create database 数据库名; 创建数据库。

    create database MyDB_one;

    创建数据库成功后,数据库的数量变成了5个,多了刚才创建的 MyDB_one 。

    4. 创建数据库时设置字符编码

    使用 create database 数据库名 character set utf8; 创建数据库并设置数据库的字符编码。

    create database MyDB_two character set utf8;
    

    直接创建的数据库,数据库的编码方式是 MySQL 默认的编码方式 latin1 (单字节编码) ,通常我们会在数据库中存放中文数据,所以最好把数据库的编码方式设置成 utf-8 ,这样中文才能正常显示。

    create database MyDB_three charset utf8;

    character set 可以缩写成 charset ,效果是一样的。

    5. 查看和显示数据库的编码方式

    使用 show create database 数据库名; 显示数据库的创建信息。

    show create database MyDB_one;
    show create database MyDB_two;

    如果不知道一个数据库的编码方式是什么,可以使用 show create database 数据库名 来查看数据库的编码方式。可以看到刚才创建的 MyDB_one 的编码方式是 MySQL 的默认编码 latin1 ,MyDB_two 的编码方式是 utf-8 。

    当然,这种方式不能在创建的同时显示,只能查看一个已经存在的数据库的编码方式。

    6. 使用 alter database 数据库名 character set utf8; 修改数据库编码

    alter database MyDB_one character set utf8;

    如果一个数据库的编码方式不符合使用需求,可以进行修改。刚才创建的 MyDB_one 经过修改后,编码方式也变成了 utf-8 。

    7. 进入或切换数据库

    使用 use 数据库名 进入或切换数据库。

    use MyDB_one
    use MyDB_two;

    刚连接上 MySQL 时,没有处于任何一个数据库中,如果要使用某一个数据库,就需要进入到这个数据库中。

    use 数据库名 这个命令后面的分号可以省略,这是 SQL 语句中唯一可以省略分号的语句。

    8. 显示当前数据库 select database();

    select database();

    进入数据库中,可以使用 select database(); 来查看当前处于哪个数据库中。长时间操作数据库时,在很多数据库中来回切换后,查看当前的数据库,避免操作错了数据库。

    三、创建数据表

    1. 查看当前数据库中的表

    使用 show tables;查看当前数据库中有哪些表。

    show tables;
    

    在刚才创建的数据库 MyDB_one 中,还没有创建任何表,所以当前是空的。

    2. 创建表

    使用 create table 表名(字段1 字段类型,字段2 字段类型,字段3 字段类型,…); 来创建一张表。

    create table Phone_table(pid INT, name CHAR(20), price INT);

    在 MyDB_one 中创建了一个叫 Phone_table 的数据表,这张表有三个字段 pid,name,price 。为了增加 SQL 的可读性,字段名我用的是小写,字段类型用大写。

    3. 显示表信息

    用 show create table 表名; 来显示已创建的表的信息。

    show create table Phone_table;

    使用 show create table 表名;  可以显示表的字段信息, MySQL 的引擎,和默认的字符编码等信息。与显示数据库信息一样,show 只能显示已经创建了的数据表的信息,不能在创建的同时显示信息。

    如果想更好地展示表的字段信息,可以使用 desc 表名; 来显示表的字段信息。

    4. 给表增加字段

    使用 alter table 表名 add 字段名 数据类型; 为已存在的表添加一个新字段。

    alter table Phone_table add color CHAR(20);

    添加后,刚才的表中多了一个字段,新增成功。

    5. 删除表的字段

    使用 alter table 表名 drop 字段名; 删除一个表中已存在的字段。

    alter table Phone_table drop price;

    删除字段后,表中不再有该字段。

    6. 修改字段的数据类型

    使用 alter table 表名 modify 字段名 数据类型; 修改表中现有字段的数据类型。

    alter table Phone_table modify name VARCHAR(12);

    修改之后,该字段的数据类型发生改变。

    7. 修改字段的数据类型并且改名

    使用 alter table 表名 change 原字段名 新字段名 数据类型; 修改表中现有字段的字段名和类型。

    alter table Phone_table change name pname CHAR(18);

    现在,将表的 name 改成了 pname ,同时修改了 pname 的数据类型。

    四、MySQL 常用字段类型

    一个数据表是由若干个字段组成的,一个表十几个字段也很正常,每个字段表示不同的信息,需要使用不同类型的数据。

    所以在创建表的时候,要为每个字段指定适合的数据类型。

    MySQL 中常用的字段类型有以下这些:

    1. 整数类型

    数据类型数据范围
    TINYINT-128 -- 127
    SMALLINT-32768 -- 32767
    MEDIUMINT-2^23 -- 2^23-1
    INT-2^31 -- 2^31-1
    BIGINT-2^63 -- 2^63-1

    2. 字符串类型

    数据类型字节范围用途
    CHAR(n)0 -- 255字节定长字符串
    VARCHAR(n)0 -- 65535字节变长字符串
    TEXT0 -- 65535字节长文本数据
    LONGTEXT0 -- 2^32-1字节极大文本数据
    BLOB0 -- 65535字节二进制长文本数据
    LONGBLOB0 -- 2^32-1字节二进制极大文本数据

    3. 小数类型

    m 表示浮点数的总长度,n 表示小数点后有效位数。

    数据类型数据用法数据范围
    FloatFloat(m,n)7位有效数
    DoubleDouble(m,n)15位有效数
    DecimalDecimal(m,n)28位有效数

    4. 时间类型

    数据类型格式用途
    DATEYYYY-MM-DD日期
    TIMEHH:MM:SS时间
    YEARYYYY年份
    DATETIMEYYYY-MM-DD HH:MM:SS日期和时间
    TIMESTAMP10位或13位整数(秒数)时间戳

    5. 枚举类型

    enum(枚举值1,枚举值2,...)

    枚举类型只能在列出的值中选择一个,如性别。

     

     

    展开全文
  • MySQL数据类型详解

    万次阅读 多人点赞 2018-08-13 16:40:22
    上一篇博客我们学习了MySQL的基础知识以及表结构的相关操作,知道了MySQL中常用的数据类型有数值型、字符串型、日期时间类型 下面我们来使用一下这些数据类型。 数值类型 首先数值类型分为整型和浮点型 我们...

    在上一篇博客中,我们简单的了解了MySQL中的常用数据类型以及约束条件,本篇博客我们来对常用的数据类型做一个详细的介绍

    这里做个简单的回顾:

    MySQL数据类型

    MySQL支持多种类型的SQL数据类型:数值,日期和时间类型,字符串(字符和字节)类型,空间类型和 JSON数据类型等
    数据类型描述使用以下约定:

    • M表示整数类型的最大显示宽度。M表示整数类型的最大显示宽度。对于浮点和定点类型, M是可以存储的总位数(精度)。对于字符串类型, M是最大长度。允许的最大值M取决于数据类型。
    • D适用于浮点和定点类型,并指示小数点后面的位数。最大可能值为30,但不应大于 M-2。
    • [ ] 表示类型定义的可选部分。

    在MySQL中常用数据类型主要分为以下几类

    1. 数值类型
    2. 字符串类型
    3. 日期时间类型

    约束条件

    约束条件就是在给字段加一些约束,使该字段存储的值更加符合我们的预期。

    常用约束条件有以下这些

    • UNSIGNED :无符号,值从0开始,无负数
    • ZEROFILL:零填充,当数据的显示长度不够的时候可以使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED
    • NOT NULL:非空约束,表示该字段的值不能为空
    • DEFAULT:表示如果插入数据时没有给该字段赋值,那么就使用默认值
    • PRIMARY KEY:主键约束,表示唯一标识,不能为空,且一个表只能有一个主键。一般都是用来约束id
    • AUTO_INCREMENT:自增长,只能用于数值列,而且配合索引使用,默认起始值从1开始,每次增长1
    • UNIQUE KEY:唯一值,表示该字段下的值不能重复,null除外。比如身份证号是一人一号的,一般都会用这个进行约束
    • FOREIGN KEY:外键约束,目的是为了保证数据的完成性和唯一性,以及实现一对一或一对多关系

    数值类型

    数值类型包括整数型浮点型定点型

    整数型(精确值)

    • TINYINT[(M)] [UNSIGNED] [ZEROFILL] 范围非常小的整数,有符号的范围是 -128到127,无符号的范围是0到 255
    • SMALLINT[(M)] [UNSIGNED] [ZEROFILL] 范围较小的整数,有符号的范围是 -32768到32767,无符号的范围是0到 65535
    • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] 中等大小的整数,有符号的范围是 -8388608到8388607,无符号的范围是0到 16777215。
    • INT[(M)] [UNSIGNED] [ZEROFILL] 正常大小的整数,有符号的范围是 -2147483648到 2147483647。无符号的范围是 0到4294967295。
    • BIGINT[(M)] [UNSIGNED] [ZEROFILL] 大整数,有符号的范围是 -9223372036854775808到 9223372036854775807,无符号的范围是0到 18446744073709551615。

    这里写图片描述

    上面出现了两个词,有符号和无符号。
    我们来看看 有符号和无符号(UNSIGNED) 是啥玩意

    在计算机中,可以区分正负的类型,称为有符号类型。无正负的类型,称为无符号类型。
    简单的理解为就是
    有符号值可以表示负数,0以及正数
    无符号值只能为0或正数

    关于有符号和无符号详解可以看这篇文章或者自己百度百科。

    这里我们就不关心原理了,我们只需要知道有符号数可以表示负数,无符号数只能为非负数即可,如果不手动指定UNSIGNED,那么默认就是有符号的

    下面我们用一下整数型数据
    首先创建一个表

    CREATE TABLE int_db(
    a TINYINT,
    b SMALLINT,
    c MIDDLEINT,
    d INT,
    e BIGINT
    );
    

    查看表结构

    这里写图片描述

    我们来看看type这一列,可以看到,每个字段类型后面都有一个括号,括号里面的有个数值,这个数值实际上就是字段的显示宽度,也就是M的值,M表示整数类型的最大显示宽度。最大显示宽度为255.显示宽度与类型可包含的值范围无关

    我们在创建表的时候并没有指定字段类型的显示宽度,那么,默认的显示宽度则是该字段类型最大的显示宽度

    例如字段a的显示宽度为4,是因为TINYINT有符号值的范围是-128到127,
    -128的长度为4(负号、1、2、8共四位),所以默认的显示宽度最大为4,其他的以此类推

    下面我们再新建一个表,将字段a的修改为无符号类型的。再看看a字段的默认显示宽度
    这里写图片描述

    可以看到,默认显宽度就变成3了,因为无符号的TINYINT的值范围为0-255,没有负号,所以最多是3位。

    ZEROFILL
    下面我们来试试ZEROFILL约束,前面的博客中我们知道。使用该约束后当数据的长度比我们指定的显示宽度小的时候会使用前补0的效果填充至指定长度,字段会自动添加UNSIGNED

    下面我们新建个表试一下,这次我们来指定一下显示宽度

    CREATE TABLE int_db2(
    a TINYINT(8) ZEROFILL,
    b TINYINT(5) UNSIGNED);
    

    然后插入一条记录:

    INSERT int_db2() VALUES(12,12);
    

    这里写图片描述
    可以看到,12变成了00000012,自动在前面补了0,这是因为指定的显示宽度是8,但是12只有两位,所以在前面补0,使长度为8。这就是ZEROFILL的效果

    浮点型

    • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
      一个小的(单精度)浮点数。允许值是-3.402823466E+38 到-1.175494351E-38, 0以及1.175494351E-38 到3.402823466E+38,M是总位数,D是小数点后面的位数。
    • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
      正常大小(双精度)浮点数。允许值是 -1.7976931348623157E+308到-2.2250738585072014E-308,0以及 2.2250738585072014E-308到 1.7976931348623157E+308。M是总位数,D是小数点后面的位数

    下面我们来用一下浮点型
    创建表

    CREATE TABLE float_db(
    a FLOAT(3,2),
    b DOUBLE(5,3)
    )
    

    我们指定a字段为FLOAT类型,总长度为3,小数点后两位为2,b字段总长度为5,小数点后两位长度为3

    这里写图片描述

    插入数据

    INSERT float_db VALUES(1.111,2.113);
    

    这里写图片描述

    可以看到,我们给a字段的值是1.111,但是只存进去了1.11
    浮点数存在精度丢失的问题,如果涉及到小数运算,尽量不要用浮点型

    定点型

    • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
      常用于存储精确的小数,M是总位数,D是小数点后的位数。小数点和(负数) -符号不计入 M。如果 D为0,则值没有小数点或小数部分。最大位数(M)为 65. 最大支持小数(D)为30.如果D省略,则默认值为0.如果M省略,则默认值为10。M的范围是1到65。D范围为0到30,且不得大于M。

    我们来用一下DECIMAL类型

    首先创建表,先不指定M和D

    CREATE TABLE decimal_db(a DECIMAL);
    

    这里写图片描述

    可以看到,默认的总长度(M)为10,小数点位数(D)默认为0.

    插入一条数据

    INSERT decimal_db VALUES(30.556)
    

    这里写图片描述

    可以看到,存进去的数值被四舍五入阶段了,也就是说,DECIMAL也在存储时存在精度丢失的问题

    超出范围和溢出处理

    当MySQL将值存储在超出列数据类型允许范围的数值列中时,结果取决于当时生效的SQL模式:
    如果启用了严格的SQL模式,则MySQL会根据SQL标准拒绝带有错误的超出范围的值,并且插入失败。
    如果未启用限制模式,MySQL会将值截断到列数据类型范围的相应端点,并存储结果值,并产生一个警告

    在我们的配置文件中可以看到SQL模式的配置,关于SQL模式详情请看SQL模式官方文档

    这里写图片描述


    字符串类型

    常用的字符串类型有如下

    • CHAR[(M)] 一个固定长度的字符串,在存储时始终用空格填充指定长度。 M表示以字符为单位的列长度。M的范围为0到255.如果M省略,则长度为1,存储时占用M个字节
    • VARCHAR(M)可变长度的字符串,M 表示字符的最大列长度,M的范围是0到65,535,存储时占用**L+1(L<=M,L为实际字符的长度)**个字节
    • TINYTEXT[(M)] 不能有默认值,占用L+1个字节,L<2^8
    • TEXT[(M)] 不能有默认值,占用L+2个字节,L<2^16
    • MEDIUMTEXT[(M)] 不能有默认值,占用L+3个字节,L<2^24
    • LONGTEXT[(M)] 不能有默认值,占用L+4个字节,L<2^32
    • ENUM('value1','value2',...) ENUM是一个字符串对象,其值从允许值列表中选择,它只能有一个值,从值列表中选择,最多可包含65,535个不同的元素
    • SET('value1','value2',...) 字符串对象,该对象可以有零个或多个值,最多可包含64个不同的成员

    CHAR和VARCHAR

    创建表

    CREATE TABLE str_db(
    a CHAR(4),
    b VARCHAR(4));
    

    插入数据

    INSERT str_db() VALUES("","");
    INSERT str_db() VALUES("ab","ab");
    INSERT str_db() VALUES("abcd","abcd");
    INSERT str_db() VALUES("abcdefg","abcdefg");//在严格模式下,该条数据会插入失败,非严格模式则会对数据进行截取
    

    这里写图片描述

    我们看到查询的结果是一样的,但实际上他们存储时占用的长度是不一样的。
    CHAR类型不管存储的值的长度是多少,都会占用M个字节,而VARCHAR则占用实际长度+1个字节。

    这里写图片描述

    但是CHAR的查询效果要高于VARCHAR,所以说,如果字段的长度能够确定的话,比如手机号,身份证号之类的字段,可以用CHAR类型,像地址,邮箱之类的就用VARCHAR

    TEXT系列

    TEXT系列的存储范围比VARCHAR要大,当VARCHAR不满足时可以用TEXT系列中的类型。需要注意的是TEXT系列类型的字段不能有默认值,在检索的时候不存在大小写转换,没有CHAR和VARCHAR的效率高

    这里写图片描述

    ENUM

    枚举类型
    创建表

    CREATE TABLE enum_db(gender ENUM("男","女"));
    

    这里写图片描述

    插入数据

    INSERT enum_db() VALUES("男");
    INSERT enum_db() VALUES(1); 也可以使用编号插入值,等同于"男",序号从1开始
    INSERT enum_db() VALUES("女");
    INSERT enum_db() VALUES(2);等同于"女"
    

    这里写图片描述

    下面我们插入一条不是枚举集合中的数据试一下

    这里写图片描述

    可以看到是插入失败的

    SET

    在ENUM中我们只能从允许值列表中给字段插入一个值,而在SET类型中可以给字段插入多个值

    创建表

    
    CREATE TABLE set_db(
    a SET('1','2','3','4','5')
    
    )
    

    这里写图片描述

    插入数据

    
    INSERT set_db() VALUES('1')
    INSERT set_db() VALUES('1,2,3')
    

    这里写图片描述


    日期时间类型

    • TIME 范围是’-838:59:59.000000’ 到’838:59:59.000000’
    • DATE 支持的范围是 '1000-01-01’到 ‘9999-12-31’
    • DATETIME 日期和时间组合。支持的范围是 '1000-01-01 00:00:00.000000’到 ‘9999-12-31 23:59:59.999999’。
    • TIMESTAMP 时间戳。范围是’1970-01-01 00:00:01.000000’UTC到’2038-01-19 03:14:07.999999’UTC。
    • YEAR 范围是 1901到2155

    TIME

    我们可以看到TIME的存储范围是’-838:59:59’到 ‘838:59:59’,因为TIME类型不仅可以用于表示一天中的时间(,还可以用于表示两个事件之间的经过时间或时间间隔

    TIME的完整的显示为 D HH:MM:SS
    D:表示天数,当指定该值时,存储时小时会先乘以该值
    HH:表示小时
    MM:表示分钟
    SS:表示秒

    创建表:

    CREATE TABLE time_db(
    a TIME
    )
    

    插入值:

    INSERT time_db() VALUES('22:14:16');
    --   -2表示间隔了2两天
    INSERT time_db() VALUES('-2 22:14:16');
    -- 有冒号从小时开始
    INSERT time_db() VALUES('14:16');
    -- 没有冒号且没有天数则数据从秒开始
    INSERT time_db() VALUES('30');
    -- 有天数也从小时开始
    INSERT time_db() VALUES('3 10');
    -- 直接使用数字代替也可以
    INSERT time_db() VALUES(253621);
    

    这里写图片描述

    DATE

    创建表

    CREATE TABLE date_db(
    a DATE)
    

    插入数据

    INSERT date_db() VALUES(20180813);
    INSERT date_db() VALUES("2018-06-1");
    INSERT date_db() VALUES("2018-4-1");
    INSERT date_db() VALUES("2018-04-07");
    

    这里写图片描述

    DATETIME

    创建表

    CREATE TABLE datetime_db(
    a DATETIME
    )
    
    

    插入数据

    INSERT datetime_db() VALUES(20180102235432);
    INSERT datetime_db() VALUES("2015-04-21 21:14:32");
    INSERT datetime_db() VALUES("2015-04-23");
    

    这里写图片描述

    TIMESTAMP

    TIMESTAMP和DATETIME使用上差不多,但是范围相对较小。

    创建表

    CREATE TABLE timestamp_db(
    a TIMESTAMP
    )
    
    

    插入数据

    INSERT timestamp_db() VALUES(20020121);
    INSERT timestamp_db() VALUES(20020121142554);
    INSERT timestamp_db() VALUES("2015-12-16 21:14:15");
    INSERT timestamp_db() VALUES("2015-12-17");
    INSERT timestamp_db() VALUES(NULL);
    INSERT timestamp_db() VALUES(CURRENT_TIMESTAMP);
    INSERT timestamp_db() VALUES();
    

    这里写图片描述

    YEAR

    创建表

    CREATE TABLE year_db(
    a YEAR
    )
    

    插入数据

    INSERT year_db() VALUES("1993");
    INSERT year_db() VALUES(1993);
    

    这里写图片描述


    MySQL中的常用数据类型大概就这些,我们在建表的时候要选择合适的数据类型定义字段。

    下一篇:

    MySQL表数据的增删改(DML)


    如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

    展开全文
  • MySQL 数据类型介绍

    万次阅读 多人点赞 2016-04-29 20:24:03
    要了解一个数据库,我们也必须了解其支持的数据类型。... MySQL支持所有标准的SQL数据类型,主要分3类: ·数值类型 ·字符串类型 ·时间日期类型 另一类是几何数据类型,用的多,也没多介绍。

        据我统计,MySQL支持39种(按可使用的类型字段统计,即同义词也作多个)数据类型。下面的介绍可能在非常古老的mysql版本中不适用。

        转载请注明出处:http://blog.csdn.net/anxpp/article/details/51284106。谢谢!

        文本主要参考了官方文档:http://dev.mysql.com/doc/refman/5.7/en/

     

    1、概述

        要了解一个数据库,我们也必须了解其支持的数据类型。

        MySQL支持所有标准的SQL数据类型,主要分3类:

    •     数值类型
    •     字符串类型
    •     时间日期类型
        另一类是几何数据类型,用的不多,也没多介绍。     下面大、小标题后括号内的数组表示其含有的类型个数。下面所有结论都经过本人使用MySql Workbench编写SQL验证过或来自官网。

     

    2、数值类型(12)

        2.1、整数类型(6)

        一张图就能解释清楚了:

        01

        INTEGER同INT。

        2.2、定点数(2)

        DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。

        使用方式如下:

    
      
    1. salary DECIMAL(5,2)

        下面的介绍将基于上面这个例子。

        我们看到其中有两个参数,即DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,上例中的取值范围为-999.99~999.99。

        如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。

        如果存储时,小数点部分若超出范围,就分以下情况:

    •     若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。
    •     若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999.995都会报错。

        M的默认取值为10,D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带一个参数时,D取默认值。

    •     M的取值范围为1~65,取0时会被设为默认值,超出范围会报错。
    •     D的取值范围为0~30,而且必须<=M,超出范围会报错。

        所以,很显然,当M=65,D=0时,可以取得最大和最小值。

        已经解释很详细了,如还不清楚,请回复。

        2.3、浮点数(3)

        浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题。

        如果希望保证值比较准确,推荐使用定点数数据类型。

        MySql中的浮点类型有float,double和real。他们定义方式为:FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)。

        REAL就是DOUBLE ,如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。

        “(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

        FLOAT和DOUBLE中的M和D的取值默认都为0,即除了最大最小值,不限制位数。允许的值理论上是-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。M、D范围如下(MySql5.7实测,与IEEE标准计算的实际是不同的,下面介绍):

    •     M取值范围为0~255。FLOAT只保证6位有效数字的准确性,所以FLOAT(M,D)中,M<=6时,数字通常是准确的。如果M和D都有明确定义,其超出范围后的处理同decimal。
    •     D取值范围为0~30,同时必须<=M。double只保证16位有效数字的准确性,所以DOUBLE(M,D)中,M<=16时,数字通常是准确的。如果M和D都有明确定义,其超出范围后的处理同decimal。

        FLOAT和DOUBLE中,若M的定义分别超出7和17,则多出的有效数字部分,取值是不定的,通常数值上会发生错误。因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。

        MySql中的浮点数遵循IEEE 754标准。

        内存中,FLOAT占4-byte(1位符号位 8位表示指数 23位表示尾数),DOUBLE占8-byte(1位符号位 11位表示指数 52位表示尾数)。IEEE754标准还对尾数的格式做了规范:d.dddddd...,小数点左面只有1位且不能为零,计算机内部是二进制,因此,尾数小数点左面部分总是1。显然,这个1可以省去,以提高尾数的精度。由上可知,单精度浮点数的尾数是用24bit表示的,双精度浮点数的尾数是用53bit表示的。所以就能算出取值范围和准确的有效位数了,但MySql中其实略有不同。

        2.4、BIT(1)

        BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1~64,默认为1。

        BIT其实就是存入二进制的值,类似010110。

        如果存入一个BIT类型的值,位数少于M值,则左补0.

        如果存入一个BIT类型的值,位数多于M值,MySQL的操作取决于此时有效的SQL模式:

    •     如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。
    •     如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。

        下面是官方示例:

    
      
    1. mysql> CREATE TABLE t (b BIT(8));
    2. mysql> INSERT INTO t SET b = b'11111111';
    3. mysql> INSERT INTO t SET b = b'1010';
    4. mysql> INSERT INTO t SET b = b'0101';
    
      
    1. mysql> SELECT b+0, BIN(b+0), OCT(b+0), HEX(b+0) FROM t;
    2. +------+----------+----------+----------+
    3. | b+0 | BIN(b+0) | OCT(b+0) | HEX(b+0) |
    4. +------+----------+----------+----------+
    5. | 255 | 11111111 | 377 | FF |
    6. | 10 | 1010 | 12 | A |
    7. | 5 | 101 | 5 | 5 |
    8. +------+----------+----------+----------+

     

    3、字符串类型(14)

        字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。

        3.1、CHAR和VARCHAR类型(2)

        CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。默认长度都为255。

        CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉,所以,我们在存储时字符串右边不能有空格,即使有,查询出来后也会被删除。在存储或检索过程中不进行大小写转换。

        所以当char类型的字段为唯一值时,添加的值是否已经存在以不包含末尾空格(可能有多个空格)的值确定,比较时会在末尾补满空格后与现已存在的值比较。

        VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值(实际可指定的最大长度与编码和其他字段有关,比如,本人MySql使用utf-8编码格式,大小为标准格式大小的2倍,仅有一个varchar字段时实测最大值仅21844,如果添加一个char(3),则最大取值减少3。整体最大长度是65,532字节)。

        同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。

        VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

        如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

        下面显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果:

        02

        表中最后一行的值只适用在不使用严格模式时;如果MySQL运行使用严格模式,超过列长度的值不保存,并且会出现错误。

        因为空格的原因,相同的值存入到长度都足够的varvhar和char中,取出可能会不同,比如"a"和"a  "。

        3.1、BINARY和VARBINARY类型(2)

        BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。

        当保存BINARY值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'。

        对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要。

        当类型为BINARY的字段为主键时,应考虑上面介绍的存储方式。

        3.2、BLOB和TEXT类型(8)

        BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

        有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

        BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似CHAR和BINARY。

        在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。

        未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告。

        在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。

        BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR:

    •     当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同)。 
    •     比较时将用空格对TEXT进行扩充以适合比较的对象,正如CHAR和VARCHAR。
    •     对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。
    •     BLOB和TEXT列不能有默认值。

        MySQL Connector/ODBC将BLOB值定义为LONGVARBINARY,将TEXT值定义为LONGVARCHAR。

        BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。

        每个BLOB或TEXT值分别由内部分配的对象表示。

        它们(TEXT和BLOB同)的长度:

    •     Tiny:最大长度255个字符(2^8-1)
    •     BLOB或TEXT:最大长度65535个字符(2^16-1)
    •     Medium:最大长度16777215个字符(2^24-1)
    •     LongText 最大长度4294967295个字符(2^32-1)

        实际长度与编码有关,比如utf-8的会减半。

        3.3、ENUM(1)

        MySql中的ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

        可以插入空字符串""和NULL:

    •     如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。
    •     如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。

        值的索引规则如下:

    •     来自列规定的允许的值列中的值从1开始编号。
    •     空字符串错误值的索引值是0。所以,可以使用下面的SELECT语句来找出分配了非法ENUM值的行:mysql> SELECT * FROM tbl_name WHERE enum_col=0;
    •     NULL值的索引是NULL。

        如下例:

        03

        ENUM最多可以有65,535个元素。当创建表时,ENUM成员值的尾部空格将自动被删除。

        使用方式:

    
      
    1. CREATE TABLE shirts (
    2. name VARCHAR(40),
    3. size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
    4. );
    
      
    1. INSERT INTO shirts (name, size) VALUES ('dress shirt','large'),('t-shirt','medium'),('polo shirt','small');
    
      
    1. SELECT name, size FROM shirts WHERE size = 'medium';
    
      
    1. UPDATE shirts SET size = 'small' WHERE size = 'large';

        如果将返回值设为数值,将返回索引值,比如讲上面的查询语句改为:

    
      
    1. SELECT name, size+0 FROM shirts WHERE size = 'medium';

        如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员(这不适合LOAD DATA,它将所有输入视为字符串)。不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆。

        ENUM值根据索引编号进行排序)。例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可以使用GROUP BY CAST(col AS CHAR)或GROUP BY CONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。

        3.4、SET类型(1)

        SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。例如,指定为SET('one', 'two') NOT NULL的列可以有下面的任何值:

    •     ''
    •     'one'
    •     'two'
    •     'one,two'

        SET最多可以设置64个值。创建表时,SET成员值的尾部空格将自动被删除。检索时,保存在SET列的值使用列定义中所使用的大小写来显示。

        MySQL用数字保存SET值,所保存值的低阶位对应第1个SET成员。如果在数值上下文中检索一个SET值,检索的值的位设置对应组成列值的SET成员。

        例如,可以这样从一个SET列检索数值值:

    
      
    1. mysql> SELECT set_col+0 FROM tbl_name;

        如果将一个数字保存到SET列中,数字的二进制的1的位置确定了列值中的SET成员。对于指定为SET('a','b','c','d')的列,成员有下面的十进制和二进制值:

        04

        如果你为该列分配一个值9,其二进制形式为1001,因此第1个和第4个SET值成员'a'和'd'被选择,结果值为 'a,d'。

        对于包含多个SET元素的值,当插入值时元素所列的顺序并不重要。在值中一个给定的元素列了多少次也不重要。当以后检索该值时,值中的每个元素出现一次,根据表创建时指定的顺序列出元素。例如,假定某个列指定为SET('a','b','c','d'):

    
      
    1. CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
    2. INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    3. SELECT *,col+0 FROM myset;
    4. SELECT *,col+0 FROM myset where col='a,b';

        结果:

     
    1. a,d 9
    2. a,d 9
    3. a,d 9
    4. a,d 9
    5. a,d 9

        SET值按数字顺序排序。NULL值排在非NULL SET值的前面。

        通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:

        mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;

        mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';

        第1个语句找出SET_col包含value set成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。

        下面的语句也是合法的:

        mysql> SELECT * FROM tbl_name WHERE set_col & 1;

        mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2';

        第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。

        如果想要为SET列确定所有可能的值,使用SHOW COLUMNS FROM tbl_name LIKE set_col并解析输出中第2列的SET定义。

        有什么实际应用呢?

        比如我们设定用户的权限控制,一个用户可能会有多种权限,我们使用所有权限创建一个SET类型的字段,我们不需要用一系列int来定义各种权限了,直接使用一个SET字段即可:

    
      
    1. /*
    2. 用户权限permission表
    3. */
    4. create table user_permission(
    5. id int UNSIGNED not null auto_increment,
    6. user_id int not null ,
    7. permission set('阅读','评论','发帖') not null,
    8. primary key(id),
    9. unique (user_id)
    10. );
    11. desc user_permission;
    12. insert into user_permission values (0,1,'阅读'),(0,2,'阅读'),(0,3,'阅读,评论');
    13. insert into user_permission values (0,4,'阅读,评论,发帖');
    14. select *,permission+0 from user_permission;
    15. select permission from user_permission where user_id=1;
    16. select * from user_permission where permission & 10;
    17. SELECT * FROM user_permission WHERE FIND_IN_SET('评论',permission)>0;

     

    4、时间日期类型(5)

        他们的“0”值如下:

        04

        4.1、DATE, DATETIME, 和TIMESTAMP类型(3)

        这三者其实是关联的,都用来表示日期或时间。

        当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。

        当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用'YYYY-MM-DD'格式检索和显示DATE值。支持的范围是'1000-01-01'到 '9999-12-31'。

        TIMESTAMP类型同样包含日期和时间,范围从'1970-01-01 00:00:01' UTC 到'2038-01-19 03:14:07' UTC。

        可以使用任何常见格式指定DATETIME、DATE和TIMESTAMP值:

    •     'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的。
    •     'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。这里也允许使用“不严格的”语法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等价的。
    •     YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523091528'和'970523091528'被解释为'1997-05-23 09:15:28',但'971122129015'是不合法的(它有一个没有意义的分钟部分),将变为'0000-00-00 00:00:00'。
    •     'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523'和'970523'被解释为 '1997-05-23',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为'0000-00-00'。
    •     YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为 '1983-09-05 13:28:00'。
    •     YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,19830905和830905被解释为'1983-09-05'。
    •     函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。

        对于包括日期部分间割符的字符串值,如果日和月的值小于10,不需要指定两位数。'1979-6-9'与'1979-06-09'是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于10,不需要指定两位数。'1979-10-30 1:2:3'与'1979-10-30 01:02:03'相同。

        数字值应为6、8、12或者14位长。如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。如果数字 是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。其它数字被解释为仿佛用零填充到了最近的长度。

        指定为非限定符字符串的值使用给定的长度进行解释。如果字符串为8或14字符长,前4位数表示年。否则,前2位数表示年。从左向右解释字符串内出现的各部分,以发现年、月、日、小时、分和秒值。这说明不应使用少于6字符的字符串。例如,如果你指定'9903',认为它表示1999年3月,MySQL将在你的表内插入一个“零”日期值。这是因为年和月值是99和03,但日部分完全丢失,因此该值不是一个合法的日期。但是,可以明显指定一个零值来代表缺少的月或日部分。例如,可以使用'990300'来插入值'1999-03-00'。

        可以将一个日期类型的值分配给一个不同的日期类型。但是,值可能会更改或丢失一些信息:

    •     如果你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为'00:00:00',因为DATE值未包含时间信息。
    •     如果你为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。
    •     记住尽管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同类型的值的范围却不同。例如,TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如'1968-01-01',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。

        当指定日期值时请注意某些缺陷:

    •     指定为字符串的值允许的非严格格式可能会欺骗。例如,值'10:11:12'由于‘:’间割符看上去可能象时间值,但如果用于日期上下文值则被解释为年'2010-11-12'。值'10:45:15'被转换为'0000-00-00'因为'45'不是合法月。
    •     在非严格模式,MySQL服务器只对日期的合法性进行基本检查:年、月和日的范围分别是1000到9999、00到12和00到31。任何包含超出这些范围的部分的日期被转换成'0000-00-00'。请注意仍然允许你保存非法日期,例如'2002-04-31'。要想确保不使用严格模式时日期有效,应检查应用程序。 在严格模式,非法日期不被接受,并且不转换。
    •     包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值: o 00-69范围的年值转换为2000-2069。 o 70-99范围的年值转换为1970-1999。

        各种相关操作:

        4.2、TIME类型(1)

        MySQL以'HH:MM:SS'格式检索和显示TIME值(或对于大的小时值采用'HHH:MM:SS'格式)。

        TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。

        你可以用各种格式指定TIME值:

    •     'D HH:MM:SS.fraction'格式的字符串。还可以使用下面任何一种“非严格”语法:'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH'或'SS'。这里D表示日,可以取0到34之间的值。请注意MySQL还不保存分数。
    •     'HHMMSS'格式的没有间割符的字符串,假定是有意义的时间。例如,'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分),将变为'00:00:00'。
    •     HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为'10:11:12'。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。请注意MySQL还不保存分数。
    •     函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。

        对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。'8:3:2'与'08:03:02'相同。

        为TIME列分配简写值时应注意。没有冒号,MySQL解释值时假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为'1112'和1112表示'11:12:00'(11点过12分),但MySQL将它们解释为'00:11:12'(11分,12 秒)。同样,'12'和12 被解释为 '00:00:12'。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,'11:12'表示'11:12:00',而不是'00:11:12'。

        超出TIME范围但合法的值被裁为范围最接近的端点。例如,'-850:00:00'和'850:00:00'被转换为'-838:59:59'和'838:59:59'。

        无效TIME值被转换为'00:00:00'。请注意由于'00:00:00'本身是一个合法TIME值,只从表内保存的一个'00:00:00'值还不能说出原来的值是 '00:00:00'还是不合法的值。

        4.3、YEAR类型(1)

        YEAR类型是一个单字节类型用于表示年。

        MySQL以YYYY格式检索和显示YEAR值。范围是1901到2155。

        可以指定各种格式的YEAR值:

    •     四位字符串,范围为'1901'到'2155'。
    •     四位数字,范围为1901到2155。
    •     两位字符串,范围为'00'到'99'。'00'到'69'和'70'到'99'范围的值被转换为2000到2069和1970到1999范围的YEAR值。
    •     两位整数,范围为1到99。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值。请注意两位整数范围与两位字符串范围稍有不同,因为你不能直接将零指定为数字并将它解释为2000。你必须将它指定为一个字符串'0'或'00'或它被解释为0000。
    •     函数返回的结果,其值适合YEAR上下文,例如NOW()。

        非法YEAR值被转换为0000。

     

    5、几何类型(8)

        几何类型层次结构如下:

        06

        到用的时候再说吧。

        官方文档:http://dev.mysql.com/doc/refman/5.7/en/opengis-geometry-model.html

     

    6、各种类型占用的存储

        6.1、数值类型

        07

        定点数的比较特殊,而且与具体版本也有关系,此处单独解释:

        使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。下表给出了超出位数的存储需求:

        08

        6.2、时间日期

        09

        从版本5.6.4开始,存储需求就有所改变,根据精度而定。不确定部分需要的存储如下:

        10

        比如,TIME(0), TIME(2), TIME(4), 和TIME(6) 分别使用3, 4, 5, 6 bytes。

        6.3、字符串

        11

     

    7、类型的选择

        为了优化存储,在任何情况下均应使用最精确的类型。

        例如,如果列的值的范围为从1到99999,若使用整数,则MEDIUMINT UNSIGNED是好的类型。在所有可以表示该列值的类型中,该类型使用的存储最少。

        用精度为65位十进制数(基于10)对DECIMAL 列进行所有基本计算(+、-、*、/)。

        使用双精度操作对DECIMAL值进行计算。如果准确度不是太重要或如果速度为最高优先级,DOUBLE类型即足够了。为了达到高精度,可以转换到保存在BIGINT中的定点类型。这样可以用64位整数进行所有计算,根据需要将结果转换回浮点值。

     

    8、使用其他数据库的SQL语句

        为了使用为其它数据库编写的SQL执行代码,MySQL按照下表所示对列类型进行映射。通过这些映射,可以很容易地从其它数据库引擎将表定义导入到MySQL中:

        12

     


        其实,字段类型相关知识,远不止这点,还有很多。详情请访问官网:http://dev.mysql.com/doc/refman/5.7/en/data-types.html

    展开全文
  • mysql中数据类型的长度限制

    万次阅读 2018-05-12 13:37:11
    mysql中的所有数据类型mysql支持多种数据类型,大致可以分为四类: 数值型、浮点型、日期/时间和字符串(字符)类型 1、 数值型: 1、 字符串长度 char/varchar 最大长度...

    mysql中的所有数据类型:
    mysql支持多种数据类型,大致可以分为四类: 数值型、浮点型、日期/时间和字符串(字符)类型
    1、 数值型: Mysql支持所有标准sql数值数据类型。
    包括 严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION),关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围:
    这里写图片描述

    2、 浮点型:
    这里写图片描述

    3、日期和时间类型
    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个”“值,当指定不合法的MySQL不能表示的值时使用”零”值。TIMESTAMP类型有专有的自动更新特性。
    这里写图片描述
    注: 在生产里,日期时间型,往往用的比较少,而是用数字类型来取代日期类型!

    4、 字符串类型
    字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET
    这里写图片描述
     CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
      BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
      有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
    ENUM是枚举类型
     SET是集合类型不同于ENUM类型,它是一个排列组合。假如有abc,它可以选择a或b或c,也有选择是ab,ac,bc,也可以选择abc。

    这里写图片描述

    2、 java插入blob数据

    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
    import java.sql.Blob;  
    import java.sql.Connection;  
    import java.sql.PreparedStatement;  
    import java.sql.ResultSet;  
    import org.junit.Test;  
    public class TestBlob {  
    @Test  
        public void getBlob(){//读取Blob数据  
           Connection con = null;  
           PreparedStatement ps = null;  
           ResultSet rs = null;  
           try {  
                 con = JDBCTools.getConnection();  
                 String sql = "SELECT id,name,age,picture FROM animal WHERE id=5";  
                 ps = con.prepareStatement(sql);  
                 rs = ps.executeQuery();  
                 if(rs.next()){  
                        int id = rs.getInt(1);  
                        String name = rs.getString(2);  
                        int age = rs.getInt(3);  
    
                        Object o = rs.getObject(4);
                        if ( o != null ) {
                            Blob picture = rs.getBlob(4);//得到Blob对象, 如果当前列对应的值存在null的情况,则此处会提示错误
                             //开始读入文件  
                            InputStream in = picture.getBinaryStream();  
                            OutputStream out = new FileOutputStream("cat.png");  
                            byte[] buffer = new byte[1024];  
                            int len = 0;  
                            while((len = in.read(buffer)) != -1){  
                                   out.write(buffer, 0, len);  
                            }  
                        }
                 }  
           } catch (Exception e) {  
            e.printStackTrace();  
           }  
    }  
    @Test  
        public void insertBlob(){//插入Blob  
           Connection con = null;  
           PreparedStatement ps = null;  
           try {  
                 con = JDBCTools.getConnection();  
                 String sql = "INSERT INTO animal(name,age,picture) VALUES(?,?,?)";  
                 ps = con.prepareStatement(sql);  
                 ps.setString(1, "TheCat");  
                 ps.setInt(2, 8);  
                 InputStream in = new FileInputStream("J:/test1/TomCat.png");//生成被插入文件的节点流  
                 //设置Blob  
                 ps.setBlob(3, in);  
    
                 ps.executeUpdate();  
           } catch (Exception e) {  
            e.printStackTrace();  
           }finally{  
                 JDBCTools.release(con, ps);  
           }  
    }  
    class JDBCTools {//JDBC工具类  用来建立连接和释放连接  
           public static Connection getConnection() throws Exception{//连接数据库  
                 String driverClass = null;  
                 String url = null;  
                 String user = null;  
                 String password = null;  
    
                 Properties properties = new Properties();  
    
                 InputStream in = Review.class.getClassLoader().getResourceAsStream("jdbc.properties");  
                 properties.load(in);  
    
                 driverClass = properties.getProperty("driver");  
                 url = properties.getProperty("jdbcurl");  
                 user = properties.getProperty("user");  
                 password = properties.getProperty("password");  
                 Class.forName(driverClass);  
                 return DriverManager.getConnection(url, user, password);  
           }  
           public static void release(Connection con , Statement state){//关闭数据库连接  
                 if(state != null){  
                        try {  
                               state.close();  
                        } catch (SQLException e) {  
                               e.printStackTrace();  
                        }  
                 }  
                 if(con != null){  
                        try {  
                               con.close();  
                        } catch (SQLException e) {  
                               e.printStackTrace();  
                        }  
                 }  
    
           }  
           public static void release(ResultSet rs , Connection con , Statement state){//关闭数据库连接  
                 if(rs != null)  
                 {  
                        try {  
                               rs.close();  
                        } catch (SQLException e) {  
                               e.printStackTrace();  
                        }  
                 }  
                 if(state != null){  
                        try {  
                               state.close();  
                        } catch (SQLException e) {  
                               e.printStackTrace();  
                        }  
                 }  
                 if(con != null){  
                        try {  
                               con.close();  
                        } catch (SQLException e) {  
                               e.printStackTrace();  
                        }  
                 }  
           }  
    }  
    }  
    public class Review {  
           public  Connection getConnection() throws Exception{//连接数据库  
                 String driverClass = null;  
                 String url = null;  
                 String user = null;  
                 String password = null;  
    
                 Properties properties = new Properties();  
    
                 InputStream in = Review.class.getClassLoader().getResourceAsStream("jdbc.properties");  
    
                 properties.load(in);  
    
                 driverClass = properties.getProperty("driver");  
                 url = properties.getProperty("jdbcurl");  
                 user = properties.getProperty("user");  
                 password = properties.getProperty("password");  
                 Class.forName(driverClass);  
                 return DriverManager.getConnection(url, user, password);  
           }  
    
    }  
    展开全文
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    MySQL 面试题 MySQL 涉及的内容非常非常非常多,所以面试题也容易写的杂乱。当年,我们记着几个一定要掌握的重心: 重点的题目添加了【重点】前缀。 索引。 锁。 事务和隔离级别。 因为 MySQL 还会有部分内容和...
  • mysql中数据类型的长度

    万次阅读 2018-05-16 11:14:50
    一、varchar(n)、char(n)的n的含义1)varchar(m),char(n)里面的m或n代表的是字符的个数。打开mysql手册,看到这样一句话 The CHAR and VARCHAR types are declared with a length that indicates the maximum ...
  • MySQL中数据类型的长度问题总结

    千次阅读 多人点赞 2018-01-28 16:59:51
    MySQL中数据类型的长度问题总结 大家好,我又回来了,这两个星期忙着做项目实训作业,没更博客。 放寒假了,先预祝大家狗年大吉! 初次接触Mysql的时候,虽然会用,但是只是照着老师或者跟着视频敲来实现功能,...
  • mysql到hive数据类型转换

    千次阅读 2020-07-22 13:48:24
    mysql和hive数据类型存在差异,在mysql集成数据到hive这样的场景下,我们希望hive的数据是贴源的,所以hive希望创建和mysql结构一致的表。 mysql到hive数据类型映射参考如下: mysql数据类型 ...
  • Mysql数据类型

    千次阅读 2016-07-24 14:46:45
    Mysql中光整型数据类型就有五种:tinyint,smallint,mediumint,int,bigint Tinyint:迷你整型,占用一个字节保存数据,能够表示256个数值 Smallint:小整型,占用2个字节保存数据,能够表示65536个数值
  • MySQL中数据类型介绍

    万次阅读 2015-02-10 10:55:34
    一、MySQL数据类型 主要包括以下五大类: 整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT 浮点数类型:FLOAT、DOUBLE、DECIMAL 字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM ...
  • MySQL之JSON数据类型操作示例

    千次阅读 2018-12-19 16:58:54
    MYSQL5.7.8开始,就支持JSON数据类型的存储了。 对于行数据整体而言,基本的增删改查是一样的;对于json内部数据内容的操作函数,有: 准备工作: 一、确认MYSQL版本支持json字段类型 在MYSQL中执行select ...
  • 因为decimal是MySQL中存在的精准数据类型MySQL中数据类型有:float,double等非精准数据类型和decimal这种精准。 区别:float,double等非精准类型,DB保存的是近似值。 Decimal则以字符串的形式保存精确的...
  • 为了提高效率,我们需要将...查询是否存在时间大于’2021-03-05’的且money大于0的数据,如果存在(可能有多条,包括只有1条)返回int类型,1;如果不存在,则返回0 select exists (SELECT * from a where money
  • MySQL中使用浮点数类型和定点数类型来表示小数。 浮点数类型包括单精度浮点数(float型)和双精度浮点数(double型)。定点数类型就是decimal型。 OK,现在我们来看看这几种数据类型的取值范围和存数的字节数。 ...
  • MySQL 数据类型 MySQL ,有三种主要的类型:Text(文本)、Number(数字)和 Date/Time(日期/时间)类型。 Text 类型: 数据类型 描述 CHAR(size) 保存固定长度的字符串(可包含字母、数字以及...
  • mysql中 text类型字段的值查询出来

    千次阅读 2019-06-28 15:51:44
    最近公司进行开发项目时,发现mysql中text类型的字段查询出来。翻来倒去知道是啥个原因。最终个人经过苦思冥想,翻阅百度也没有明确指出问题,还是配合着自己的绝顶思维模式终于找出问题关键所在。 下面发出一...
  • mysql小数数据类型

    千次阅读 2016-11-13 13:29:00
    浮点型四舍五入的时候还会看决定是舍还是入的那一位的下一位是否存在不存在(是否非0)则直接截断,存在才会四舍五入。我们通过第三条和第四条和第六条数据作比较可以得到这个结论。 同时我们声明精度和标度...
  • MySQL中JSON数据类型的操作和分析

    万次阅读 2017-08-15 21:34:32
    JSON作为以键值对为主的存储形式,符合很多业务场景,尤其对于pythondict字典数据类型,能直接相互转换,更加适应了python...这里本文先列举MySQL中对一些JSON数据类型的常用语句和函数(参考MySQL官方文档,建议大家
  • MySQL ,有三种主要的类型:文本、数字和日期/时间...数据类型 描述 CHAR(size) 保存固定长度的字符串(可包含字母、数字以及特殊字符)。括号指定字符串的长度。最多 255 个字符。 VARCHAR(si...
  • MySQL数据类型varchar详解

    万次阅读 2016-03-25 09:41:30
    这篇文章详细介绍了MySQL数据类型varchar,探讨varchar到底能存多长的数据、InnoDB和MyISAM的varchar等问题,需要的朋友可以参考下
  • MySQL 5.7 JSON 数据类型使用总结

    万次阅读 2019-03-30 14:39:40
    从版本5.7.8开始,mysql开始支持json数据类型,json数据类型存储时会做格式检验,满足json格式会报错,json数据类型默认值允许为空。 二、简单使用示例 数据准备 create table json_tab ( id int unsigned ...
  • 都知道C语言有int(4个...下面这张表是MySQL数据类型分类: 下面我们来具体看看这些类型的具体应用和如何应用: 数值类型 tinyint类型 从表我们可以观察到tinyint类型的范围是-128~127 我们先创建一个表: ...
  • 我们平时用sql语句建数据库的时候,总是会写到int(11),...首先,我们创建一个数据表test:mysql> CREATE TABLE test( -> id1 int(1), -> id2 tinyint(1) ->);此处的有符号和无符号怎么区别? 给一个字段加上UNSIG
  • MySQL-存储过程(数据类型、函数)

    千次阅读 2019-05-25 03:33:45
    主要介绍存储过程的创建,注意事项,数据类型,常用函数。
  • MySQL数据类型

    万次阅读 2020-08-03 21:01:52
    MySQL数据类型 数值类型 类型 占用字节数 最小值~最大值(有符号) 最小值~最大值(无符号) tinyint 1 -128~127 0~255 smallint 2 -215~215-1 0~2^16-1 mediumint 3 -223~223-1 0~2^24-1 int/integer...
  • 使用shp2mysql将shp数据导成sql文件 执行命令时提示Function GeometryFromText doesn't exist 一直没找到解决办法,求解! 贴上代码: CREATE TABLE bd (ID INT NOT NULL PRIMARY KEY , USERID INT, ID_BD ...
  • mysql基本数据类型详解

    万次阅读 2016-05-26 16:25:34
    MySQL与SQLServer的数据类型大同小异。因此,可以忽略与SQLServer相同的地方,SQLServer的基础上学习。 一、整型的显示宽度  MySQL数据类型与SQLServer有些不同,其定义的基本形式如下: 整型类型(显示...
  • updatetablenamesets_role='' altertabletablenamemodifycolumns_roleint(11) 转载于:https://www.cnblogs.com/zhaomeizi/p/10071392.html
  • mysql 数据类型转换

    千次阅读 热门讨论 2020-12-28 11:55:34
    有一张如下图所示的表,需要我们查出 result 值大于 reference_high值的数据 然后我们写了下面的SQL查询语句 SELECT i.result,i.reference_high FROM report_item i LEFT JOIN report r ON r.id=i.report_id ...
  • mysql float数据类型和decimal数据类型

    千次阅读 2017-07-10 14:07:23
    我们知道在MySQL中有3种类型可以表示实数,分别是float,double和decimal。关于如何合理得使用这三种类型,网上的答案也层出不穷。但是究竟该选择哪一种类型,好像并没有统一的答案,接下来,将通过一个例子来说明...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,347
精华内容 123,338
关键字:

在mysql中不存在的数据类型

mysql 订阅