精华内容
下载资源
问答
  • 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...

    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 4 -231~231-1 0~2^32-1
    bigint 8 -263~263-1 0~2^64-1

    bit(m):m代表二进制数值的位数,范围从0~64,缺省值为1。

    bool/boolean:布尔类型,0为false,非0值为true。true和false仅仅只是1和0的别名。

    decimal/dec(m,d):m表示整个数字的长度,d表示小数位的长度,如果数值为负数,负号不包含在m里面。m的最大值为65,d的最大值为30,m的缺省值为10,d的缺省值为0。

    无符号与有符号的区别,无符号表示禁止负数,取值从0开始。无符号在进行运算时超出精确范围时会报错,如下:

    mysql> create table test_unsigned(a int unsigned, b int unsigned);
    mysql> insert into test_unsigned values(1, 2);
    mysql> select b - a from test_unsigned;
    +-------+
    | b - a |
    +-------+
    |     1 |
    +-------+
    mysql> select a - b from test_unsigned; --运行出错
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`test`.`test_unsigned`.`a` - `test`.`test_unsigned`.`b`)'
    

    int(n)是什么?

    create table test_int_n(a int(4) zerofill);
    insert into test_int_n values(1);
    insert into test_int_n values(123456);
    
    • int(n)中的n 是显示宽度,不表示存储的数字的长度的上限。
    • zerofill表示当存储的数字 长度<N时,用数字0填充左边,直至补满长度n,这一点用命令行才能看出,有些工具不会显示前面的0。
    • 当存储数字的长度超过n时 ,按照实际存储的数字显示。
    • 当没有zerofill时,n没有任何作用。

    主键自动增长问题,下面的sql语法有错误吗?

    create table test_auto_increment(a int auto_increment);
    create table test_auto_increment(a int auto_increment primary key);
    

    只有列的类型为整型,并且这列有索引时才能自增。

    以下结果是什么?

    mysql> insert into test_auto_increment values(null);
    mysql> insert into test_auto_increment values(0);
    mysql> insert into test_auto_increment values(-1);
    mysql> insert into test_auto_increment values(null),(100),(null),(10),(null);
    mysql> select * from test_auto_increment;
    +-----+
    | a   |
    +-----+
    |  -1 |
    |   1 |
    |   2 |
    |   3 |
    |  10 |
    | 100 |
    | 101 |
    | 102 |
    +-----+
    

    结论:

    • 当插入的值为null或0时,主键列会自增,自增后的值会是所有列中的最大的值+1。
    • 当插入的值为负数时,如果这个值不存在,则直接插入。
    • 当插入的值为正数时,如果这个值不存在,则直接插入。
    • 当最大的值所在记录被删除后,后面插入的记录仍然会从最大值开始自增。
    • 使用delete删除所有的数据后,主键依然会从曾经的最大值开始自增,而使用truncate则会从1开始重新开始自增。

    字符类型

    类型 说明 N的含义 是否有字符集 最大长度
    char(n) 定长字符 字符 255
    varchar(n) 变长字符 字符 65535
    binary(n) 定长二进制字节 字节 255
    varbinary(n) 变长二进制字节 字节 65535
    tinyblob 二进制大对象 字节 255
    blob(n) 二进制大对象 字节 65535
    mediumblob(n) 二进制大对象 字节 16M
    longblob(n) 二进制大对象 字节 4G
    tinytext(n) 大对象 字节 256
    text(n) 大对象 字节 65535
    mediumtext(n) 大对象 字节 16M
    longtext(n) 大对象 字节 4G

    字符集的排序规则:

    select 'a' = 'A'; -- 0
    create table test_ci (a varchar(10), key(a));
    insert into test_ci values('a');
    insert into test_ci values('A');
    select * from test_ci where a = 'a'; -- 结果是什么?
    set names utf8mb4 collate utf8mb4_bin;
    select 'a' = 'A'; -- 1
    

    字符串的大小写敏感与建表时或字段上设置的字符串大小写敏感有关。xxx_bin字符集大小写敏感,xxx_ci(case insensitive)字符集大小写不敏感。

    时间类型

    日期类型 占用空间(字节数) 表示范围
    date 4 1000-01-01 ~ 9999-12-31
    datetime 8 1000-01-01 00:00:00.000000 ~ 9999-12-31 23:59:59.999999
    timestamp 4 1970-01-01 00:00:00.000000UTC ~ 2038-01-19 03:14:07.000000UTC
    year 1 1901-2155
    time 3 -838:59:59.000000 ~ 838:59:59.000000

    datatime与timestamp区别:

    mysql> insert into test_time values (now(), now());
    mysql> select * from test_time;
    +---------------------+---------------------+
    | a                   | b                   |
    +---------------------+---------------------+
    | 2020-08-02 09:30:46 | 2020-08-02 09:30:46 |
    +---------------------+---------------------+
    mysql> select @@time_zone;
    +-------------+
    | @@time_zone |
    +-------------+
    | SYSTEM      |
    +-------------+
    mysql> set time_zone='+00:00';
    mysql> select * from test_time;
    +---------------------+---------------------+
    | a                   | b                   |
    +---------------------+---------------------+
    | 2020-08-02 13:30:46 | 2020-08-02 09:30:46 |
    +---------------------+---------------------+
    

    JSON类型

    mysql> create table json_user(id int primary key auto_increment, data json);
    mysql> insert into json_user values(0, '{"name":"morris","age":18,"address":"china"}');
    mysql> insert into json_user values(0, '{"name":"tom","age":16,"mail":"tomcat@google.com"}');
    mysql> select * from json_user;
    +----+---------------------------------------------------------+
    | id | data                                                    |
    +----+---------------------------------------------------------+
    |  1 | {"age": 18, "name": "morris", "address": "china"}       |
    |  2 | {"age": 16, "mail": "tomcat@google.com", "name": "tom"} |
    +----+---------------------------------------------------------+
    

    json_extract:抽取数据。

    mysql> select json_extract('[1, 2, 3, [4, 5]]', '$[1]');
    +-------------------------------------------+
    | json_extract('[1, 2, 3, [4, 5]]', '$[1]') |
    +-------------------------------------------+
    | 2                                         |
    +-------------------------------------------+
    mysql> select json_extract(data, '$.name') from json_user;
    +------------------------------+
    | json_extract(data, '$.name') |
    +------------------------------+
    | "morris"                     |
    | "tom"                        |
    +------------------------------+
    

    json_object:将对象转为json。

    mysql> insert into json_user values(0, json_object('name','bob','age','22','email','bob@sina.com'));
    mysql> select * from json_user where id=3;
    +----+-------------------------------------------------------+
    | id | data                                                  |
    +----+-------------------------------------------------------+
    |  3 | {"age": "22", "name": "bob", "email": "bob@sina.com"} |
    +----+-------------------------------------------------------+
    

    json_insert:插入数据,key存在则忽略,不存在则插入。

    mysql> update json_user set data=json_insert(data, '$.sex', 'male', '$.age', 20) where id = 1;
    mysql> select * from json_user where id=1;
    +----+------------------------------------------------------------------+
    | id | data                                                             |
    +----+------------------------------------------------------------------+
    |  1 | {"age": 18, "sex": "male", "name": "morris", "address": "china"} |
    +----+------------------------------------------------------------------+
    

    jsson_merge:合并数据后返回。

    mysql> select json_merge('{"name": "enjoy"}', '{"id": 47}');
    +-----------------------------------------------+
    | json_merge('{"name": "enjoy"}', '{"id": 47}') |
    +-----------------------------------------------+
    | {"id": 47, "name": "enjoy"}                   |
    +-----------------------------------------------+
    

    JSON索引

    JSON类型数据本身无法直接创建索引,需要将需要索引的JSON数据重新生成虚拟列(Virtual Columns)之后,对该列进行索引。

    mysql> create table test_json_index(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (json_extract(data, '$.name')));
    mysql> insert into test_json_index(data) values('{"name":"morris","age":18,"address":"china"}');
    mysql> insert into test_json_index(data) values('{"name":"tom","age":16,"mail":"tomcat@google.com"}');
    mysql> select * from test_json_index;
    +----+---------------------------------------------------------+----------+
    | id | data                                                    | gen_col  |
    +----+---------------------------------------------------------+----------+
    |  1 | {"age": 18, "name": "morris", "address": "china"}       | "morris" |
    |  2 | {"age": 16, "mail": "tomcat@google.com", "name": "tom"} | "tom"    |
    +----+---------------------------------------------------------+----------+
    mysql> select * from test_json_index where gen_col='morris'; -- 查不到数据
    mysql> select * from test_json_index where gen_col='"morris"';
    +----+---------------------------------------------------+----------+
    | id | data                                              | gen_col  |
    +----+---------------------------------------------------+----------+
    |  1 | {"age": 18, "name": "morris", "address": "china"} | "morris" |
    +----+---------------------------------------------------+----------+
    

    要想在查询时不加引号,可以在加索引时使用json_unquote去除引号。

    mysql> create table test_json_index2(id int primary key auto_increment, data json, gen_col varchar(10) generated always as (json_unquote(json_extract(data, '$.name'))));
    

    更多json函数参考https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html。

    更多精彩内容关注本人公众号:架构师升级之路
    在这里插入图片描述

    展开全文
  • Mysql数据类型

    千次阅读 2019-02-17 11:36:28
    Mysql数据类型 目录 一. 数据类型的一些常识 二: Mysql中数据类型的分类 三. 整型 四: 浮点类型 五: 字符类型 六: 时间类型 七: 复合类型 八. 类型建表运用 九: 字段其他属性设置 一. 数据类型的一些常识 ...

    Mysql数据类型

    目录

    一. 数据类型的一些常识

    二: Mysql中数据类型的分类

    三. 整型

    四: 浮点类型

    五: 字符类型

    六: 时间类型

    七: 复合类型

    八. 类型建表运用

    九: 字段其他属性设置
    一. 数据类型的一些常识

    1. MySQL中存的是数据。

    2.只要是数据,我们就会规定数据的类型。

    3.在表的字段中规定了使用的是某个数据类型;那么,在插入的数据中就要使用对应的数据类型;并且,遵守数据类型的长度要求。
    二: Mysql中数据类型的分类

        数值类型(整型、浮点)
        字符串类型
        日期时间类型
        复合类型
        空间类型(非科学性工作基本不用)

    三. 整型
    MySQL数据类型     所占字节     值范围
    tinyint     1字节     -128~127
    smallint     2字节     -32768~32767
    mediumint     3字节     -8388608~8388607
    int     4字节     范围-2147483648~2147483647
    bigint     8字节     +-9.22*10的18次方

    1.整型的长度不同,在实际使用过程也就不同。

    2.MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

    3.注意:

        在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
        同样人类年龄也是,在创建表字段时可用无符号的整型。因为人类的年龄还没有负数
        在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。

    四: 浮点类型
    MySQL数据类型     所占字节     值范围
    float(m, d)     4字节     单精度浮点型,m总个数,d小数位
    double(m, d)     8字节     双精度浮点型,m总个数,d小数位
    decimal(m, d)           decimal是存储为字符串的浮点数

    注意:

        浮点是非精确值,会存在不太准确的情况
        而decimal叫做定点数。在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型。

    五: 字符类型
    MySQL数据类型     所占字节     值范围
    CHAR     0-255字节     定长字符串
    VARCHAR     0-255字节     变长字符串
    TINYBLOB     0-255字节     不超过255个字符的二进制字符串
    TINYTEXT     0-255字节     短文本字符串
    BLOB     0-65535字节     二进制形式的长文本数据
    TEXT     0-65535字节     长文本数据
    MEDIUMBLOB     0-16 777 215字节     二进制形式的中等长度文本数据
    MEDIUMTEXT     0-16 777 215字节     中等长度文本数据
    LOGNGBLOB     0-4 294 967 295字节     二进制形式的极大文本数据
    LONGTEXT     0-4 294 967 295字节     极大文本数据
    VARBINARY(M)     允许长度0-M个字节的定长字节符串     值的长度+1个字节
    BINARY(M)     M     允许长度0-M个字节的定长字节符串

    1. *CHAR *类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。


    2.*VARCHAR  *把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度,类型不会被空格填补,但长于指示器的值仍然会被截短。因为 VARCHAR 类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。

    3.text类型与blob类型对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

    4.TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。
    六: 时间类型
    MySQL数据类型     所占字节     值范围
    date     3字节     日期,格式:2014-09-18
    time     3字节     时间,格式:08:42:30
    datetime     8字节     日期时间,格式:2014-09-18 08:42:30
    timestamp     4字节     自动存储记录修改的时间
    year     1字节     年份

    注意:

        时间类型在web系统中用的比较少,很多时候很多人喜欢使用int来存储时间。插入时插入的是unix时间戳,因为这种方式更方便计算。在前端业务中用date类型的函数,再将unix时间戳转成人们可识别的时间。
        上面的类型你可以根据实际情况实际进行选择
        有些人为了在数据库管理中方便查看,也有人使用datetime类型来存储时间。

    七: 复合类型
    MySQL数据类型     说明     举例
    set     集合类型     set(“member”, “member2″, … “member64″)
    enum     枚举类型     enum(“member1″, “member2″, … “member65535″)

          一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。

    1. ENUM 类型

    ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用null值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL会自动使用插入值的大小写转换成与集合中大小写一致的值。

    ENUM 类型在系统内部可以存储为数字,并且从1开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

    MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。

    2. SET 类型SET 类型与 ENUM 类型相似但不相同。SET类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使MySQL插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。

    一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。
    并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。
    希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。
    八. 类型建表运用

    在创建表的语句的时候使用对应的类型

        create table if not exists demo (
           id int(11) NOT NULL,
           username varchar(50) NOT NULL,
           password char(32) NOT NULL,
           content longtext NOT NULL,
           createtime datetime NOT NULL,
           sex tinyint(4) NOT NULL
         ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    九: 字段其他属性设置

    1. UNSIGNED(无符号)主要用于整型和浮点类型,使用无符号。即,没有前面的-(负号)。

        存储位数更长。tinyint整型的取值区间为,-128~127。而使用无符号后可存储0-255个长度。

        创建时在整型或浮点字段语句后接上: unsigned        ;

    2. ZEROFILL(0填充)0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。

        创建时在整型或浮点字段语句后接上:zerofill

    3. defaultdefault属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。

       创建时在整型或浮点字段语句后接上: default '值'

    4. not null如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。

      创建时在整型或浮点字段语句后接上:not null

    5. null为列指定null属性时,该列可以保持为空,而不论行中其它列是否已经被填充。记住,null精确的说法是“无”,而不是空字符串或0。

    创建时在整型或浮点字段语句后不要声明not null即可。

    展开全文
  • MySql 数据类型

    万次阅读 2018-06-06 14:39:42
    Mysql支持的多种数据类型主要有:数值数据类型、日期/时间类型、字符串类型。 整数 浮点数&定点数 注:定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算...

    Mysql支持的多种数据类型主要有:数值数据类型、日期/时间类型、字符串类型。

     

    整数

    浮点数&定点数

    :定点数以字符串形式存储,对精度要求高时使用decimal较好;尽量避免对浮点数进行减法和比较运算。 

    时间/日期类型

    字符串类型

    blog-二进制大对象,用来存储可变数量的数据。

                                                                                                                                                                                                 

     

    int(11)

     

        在SQL语句中int代表你要创建字段的类型,int代表整型,11代表字段的长度。
     这个11代表显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。
      int是整型,(11)是指显示字符的长度,但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0
      声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是 INT整型所允许的最大值。

    -------------------------------------------------------------------------------------

     

    mysql日期和字符相互转换方法

    date_format(date,'%Y-%m-%d %H:%i:%s')    -------------->oracle中的to_char();

    str_to_date(date,'%Y-%m-%d %H:%i:%s')     -------------->oracle中的to_date();

    %Y:代表4位的年份
    %y:代表2为的年份
     
    %m:代表月, 格式为(01……12)  
    %c:代表月, 格式为(1……12)
     
    %d:代表月份中的天数,格式为(00……31)  
    %e:代表月份中的天数, 格式为(0……31) 
     
    %H:代表小时,格式为(00……23)  
    %k:代表 小时,格式为(0……23)  
    %h: 代表小时,格式为(01……12)  
    %I: 代表小时,格式为(01……12)  
    %l :代表小时,格式为(1……12)
      
    %i: 代表分钟, 格式为(00……59) 

    %r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)  
    %T:代表 时间,格式为24 小时(hh:mm:ss) 

    %S:代表 秒,格式为(00……59)  

    %s:代表 秒,格式为(00……59) 

    -----------------------------------------------------------------

    mysql 取一条离当前时间最近的记录
    # mysql写法
    SELECT *, ABS(NOW() - startTime)  AS diffTime
    FROM PolicyShuPrice
    ORDER BY diffTime ASC

    LIMIT 0, 1

    ###########

    select  t.road_length, t.practitioner_num,  t.stations_num,
    t.bridge_num, t.tunnel_num, date_format(t.index_time,'%Y-%m-%d %h:%i:%s')
    from ix_road_basic_data  t
    where t.index_time = (select max(index_time) from ix_road_basic_data)
    limit 1

    # oracle写法
    SELECT * FROM (
        SELECT *, ABS(NOW() - startTime) AS diffTime
        FROM PolicyShuPrice
        ORDER BY diffTime ASC 

    ) C WHERE rownum=1

     

    MYSQL类型与JAVA类型对应表:

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int)
    VARCHAR L+N VARCHAR java.lang.String 12
    CHAR N CHAR java.lang.String 1
    BLOB L+N BLOB java.lang.byte[] -4
    TEXT 65535 VARCHAR java.lang.String -1
    INTEGER 4 INTEGER UNSIGNED java.lang.Long 4
    TINYINT 3 TINYINT UNSIGNED java.lang.Integer -6
    SMALLINT 5 SMALLINT UNSIGNED java.lang.Integer 5
    MEDIUMINT 8 MEDIUMINT UNSIGNED java.lang.Integer 4
    BIT 1 BIT java.lang.Boolean -7
    BIGINT 20 BIGINT UNSIGNED java.math.BigInteger -5
    FLOAT 4+8 FLOAT java.lang.Float 7
    DOUBLE 22 DOUBLE java.lang.Double 8
    DECIMAL 11 DECIMAL java.math.BigDecimal 3
    BOOLEAN 1 同TINYINT    
    ID 11 PK (INTEGER UNSIGNED) java.lang.Long 4
    DATE 10 DATE java.sql.Date 91
    TIME 8 TIME java.sql.Time 92
    DATETIME 19 DATETIME java.sql.Timestamp 93
    TIMESTAMP 19 TIMESTAMP java.sql.Timestamp 93
    YEAR 4 YEAR java.sql.Date 91
    展开全文
  • mysql数据类型

    千次阅读 2018-08-05 14:54:33
     要了解一个数据库,我们也必须了解其支持的数据类型Mysql支持所有标准的SQL数据类型,主要分为以下三类:  第一类:数值类型  第二类:字符串类型  第三类:时间日期类型  除了上面几种数据类型之外还有...

    1、概述

           要了解一个数据库,我们也必须了解其支持的数据类型,Mysql支持所有标准的SQL数据类型,主要分为以下三类:

           第一类:数值类型

           第二类:字符串类型

           第三类:时间日期类型

           除了上面几种数据类型之外还有几何数据类型,布尔数据类型等,不做介绍

    总结一下:

    (1)数值类型12种:

            整数类型有6种(int,integer,tingint,smallint,mediumint,bigint),定点数2种(decimal(M,D)和numeric(D,M))浮点类型3种(float(M,D),real(M,D),double(M,D)),bit(M)类型一种。

    (2)字符串类型有14种:

             char(定长字符串),varchar(非定常字符串),binary(定长二进制串),varbinary(非定长二进制串)存储大的二进制串的blob类型有四种(tingblob,blob,mediumblob,longblob)存储大的字符串文本的text类型有四种(tingtext,text,mediumtext,longtext) 还有enum,set两种类型

    (3)时间日期类型有5种:

             date(YYYY-MM-DD),datetime(YYYY-MM-DD HH:MM:SS),

             timestamp(YYYY-MM-DD HH:MM:SS)  time(HH:MM:SS),year(YYYY)5种。

    2、数值类型(12种)

    2.1、整数类型(6种)

     整数类型有6种,分别是int,integer,tinyint,smallint,mediumint,bigint。其中int和integer相同详细信息如下图表所示:

                    类型     存储            最小值                最大值
      (Bytes)    (Signed/Unsigned)          (Signed/Unsigned)
    TINYINT 1 -128 127
        0 255
    SMALLINT 2 -32768 32767
        0 65535
    MEDIUMINT 3 -8388608 8388607
        0 16777215
    INT 4 -2147483648 2147483647
        0 4294967295
    BIGINT 8 -9223372036854775808 9223372036854775807
        0 18446744073709551615

    2.2、定点数(2种)

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

    使用方式如下:

    salary DECIMAL(5,2)

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

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

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

       (2) 如果存储时,小数点部分若超出范围,就分以下情况:若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。 如:999.994实际被保存为999.99。

       (3) 若四舍五入后,整数部分超出范围,则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~255FLOAT只保证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标准插入会失败。

        下面是官方示例:

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

    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)列后的结果:

      值    CHAR(4)      存储      VARCHAR(4)     存储
        “        ‘    ’ 4个字节                ”  1个字节
      ‘ab’       'ab  ' 4个字节              'ab  '  3个字节
    ‘abcd’      'abcd' 4个字节             'abcd'  5个字节
    ‘abcdefgh’      'abcd' 4个字节             'abcd'  5个字节

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

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

    3.2、BINARY和VARBINARY类型(2种)

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

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

           对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要。当类型为BINARY的字段为主键时,应考虑上面介绍的存储方式。

    3.3、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.4、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。

     如下例:

    索引
    NULL NULL
    " 0
    'one' 1
    'two' 2
    'three' 3

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

     使用方式:

    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');
    SELECT name, size FROM shirts WHERE size = 'medium';
    UPDATE shirts SET size = 'small' WHERE size = 'large';

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

    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.5、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列检索数值值:

    mysql> SELECT set_col+0 FROM tbl_name;

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

    SET成员 十进制值 二进制值
    ‘a’ 1 0001
    'b' 2 0010
    'c' 4 0100
    'd' 8 1000

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

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

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

    结果:

    a,d 9
    a,d 9
    a,d 9
    a,d 9
    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字段即可:

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

    4、时间日期类型(5种)

     他们的“0”值如下:

    Data Type "Zero" Value
    DATE '0000-00-00'
    TIME '00:00:00'
    DATETIME '0000-00-00'
    TIMESTAMP '0000-00-00 00:00:00'
    YEAR 0000

     

    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。

    参考: http://blog.csdn.net/anxpp/article/details/51284106

     

    展开全文
  • MySQL 数据类型

    千次阅读 2020-08-05 16:47:03
    01 整型 02 日期和时间类型 03 字符串类型
  • MySQL数据类型

    千次阅读 2004-12-13 11:08:00
    MySQL数据类型 根据定义,数据库管理系统的目的就是管理数据。即使一条简单的SELECT 1语句也涉及表达式求值以产生一个整型数据值。MySQL中的每个数据值都有类型。例如, 37.4 是一个数,而“ a b c”是一个串。有时...
  • mysql数据类型转换

    千次阅读 2018-09-28 09:23:36
    mysql数据类型转换 数字类型转换字符串类型 1、将Int 转为varchar经常用 concat函数,concat(xxx,类型) 比如: concat(8,’0′) 得到字符串 ’80′ 比如将123转换为char类型 SELECT CAST(123 AS CHAR); ...
  • Mysql系列第二讲 详解mysql数据类型(重点)

    万次阅读 多人点赞 2020-09-10 10:56:12
    Mysql系列第二讲MySQL数据类型整数类型示例1:有符号类型示例2:无符号类型类型(n)说明示例1(重点)示例2日期类型字符串类型mysql类型和java类型对应关系数据类型选择的一些建议 MySQL数据类型 主要包括以下五大...
  • Java数据类型和MySql数据类型对应关系
  • MySQL Connector/J 对于 MySql 数据类型和 Java 数据类型之间的转换是很灵活的。一般来讲,任何 MySql 数据类型都可以被转换为一个 java.lang.String,任何 MySql 数字类型都可以被转换为任何一种 Java 数字类型...
  • Mysql数据类型笔记整理

    千次阅读 2020-08-29 09:59:19
    mysql数据类型 MySql数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768)~32767 mediumint(m) 3个字节 范围(-8388608~8388607) int(m) 4个字节 范围...
  • mysql数据类型详解

    千次阅读 2018-01-07 23:56:14
    MySQL数据类型(列类型)可归纳为数值型、时间日期型和字符型号。 1.数值型 1.1整数型 tinyint(1), smallint(2), mediumint(3),int(4), bigint(8)。括号中表示该类型所占空间的长度(字节数) 取值范围 ...
  • MYSQL数据类型、范式及索引总结

    千次阅读 2021-01-02 15:42:53
    MySQL基础(MySQL5.1)MySQL的数据类型MySQL数据类型简介整数类型、浮点数类型和定点数类型日期与时间类型字符串类型二进制类型MySQL数据类型选择MySQL范式MySQL范式介绍MySQL范式联系与转化MySQL索引索引的含义及...
  • 一、MySQL数据类型 二、MySQL数据类型与Java数据类型对应关系
  • mysql数据类型长度
  • mysql 数据类型总结

    万次阅读 2018-10-24 21:07:33
    mysql 数据类型总结 数值型 整形(以下为signed,unsigned为无符号,自推) 类型 占用字节 范围 tinyint 1 (-128,127) smallint 2 (-2^8, 2^8-1) mediumint 3 (-2^12, 2^12-1) int 4 (-2^16, 2^16-1) ...
  • MySQL数据类型DECIMAL用法

    千次阅读 2018-10-16 20:34:45
    MySQL数据类型DECIMAL用法 MySQL DECIMAL数据类型用于在数据库中存储精确的数值。我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据。 要定义数据类型为DECIMAL的列,请使用以下语法:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,816
精华内容 22,726
关键字:

mysql数据类型

mysql 订阅