MySQL的基本类型

数值类型

1.整数类型

示例代码


mysql> create table tb_num(
    -> n1 tinyint,
    -> n2 tinyint not null,
    -> n3 smallint,
    -> n4 int(4),
    -> n5 int(4) zerofill
    -> );
Query OK, 0 rows affected (0.02 sec)


mysql> desc tb_num;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| n1    | tinyint(4)               | YES  |     | NULL    |       |
| n2    | tinyint(4)               | NO   |     | NULL    |       |
| n3    | smallint(6)              | YES  |     | NULL    |       |
| n4    | int(4)                   | YES  |     | NULL    |       |
| n5    | int(4) unsigned zerofill | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> show create table tb_num\G;
*************************** 1. row ***************************
       Table: tb_num
Create Table: CREATE TABLE `tb_num` (
  `n1` tinyint(4) DEFAULT NULL,
  `n2` tinyint(4) NOT NULL,
  `n3` smallint(6) DEFAULT NULL,
  `n4` int(4) DEFAULT NULL,
  `n5` int(4) unsigned zerofill DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


mysql> insert into tb_num values(10,20,30,400000,345);
Query OK, 1 row affected (0.00 sec)

mysql> select *from tb_num;
+------+----+------+--------+------+
| n1   | n2 | n3   | n4     | n5   |
+------+----+------+--------+------+
|   10 | 20 |   30 | 400000 | 0345 |
+------+----+------+--------+------+
1 row in set (0.00 sec)

mysql> insert into tb_num values(200,-1000,900,40000000000000000,345);
ERROR 1264 (22003): Out of range value for column 'n1' at row 1

mysql> insert into tb_num values(50,-1000,900,40000000000000000,345);
ERROR 1264 (22003): Out of range value for column 'n2' at row 1
mysql> insert into tb_num values(50,-50,900,40000000000000000,345);
ERROR 1264 (22003): Out of range value for column 'n4' at row 1

mysql> insert into tb_num values(50,-50,900,40000,346);
Query OK, 1 row affected (0.00 sec)

mysql> select *from tb_num;
+------+-----+------+--------+------+
| n1   | n2  | n3   | n4     | n5   |
+------+-----+------+--------+------+
|   10 |  20 |   30 | 400000 | 0345 |
|   50 | -50 |  900 |  40000 | 0346 |
+------+-----+------+--------+------+
2 rows in set (0.01 sec)
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中其实略有不同。


字符类型

示例代码

mysql> create table tb_str(
    -> str01 char(5) not null,
    -> str02 varchar(6),
    -> str03 text,
    -> str04 enum('1','0') default '1'
    -> );

mysql> desc tb_str;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| str01 | char(5)       | NO   |     | NULL    |       |
| str02 | varchar(6)    | YES  |     | NULL    |       |
| str03 | text          | YES  |     | NULL    |       |
| str04 | enum('1','0') | YES  |     | 1       |       |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> show create table tb_str\G;
*************************** 1. row ***************************
       Table: tb_str
Create Table: CREATE TABLE `tb_str` (
  `str01` char(5) NOT NULL,
  `str02` varchar(6) DEFAULT NULL,
  `str03` text,
  `str04` enum('1','0') DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> insert into tb_str values('szh','szh','yuioghjkvbnghjghjvbn','0');
Query OK, 1 row affected (0.00 sec)

mysql> select *from tb_str;
+-------+-------+----------------------+-------+
| str01 | str02 | str03                | str04 |
+-------+-------+----------------------+-------+
| szh   | szh   | yuioghjkvbnghjghjvbn | 0     |
+-------+-------+----------------------+-------+
1 row in set (0.01 sec)


时间和日期类型

示例代码

    -> da01 date,
    -> da02 datetime,
    -> da03 timestamp
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc tb_date;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| da01  | date      | YES  |     | NULL              |                             |
| da02  | datetime  | YES  |     | NULL              |                             |
| da03  | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
3 rows in set (0.00 sec)
mysql> insert into tb_date(da01,da02) values('2018-08-09',now());
Query OK, 1 row affected (0.00 sec)

mysql> select *from tb_date;
+------------+---------------------+---------------------+
| da01       | da02                | da03                |
+------------+---------------------+---------------------+
| 2018-08-09 | 2018-09-06 20:24:27 | 2018-09-06 20:24:27 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容