电子商务网站建设视频,网页更改,企业公示信息年报,海门做网站文章目录数据类型分类数值类型tinyint类型bit类型float类型decimal类型字符串类型char类型varchar类型char和varchar对比日期和时间类型enum和set类型数据类型分类 
MySQL中#xff0c;支持各种各样的类型#xff0c;比如表示数值的整型浮点型#xff0c;文本、二进制类型、…
文章目录数据类型分类数值类型tinyint类型bit类型float类型decimal类型字符串类型char类型varchar类型char和varchar对比日期和时间类型enum和set类型数据类型分类 
MySQL中支持各种各样的类型比如表示数值的整型浮点型文本、二进制类型、时间日期型和String类型。 数值类型 tinyint类型 
tinyint类型用于存放数值比较小的整数取值范围-128~127 
数值越界测试 
mysql create table t1 (- data tinyint- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t1;
----------------------------------------------
| Field | Type       | Null | Key | Default | Extra |
----------------------------------------------
| data  | tinyint(4) | YES  |     | NULL    |       |
----------------------------------------------
1 row in set (0.00 sec)mysql insert into t1 (data) values (1);
Query OK, 1 row affected (0.00 sec)mysql insert into t1 (data) values (128);
ERROR 1264 (22003): Out of range value for column data at row 1
mysql insert into t1 (data) values (-129);
ERROR 1264 (22003): Out of range value for column data at row 1mysql select * from t1;
------
| data |
------
|    1 |
------
1 row in set (0.00 sec)在C/C中如果赋值超出类型范围会发生对应的数据类型截断编译器不会报错但是在MySQL中数据必须具有很强的明确性超出数据类型的范围MySQL不允许插入数据。 所以在MySQL中数据类型是一种约束。 
说明: 
在MySQL中整型可以指定是有符号的和无符号的默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。 
案例 
mysql create table t2 (- data tinyint unsigned - )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t2;
-------------------------------------------------------
| Field | Type                | Null | Key | Default | Extra |
-------------------------------------------------------
| data  | tinyint(3) unsigned | YES  |     | NULL    |       |
-------------------------------------------------------
1 row in set (0.00 sec)mysql insert into t2 (data) values (255);
Query OK, 1 row affected (0.00 sec)mysql insert into t2 (data) values (-1);
ERROR 1264 (22003): Out of range value for column data at row 1mysql select * from t2;
------
| data |
------
|  255 |
------
1 row in set (0.00 sec)bit类型 
基本语法 
bit[(M)] : 位字段类型。M表示每个值的位数范围从1到64。如果M被忽略默认为1。举例 
mysql create table t3 (- id int,- data bit(8)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t3;
-------------------------------------------
| Field | Type    | Null | Key | Default | Extra |
-------------------------------------------
| id    | int(11) | YES  |     | NULL    |       |
| data  | bit(8)  | YES  |     | NULL    |       |
-------------------------------------------
2 rows in set (0.00 sec)mysql insert into t3 (id, data) values (10, 10);
Query OK, 1 row affected (0.00 sec)mysql select * from t3;
------------
| id   | data |
------------
|   10 | 
------------
1 row in set (0.00 sec)通过上面的案例我们发现bit字段在显示时不是直接显示数值大小的。 
bit字段在显示时是按照ASCII码对应的值显示的。 
mysql insert into t3 (id, data) values (65, 65);
Query OK, 1 row affected (0.00 sec)mysql select * from t3;
------------
| id   | data |
------------
|   10 | 
|   65 | A    |
------------
2 rows in set (0.00 sec)bit可以表示只存放1或0的数值需求这样可以节省空间。 
mysql create table t4 (- data bit(1)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t4;
------------------------------------------
| Field | Type   | Null | Key | Default | Extra |
------------------------------------------
| data  | bit(1) | YES  |     | NULL    |       |
------------------------------------------
1 row in set (0.00 sec)mysql insert into t4 (data) values (1);
Query OK, 1 row affected (0.00 sec)mysql insert into t4 (data) values (0);
Query OK, 1 row affected (0.00 sec)mysql insert into t4 (data) values (2);
ERROR 1406 (22001): Data too long for column data at row 1float类型 
基本语法 
float[(m, d)] [unsigned] : M指定显示长度d指定小数位数占用空间4个字节案例 float(4,2)表示的范围是-99.99 ~ 99.99MySQL在保存值时会进行四舍五入。 
mysql create table t5 (- data float(4, 2)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t5;
----------------------------------------------
| Field | Type       | Null | Key | Default | Extra |
----------------------------------------------
| data  | float(4,2) | YES  |     | NULL    |       |
----------------------------------------------
1 row in set (0.00 sec)mysql insert into t5 (data) values (99.99);
Query OK, 1 row affected (0.01 sec)mysql insert into t5 (data) values (-99.99);
Query OK, 1 row affected (0.01 sec)mysql insert into t5 (data) values (-99.991);
Query OK, 1 row affected (0.01 sec)mysql insert into t5 (data) values (-99.996);
ERROR 1264 (22003): Out of range value for column data at row 1
mysql select * from t5;
--------
| data   |
--------
|  99.99 |
| -99.99 |
| -99.99 |
--------
3 rows in set (0.00 sec)案例 如果定义的是float(4,2) unsigned 这时因为把它指定为无符号的数范围是 0 ~ 99.99 
mysql create table t6 (- data float(4,2) unsigned - )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.01 sec)mysql desc t6;
-------------------------------------------------------
| Field | Type                | Null | Key | Default | Extra |
-------------------------------------------------------
| data  | float(4,2) unsigned | YES  |     | NULL    |       |
-------------------------------------------------------
1 row in set (0.00 sec)mysql insert into t6 (data) values (0);
Query OK, 1 row affected (0.01 sec)mysql insert into t6 (data) values (99.99);
Query OK, 1 row affected (0.00 sec)mysql insert into t6 (data) values (-1);
ERROR 1264 (22003): Out of range value for column data at row 1
mysql insert into t6 (data) values (100);
ERROR 1264 (22003): Out of range value for column data at row 1decimal类型 
基本语法: 
decimal(m, d) [unsigned] : 定点数m指定长度d表示小数点的位数decimal(5,2) 表示的范围是 -999.99 ~ 999.99decimal(5,2) unsigned 表示的范围 0 ~ 999.99decimal和float很像但是有区别: float和decimal表示的精度不一样 
案例 
mysql create table t7 (- data1 float(10,8),- data2 decimal(10,8)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t7;
-------------------------------------------------
| Field | Type          | Null | Key | Default | Extra |
-------------------------------------------------
| data1 | float(10,8)   | YES  |     | NULL    |       |
| data2 | decimal(10,8) | YES  |     | NULL    |       |
-------------------------------------------------
2 rows in set (0.00 sec)mysql insert into t7 (data1, data2) values (23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)mysql select * from t7;
--------------------------
| data1       | data2       |
--------------------------
| 23.12345695 | 23.12345612 |
--------------------------
1 row in set (0.00 sec)通过上面的案例我们可以发现decimal的精度更准确因此当我们需要高精度储存浮点数时优先使用decimal。 
float表示的精度大约是7位。decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略默认为0.如果m被省略默认是10。 字符串类型 
char类型 
基本语法 
char(L): 固定长度字符串L是可以存储的长度单位为字符最大长度值可以为255案例 
mysql create table t8 (- data char(2)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t8;
-------------------------------------------
| Field | Type    | Null | Key | Default | Extra |
-------------------------------------------
| data  | char(2) | YES  |     | NULL    |       |
-------------------------------------------
1 row in set (0.01 sec)mysql insert into t8 (data) values (OK);
Query OK, 1 row affected (0.01 sec)mysql insert into t8 (data) values (好的);
Query OK, 1 row affected (0.00 sec)mysql insert into t8 (data) values (中国人);
ERROR 1406 (22001): Data too long for column data at row 1mysql select * from t8;
--------
| data   |
--------
| OK     |
| 好的   |
--------
2 rows in set (0.00 sec)char(2) 表示可以存放两个字符可以是字母或汉字但是不能超过2个 最多只能是255 
mysql create table t8 (- data char(256)- )engineinnodb default charset-utf8;
ERROR 1074 (42000): Column length too big for column data (max  255); use BLOB or TEXT insteadvarchar类型 
基本语法 
varchar(L): 可变长度字符串L表示字符长度最大长度65535个字节案例 
mysql create table t9 (- data varchar(5)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.03 sec)mysql desc t9;
----------------------------------------------
| Field | Type       | Null | Key | Default | Extra |
----------------------------------------------
| data  | varchar(5) | YES  |     | NULL    |       |
----------------------------------------------
1 row in set (0.00 sec)mysql insert into t9 value (hello);
Query OK, 1 row affected (0.00 sec)mysql insert into t9 value (你好世界);
Query OK, 1 row affected (0.00 sec)mysql select * from t9;
-----------------
| data            |
-----------------
| hello           |
| 你好世界      |
-----------------
2 rows in set (0.00 sec)关于varchar(len),len到底是多大这个len值和表的编码密切相关 
varchar长度可以指定为0到65535之间的值但是有1 - 3 个字节用于记录数据大小所以说有效字节数是65532。当我们的表的编码是utf8时varchar(n)的参数n最大值是65532/321844因为utf中一个字符占用3个字节如果编码是gbkvarchar(n)的参数n最大是65532/232766因为gbk中一个字符占用2字节。 
mysql create table t10 (- data varchar(21845)- )engineinnodb default charsetutf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql create table t10 ( data varchar(21844) )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t10;
--------------------------------------------------
| Field | Type           | Null | Key | Default | Extra |
--------------------------------------------------
| data  | varchar(21844) | YES  |     | NULL    |       |
--------------------------------------------------
1 row in set (0.00 sec)char和varchar对比 如何选择定长或变长字符串 
如果数据确定长度都一样就使用定长char比如身份证手机号。如果数据长度有变化,就使用变长(varchar), 比如名字地址但是你要保证最长的能存的进去。定长的磁盘空间比较浪费但是效率高。变长的磁盘空间比较节省但是效率低。定长的意义是直接开辟好对应的空间。变长的意义是在不超过自定义范围的情况下用多少开辟多少。 日期和时间类型 
常用的日期有如下三个 
date :日期 ‘yyyy-mm-dd’ 占用三字节datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 占用八字节timestamp 时间戳从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致占用四字节 
案例 
mysql create table t11 (- d1 date,- d2 datetime,- d3 timestamp- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc t11;
-----------------------------------------------------------------------------
| Field | Type      | Null | Key | Default           | Extra                       |
-----------------------------------------------------------------------------
| d1    | date      | YES  |     | NULL              |                             |
| d2    | datetime  | YES  |     | NULL              |                             |
| d3    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
-----------------------------------------------------------------------------
3 rows in set (0.00 sec)mysql insert into t11 (d1, d2) values (2023-1-29, 2023-1-29 10:00:00);
Query OK, 1 row affected (0.00 sec)mysql insert into t11 (d1, d2) values (2023-1-30, 2023-1-30 11:00:00);
Query OK, 1 row affected (0.00 sec)mysql select * from t11;
------------------------------------------------------
| d1         | d2                  | d3                  |
------------------------------------------------------
| 2023-01-29 | 2023-01-29 10:00:00 | 2023-01-29 21:45:20 |
| 2023-01-30 | 2023-01-30 11:00:00 | 2023-01-29 21:45:29 |
------------------------------------------------------
2 rows in set (0.00 sec)在添加数据时timestamp时间戳会自动添加当前时间修改数据时同理也会修改当前时间。 
mysql select * from t11;
------------------------------------------------------
| d1         | d2                  | d3                  |
------------------------------------------------------
| 2023-01-29 | 2023-01-29 10:00:00 | 2023-01-29 21:45:20 |
| 2023-01-30 | 2023-01-30 11:00:00 | 2023-01-29 21:45:29 |
------------------------------------------------------
2 rows in set (0.00 sec)mysql update t11 set d12023-1-31;
Query OK, 2 rows affected (0.01 sec)
Rows matched: 2  Changed: 2  Warnings: 0mysql select * from t11;
------------------------------------------------------
| d1         | d2                  | d3                  |
------------------------------------------------------
| 2023-01-31 | 2023-01-29 10:00:00 | 2023-01-29 21:47:55 |
| 2023-01-31 | 2023-01-30 11:00:00 | 2023-01-29 21:47:55 |
------------------------------------------------------
2 rows in set (0.00 sec)enum和set类型 
基本语法 
enum枚举“单选”类型
enum(选项1,选项2,选项3,...);该设定只是提供了若干个选项的值最终一个单元格中实际只存储了其中一个值而且出于效率考虑这些值实际存储的是“数字”因为这些选项的每个选项值依次对应如下数字1,2,3,…最多65535个当我们添加枚举值时也可以添加对应的数字编号。 
set集合“多选”类型
set(选项值1,选项值2,选项值3, ...);该设定只是提供了若干个选项的值最终一个单元格中设计可存储了其中任意多个值而且出于效率考虑这些值实际存储的是“数字”因为这些选项的每个选项值依次对应如下数字1,2,4,8,16,32… 最多64个。 
说明不建议在添加枚举值集合值的时候采用数字的方式因为不利于阅读。 
案例 有一个调查表votes需要调查人的喜好 登山游泳篮球武术中选择(可以多选)性别男女单选。 
mysql create table votes (- name varchar(20),- hobby set(登山,游泳,武术,篮球),- gender enum(男,女)- )engineinnodb default charsetutf8;
Query OK, 0 rows affected (0.02 sec)mysql desc votes;
-----------------------------------------------------------------------------
| Field  | Type                                     | Null | Key | Default | Extra |
-----------------------------------------------------------------------------
| name   | varchar(20)                              | YES  |     | NULL    |       |
| hobby  | set(登山,游泳,武术,篮球)         | YES  |     | NULL    |       |
| gender | enum(男,女)                          | YES  |     | NULL    |       |
-----------------------------------------------------------------------------
3 rows in set (0.00 sec)插入数据 
mysql insert into votes (name, hobby, gender) values (Jame, 游泳,武术, 男);
Query OK, 1 row affected (0.00 sec)mysql insert into votes (name, hobby, gender) values (Lisa, 游泳,登山, 女);
Query OK, 1 row affected (0.00 sec)mysql insert into votes (name, hobby, gender) values (Jack, 游泳,篮球,武术, 男);
Query OK, 1 row affected (0.01 sec)mysql insert into votes (name, hobby, gender) values (Maria, 游泳, 女);
Query OK, 1 row affected (0.00 sec)mysql select * from votes;
-------------------------------------
| name  | hobby                | gender |
-------------------------------------
| Jame  | 游泳,武术            | 男     |
| Lisa  | 登山,游泳            | 女     |
| Jack  | 游泳,武术,篮球       | 男     |
| Maria | 游泳                 | 女     |
-------------------------------------
4 rows in set (0.00 sec)有如上数据想查找所有喜欢游泳的人 
mysql select * from votes where hobby游泳;
-----------------------
| name  | hobby  | gender |
-----------------------
| Maria | 游泳   | 女     |
-----------------------
1 row in set (0.00 sec)我们会发现我们只能查找到兴趣爱好只有游泳的人不能查询到兴趣爱好中含有游泳的人。 
集合查询使用find_ in_ set函数 find_in_set(sub,str_list) 如果 sub 在 str_list 中则返回下标如果不在返回0 str_list 用逗号分 隔的字符串 
示例 
mysql select find_in_set(a, a,b,c);
---------------------------
| find_in_set(a, a,b,c) |
---------------------------
|                         1 |
---------------------------
1 row in set (0.00 sec)mysql select find_in_set(d, a,b,c);
---------------------------
| find_in_set(d, a,b,c) |
---------------------------
|                         0 |
---------------------------
1 row in set (0.00 sec)在votes表中查询喜欢游泳的人 
mysql select * from votes where find_in_set(游泳, hobby);
-------------------------------------
| name  | hobby                | gender |
-------------------------------------
| Jame  | 游泳,武术            | 男     |
| Lisa  | 登山,游泳            | 女     |
| Jack  | 游泳,武术,篮球       | 男     |
| Maria | 游泳                 | 女     |
-------------------------------------
4 rows in set (0.00 sec) 文章转载自: http://www.morning.jphxt.cn.gov.cn.jphxt.cn http://www.morning.yktr.cn.gov.cn.yktr.cn http://www.morning.llllcc.com.gov.cn.llllcc.com http://www.morning.dkqyg.cn.gov.cn.dkqyg.cn http://www.morning.mttck.cn.gov.cn.mttck.cn http://www.morning.smkxm.cn.gov.cn.smkxm.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.fglyb.cn.gov.cn.fglyb.cn http://www.morning.bynf.cn.gov.cn.bynf.cn http://www.morning.ykrg.cn.gov.cn.ykrg.cn http://www.morning.tbwsl.cn.gov.cn.tbwsl.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.cbvlus.cn.gov.cn.cbvlus.cn http://www.morning.qtfss.cn.gov.cn.qtfss.cn http://www.morning.mjwnc.cn.gov.cn.mjwnc.cn http://www.morning.bnrff.cn.gov.cn.bnrff.cn http://www.morning.3dcb8231.cn.gov.cn.3dcb8231.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.hxpsp.cn.gov.cn.hxpsp.cn http://www.morning.ccpnz.cn.gov.cn.ccpnz.cn http://www.morning.mfbzr.cn.gov.cn.mfbzr.cn http://www.morning.qieistand.com.gov.cn.qieistand.com http://www.morning.wbysj.cn.gov.cn.wbysj.cn http://www.morning.rkjz.cn.gov.cn.rkjz.cn http://www.morning.lmmh.cn.gov.cn.lmmh.cn http://www.morning.rcrnw.cn.gov.cn.rcrnw.cn http://www.morning.jqzns.cn.gov.cn.jqzns.cn http://www.morning.skwwj.cn.gov.cn.skwwj.cn http://www.morning.wmcng.cn.gov.cn.wmcng.cn http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.wncb.cn.gov.cn.wncb.cn http://www.morning.ylljn.cn.gov.cn.ylljn.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.swdnr.cn.gov.cn.swdnr.cn http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn http://www.morning.dthyq.cn.gov.cn.dthyq.cn http://www.morning.pzss.cn.gov.cn.pzss.cn http://www.morning.ltdxq.cn.gov.cn.ltdxq.cn http://www.morning.spnky.cn.gov.cn.spnky.cn http://www.morning.pjrgb.cn.gov.cn.pjrgb.cn http://www.morning.mcwrg.cn.gov.cn.mcwrg.cn http://www.morning.zcsyz.cn.gov.cn.zcsyz.cn http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn http://www.morning.tkztx.cn.gov.cn.tkztx.cn http://www.morning.nclbk.cn.gov.cn.nclbk.cn http://www.morning.pzrnf.cn.gov.cn.pzrnf.cn http://www.morning.qztsq.cn.gov.cn.qztsq.cn http://www.morning.rxdsq.cn.gov.cn.rxdsq.cn http://www.morning.ltrms.cn.gov.cn.ltrms.cn http://www.morning.fthcn.cn.gov.cn.fthcn.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.sgrwd.cn.gov.cn.sgrwd.cn http://www.morning.wjqyt.cn.gov.cn.wjqyt.cn http://www.morning.ccphj.cn.gov.cn.ccphj.cn http://www.morning.fqssx.cn.gov.cn.fqssx.cn http://www.morning.btpll.cn.gov.cn.btpll.cn http://www.morning.gxfpk.cn.gov.cn.gxfpk.cn http://www.morning.snjpj.cn.gov.cn.snjpj.cn http://www.morning.lrwsk.cn.gov.cn.lrwsk.cn http://www.morning.bftqc.cn.gov.cn.bftqc.cn http://www.morning.hsrpr.cn.gov.cn.hsrpr.cn http://www.morning.lqqqh.cn.gov.cn.lqqqh.cn http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn http://www.morning.burpgr.cn.gov.cn.burpgr.cn http://www.morning.cxryx.cn.gov.cn.cxryx.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.qncqd.cn.gov.cn.qncqd.cn http://www.morning.bqpg.cn.gov.cn.bqpg.cn http://www.morning.crfjj.cn.gov.cn.crfjj.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.cjwkf.cn.gov.cn.cjwkf.cn http://www.morning.dbfwq.cn.gov.cn.dbfwq.cn http://www.morning.kbgzj.cn.gov.cn.kbgzj.cn http://www.morning.ltcnd.cn.gov.cn.ltcnd.cn http://www.morning.ppghc.cn.gov.cn.ppghc.cn http://www.morning.fblkr.cn.gov.cn.fblkr.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn