个人网站的基本风格,福州阳楠科技网站建设有限公司,房地产市场最新动态,平台网络推广数据类型 1.数据类型分类2.数值类型介绍2.1tinyint类型2.2bit类型介绍2.3小数类型介绍2.3.1 float2.3.2decimal 3.字符串类型介绍3.1char3.2varchar面试#xff1a;char和varchar的区别 4.日期和时间类型5.enum和set 1.数据类型分类 2.数值类型介绍 2.1tinyint类型
数值越界测… 数据类型 1.数据类型分类2.数值类型介绍2.1tinyint类型2.2bit类型介绍2.3小数类型介绍2.3.1 float2.3.2decimal 3.字符串类型介绍3.1char3.2varchar面试char和varchar的区别 4.日期和时间类型5.enum和set 1.数据类型分类 2.数值类型介绍 2.1tinyint类型
数值越界测试 说明: 在MySQL中整型可以指定是有符号的和无符号的默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的 无符号案例
mysql create table tt2(num tinyint unsigned);
mysql insert into tt2 values(-1); -- 无符号范围是 0 - 255
ERROR 1264 (22003): Out of range value for column num at row 1
mysql insert into tt2 values(255);
Query OK, 1 row affected (0.02 sec)
mysql select * from tt2;
------
| num |
------
| 255 |
------
1 row in set (0.00 sec)注意 注意尽量不使用unsigned对于int类型可能存放不下的数据int unsigned同样可能存放不下与其如此还不如设计时将int类型提升为bigint类型。
2.2bit类型介绍
基本语法
bit[(M)] : 位字段类型。M表示每个值的位数范围从1到64。如果M被忽略默认为1。举例
mysql create table tt4 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)
mysql insert into tt4 values(10, 10);
Query OK, 1 row affected (0.01 sec)
mysql select * from tt4; #发现很怪异的现象a的数据10没有出现
------------
| id | a |
------------
| 10 | |
------------
1 row in set (0.00 sec)bit字段在显示时是按照ASCII码对应的值显示。如果我们有这样的值只存放0或1这时可以定义bit(1)。这样可以节省空间。
mysql create table tt5(gender bit(1));
mysql insert into tt5 values(0);
Query OK, 1 row affected (0.00 sec)
mysql insert into tt5 values(1);
Query OK, 1 row affected (0.00 sec)
mysql insert into tt5 values(2); -- 当插入2时已经越界了
ERROR 1406 (22001): Data too long for column gender at row 12.3小数类型介绍
2.3.1 float
float[(m, d)] [unsigned] : M指定显示长度d指定小数位数占用空间4个字节案例 小数float(4,2)表示的范围是-99.99 ~ 99.99MySQL在保存值时会进行四舍五入。 在插入第二个数-99.991时0.001被舍弃掉了…
如果定义的是float(4,2) unsigned 这时因为把它指定为无符号的数范围是 0 ~ 99.99
2.3.2decimal
decimal(m, d) [unsigned] : 定点数m指定长度d表示小数点的位数decimal(5,2) 表示的范围是 -999.99 ~ 999.99 decimal(5,2) unsigned 表示的范围 0 ~ 999.99 decimal和float很像但是有区别: float和decimal表示的精度不一样
mysql create table tt8 ( id int, salary float(10,8), salary2
decimal(10,8));
mysql insert into tt8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)
mysql select * from tt8;
--------------------------------
| id | salary | salary2 |
--------------------------------
| 100 | 23.12345695 | 23.12345612 | # 发现decimal的精度更准确因此如果我们希望某
个数据表示高精度选择decimal
--------------------------------所以在涉及到小数的使用时推荐使用decimal
3.字符串类型介绍
3.1char
语法
char(L): 固定长度字符串L是可以存储的长度单位为字符最大长度值可以为255案例
mysql create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)
mysql insert into tt9 values(100, ab);
Query OK, 1 row affected (0.00 sec)
mysql insert into tt9 values(101, 中国);
Query OK, 1 row affected (0.00 sec)
mysql select * from tt9;
--------------
| id | name |
--------------
| 100 | ab |
| 101 | 中国 |
--------------char(2) 表示可以存放两个字符可以是字母或汉字但是不能超过2个 最多只能是255
3.2varchar
语法
varchar(L): 可变长度字符串L表示字符长度最大长度65535个字节案例
mysql create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符
mysql insert into tt10 values(100, hello);
mysql insert into tt10 values(100, 我爱你中国);
mysql select * from tt10;
--------------------------
| id | name |
--------------------------
| 100 | hello |
| 100 | 我爱你中国 |
--------------------------说明 关于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字节。 如何选择定长或变长字符串 如果数据确定长度都一样就使用定长char比如身份证手机号md5 如果数据长度有变化,就使用变长(varchar), 比如名字地址但是你要保证最长的能存的进去。 定长的磁盘空间比较浪费但是效率高。 变长的磁盘空间比较节省但是效率低。 定长的意义是直接开辟好对应的空间 变长的意义是在不超过自定义范围的情况下用多少开辟多少。
面试char和varchar的区别
区别一定长和变长 char 表示定长长度固定varchar表示变长即长度可变。char如果插入的长度小于定义长度时则用空格填充varchar小于定义长度时还是按实际长度存储插入多长就存多长。
因为其长度固定char的存取速度还是要比varchar要快得多方便程序的存储与查找但是char也为此付出的是空间的代价因为其长度固定所以会占据多余的空间可谓是以空间换取时间效率。varchar则刚好相反以时间换空间。
区别之二存储的容量不同 对 char 来说最多能存放的字符个数 255和编码无关。 而 varchar 呢最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。
4.日期和时间类型
常用的日期有如下三个
date :日期 ‘yyyy-mm-dd’ 占用三字节datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 占用八字节 t3. imestamp 时间戳从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致占用四字节
案例
//创建表
mysql create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)
//插入数据
mysql insert into birthday(t1,t2) values(1997-7-1,2008-8-8 12:1:1); --插入两
种时间
Query OK, 1 row affected (0.00 sec)
mysql select * from birthday;
------------------------------------------------------
| t1 | t2 | t3 |
------------------------------------------------------
| 1997-07-01 | 2008-08-08 12:01:01 | 2017-11-12 18:28:55 | --添加数据时时间戳自动补
上当前时间
------------------------------------------------------
//更新数据
mysql update birthday set t12000-1-1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql select * from birthday;
------------------------------------------------------
| t1 | t2 | t3 |
------------------------------------------------------
| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | -- 更新数据时间戳会更新
成当前时间
------------------------------------------------------5.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(- username varchar(30),- hobby set(登山,游泳,篮球,武术), --注意使用数字标识每个爱好的时候想想
Linux权限采用比特位位置来个set中的爱好对应起来- gender enum(男,女)); --注意使用数字标识的时候就是正常的数组下标
Query OK, 0 rows affected (0.02 sec)插入数据
insert into votes values(雷锋, 登山,武术, 男);
insert into votes values(Juse,登山,武术,2);
select * from votes where gender2;
---------------------------------
| username | hobby | gender |
---------------------------------
| Juse | 登山,武术 |女 |
---------------------------------有如下数据想查找所有喜欢登山的人
----------------------------------
| username | hobby | gender |
----------------------------------
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
| LiLei | 篮球 | 男 |
| HanMeiMei | 游泳 | 女 |
----------------------------------使用如下查询语句
mysql select * from votes where hobby登山;
--------------------------
| username | hobby | gender |
--------------------------
| LiLei | 登山 | 男 |
--------------------------不能查询出所有爱好为登山的人。 集合查询使用find_ in_ set函数 find_in_set(sub,str_list) 如果 sub 在 str_list 中则返回下标如果不在返回0str_list 用逗号分隔的字符串。
mysql select find_in_set(a, a,b,c);
---------------------------
| find_in_set(a, a,b,c) |
---------------------------
| 1 |
---------------------------
mysql select find_in_set(d, a,b,c);
---------------------------
| find_in_set(d, a,b,c) |
---------------------------
| 0 |
---------------------------查询爱好登山的人
mysql select * from votes where find_in_set(登山, hobby);
---------------------------------
| username | hobby | gender |
---------------------------------
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
---------------------------------