mysql建表时,每个字段的属性有三个选项: binary,unsigned,unsigned zerofill,作用如下:

一、binary

CHAR VARCHAR:值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键字。使用BINARY的例子见

mysql查询不区分大小写问题分析和解决

mysql 字符串类型及二进制字符串类型大小写比较

二、unsigned

既为非负数,用此类型可以增加数据长度!

例如如果    tinyint最大是127,那    tinyint    unsigned    最大   就可以到    127 * 2

unsigned 属性只针对整型,而binary属性只用于char 和varchar。

类型说明

说明

取值范围

存储需求

tinyint[(m)]

非常小的整数

有符号值:-128 到127(- 27 到27 - 1)

无符号值:0到255(0 到28 - 1) 1个字节

1字节

smallint[(m)]

较小整数

有符号值:-32768 到32767(- 215 到215 - 1)

无符号值:0到65535(0 到21 6 - 1) 2个字节

2字节

mediumint[(m)]

中等大小整数

有符号值:-8388608 到8388607(- 22 3 到22 3 - 1 )

无符号值:0到16777215(0 到22 4 - 1) 3个字节

3字节

int[(m)]

标准整数

有符号值:-2147683648 到2147683647(- 231 到231- 1)

无符号值:0到4294967295(0 到232 - 1) 4个字节

4字节

bigint[(m)]

较大整数

有符号值:-9223372036854775808 到9223373036854775807(- 263到263-1)

无符号值:0到18446744073709551615(0到264 – 1) 8个字节

8字节

float[(m, d)]

单精度浮点数

最小非零值:±1.175494351e - 38

4字节

double[(m,d)]

双精度浮点数

最小非零值:±2.2250738585072014e - 308

8字节

decimal (m, d)

一个串的浮点数

可变;其值的范围依赖于m 和d

m字节(mysql < 3.23),m+2字节(mysql > 3.23 )

mysql提供了五种整型: tinyint、smallint、mediumint、int和bigint。int为integer的缩写。这些类型在可表示的取值范围上是不同的。 整数列可定义为unsigned从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大

mysql 提供三种浮点类型: float、double和decimal。与整型不同,浮点类型不能是unsigned的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。

unsigned注意事项:

1. UNSIGNED

UNSIGNED属性就是将数字类型无符号化,与C、C++这些程序语言中的unsigned含义相同。例如,INT的类型范围是-2 147 483 648 ~ 2 147 483 647, INT UNSIGNED的范围类型就是0 ~ 4 294 967 295。

在MYSQL中整型范围:

类型                 大小            范围(有符号)                              范围(无符号) 用途

TINYINT           1 字节    (-128,127)                                    (0,255) 小整数值

SMALLINT        2 字节    (-32 768,32 767)                           (0,65 535) 大整数值

MEDIUMINT     3 字节    (-8 388 608,8 388 607)                  (0,16 777 215) 大整数值

INT或INTEGER  4 字节    (-2 147 483 648,2 147 483 647)     (0,4 294 967 295) 大整数值

看起来这是一个不错的属性选项,特别是对于主键是自增长的类型,因为一般来说,用户都希望主键是非负数。然而在实际使用中,UNSIGNED可能会带来一些负面的影响,示例如下:

mysql> CREATE TABLE t ( a INT UNSIGNED, b INT UNSIGNED )

ENGINE=INNODB;

Query OK, 0 rows affected (0.06 sec)

mysql> INSERT INTO t SELECT 1,2;

Query OK, 1 row affected (0.00 sec)

Records: 1 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM t\G;

*************************** 1. row ***************************

a: 1

b: 2

1 row in set (0.00 sec)

我们创建了一个表t,存储引擎为InnoDB。表t上有两个UNSIGNED的INT类型。输入(1,2)这一行数据,目前看来都没有问题,接着运行如下语句:

SELECT a - b FROM t

这时结果会是什么呢?会是-1吗?答案是不确定的,可以是-1,也可以是一个很大的正值,还可能会报错。

*************************** 1. row ***************************

a - b: 4294967295

1 row in set (0.00 sec)

在发生上述这个问题的时候,有开发人员跑来和笔者说,他发现了一个MySQL的Bug,MySQL怎么会这么“傻”呢?在听完他的叙述之后,我写了如下的代码并告诉他,这不是MySQL的Bug,C语言同样也会这么“傻”。

上述代码的运行结果是:

a - b: -1

a - b: 4294967295

可以看到,在C语言中a-b也可以返回一个非常巨大的整型数,这个值是INT UNSIGNED的最大值。难道C语言也发生了Bug?这怎么可能呢?

这个问题的核心是,在MySQL数据库中,对于UNSIGNED数的操作,其返回值都是UNSIGNED的。而正负数这个问题在《MySQL技术内幕:InnoDB存储引擎》中有更深入的分析,有兴趣的可以进一步研究。

后面会对SQL_MODE进一步讨论,这里不进行深入的讨论。笔者个人的看法是尽量不要使用UNSIGNED,因为可能会带来一些意想不到的效果。另外,对于INT类型可能存放不了的数据,INT UNSIGNED同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型。

结论:如果使用unsigne并且在where子句后出现两列相减值小于0((a-b)<0),在查询时,linux上的Mysql会将负数转换成unsigned后再进行查询( (-2576+4294967295+1)>86374,  (-105849+4294967295+1)>86374 )。

三、zerofill

那这个int[M]中M是什么意义喃,在定义数值型数据类型的时候,可以在关键字括号内指定整数值(如:int(M),M的最大值为255)显示最大显示宽度,显示宽度M与数据所占用空间,数值的范围无关。 如果在定义字段的时候指定zerofill,那么当数值的显示宽度小于指定的列宽度时候,则默认补充的空格用0代替

mysql> use test
Database changed
mysql> create table int_12(id int(12) zerofill);
Query OK, 0 rows affected (0.03 sec)

mysql> desc int_12;
+-------+---------------------------+------+-----+---------+-------+
| Field | Type                      | Null | Key | Default | Extra |
+-------+---------------------------+------+-----+---------+-------+
| id    | int(12) unsigned zerofill | YES  |     | NULL    |       |
+-------+---------------------------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into int_12(id) values(1);
Query OK, 1 row affected (0.00 sec)

mysql> select * from int_12;
+--------------+
| id           |
+--------------+
| 000000000001 |
+--------------+
1 row in set (0.00 sec)

mysql> alter table int_12 change id id int(23) zerofill;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from int_12;
+-------------------------+
| id                      |
+-------------------------+
| 00000000000000000000001 |
+-------------------------+
1 row in set (0.00 sec)

mysql> 

binary(binary区分大小写),unsigned,unsigned zerofill关键字介绍的更多相关文章

  1. MySQL中UNSIGNED和ZEROFILL的介绍

    UNSIGNED: 将数字类型无符号化,这与C和C++这些程序语言的unsigned含义相同. INT的类型范围-2 147 483 648~2 147 483 647 INT UNSIGNED范围0 ...

  2. iOS开发——总结篇&关键字介绍

    关键字介绍 在做iOS开发中,系统的各个关键字处处都是,但是未必每一个关键字都是那么的明白,所以罗列出一些关键字供大家互相学习,有不完善之处请指正,谢谢 atomic atomic是Objc使用的一种 ...

  3. O-C相关06:self和super关键字介绍——self关键字

    self关键字介绍 1.self和super OC 版权声明:本文为博主原创文章,未经博主允许不得转载. posted @ 2015-08-04 12:46 王刚韧(wanghy_iOS) 阅读(.. ...

  4. Objective-C--@property,@synthesize关键字介绍

    Objective-C–@property,@synthesize关键字介绍 转载:http://www.cnblogs.com/QM80/p/3576282.html /** 注意:由@proper ...

  5. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  6. Robot Framework常用关键字介绍

    常用关键字介绍 在学习一门编程语言的时候,大多教材都是从打印“hello world”开始.我们可以像编程语言一样来学习 Robot Framework.虽然通过 RIDE 提供“填表”一样的写测试用 ...

  7. 二、robotframework接口测试-常用关键字介绍

    1.常用关键字介绍: a. 打印:log                                                  用法:log   打印内容 ---------------- ...

  8. abstract和interface关键字介绍

    一.abstract关键字介绍 abstract可以修饰方法.类.使用abstract修饰的方法和类分别叫做抽象方法和抽象类. 1.抽象方法 抽象方法的定义:指可以通过abstract关键字声明的方法 ...

  9. Robotframework自动化6-基础关键字介绍3

    这一章节介绍一下断言时用到的关键字,断言是写测试用例的必备,没有断言的测试用例是没有灵魂的. 一:Should Be Equal  Should Be Equal 是用来判断实践结果和预期结果是否一致 ...

随机推荐

  1. Socket TCP客户端和服务器的实现

    import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.S ...

  2. 【译】第一篇 SQL Server安全概述

    本篇文章是SQL Server安全系列的第一篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...

  3. JSR

    JSR是Java Specification Requests的缩写,意思是Java 规范提案.是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求.任何人 ...

  4. DeepLearning.ai-Week4-Deep Learning & Art: Neural Style Transfer

    1 - Task Implement the neural style transfer algorithm Generate novel artistic images using your alg ...

  5. linux中创建python的虚拟环境

    1,何为虚拟环境 linux是支持多用户的系统,如果某一位用户不想使用公用环境,想指定特殊的python版本安装仅供个人使用的一些包,那么虚拟环境将满足他的要求 2,虚拟环境使用需要virtualen ...

  6. 20165237 2017-2018-2 《Java程序设计》第4周学习总结

    20165237 2017-2018-2 <Java程序设计>第4周学习总结 教材学习内容总结 1.子类只能有一个父类,父类可以有多个子类. 2.子类继承父类的成员变量和方法. 3.开闭原 ...

  7. 不指定虚拟路径的前提下通过http访问pdf、图片等文件

    通常我们通过http访问图片或者pdf的时候都是将文件上传到指定文件夹下面,然后通过配置虚拟路径来访问指定的资源. 在不配置虚拟路径的情况下,我们通过获取到response的outpurstream, ...

  8. css3 特效拓展 画个安卓机器人

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 配置Oracle GoldenGate安全性

    本章介绍如何配置Oracle GoldenGate安全性. 本章包括以下部分: Overview of Oracle GoldenGate Security Options Encrypting Da ...

  10. python 导入numpy 导致多进程绑定同一个CPU问题解决方法

    python 如果有导入numpy模块的import语句,会导致默认将多进程程序的每个进程都绑定到同一个CPU core上, 失去了多进程在多核CPU上的性能优越性,这和CPU affinity(CP ...