🎯概述:
MySQL数据类型(列类型)可归纳为数值型、时间日期型和字符型。
数值型:
整形:tinyint/smallint/mediumint/int/bigint
小数型:Float(D,M),decimal(D,M)
字符串型:
Char(M)
Varchar(M)
Text 文本类型
日期/ 时间型:
Date 日期
Time 时间
Datetime 日期时间型
TIMESTAMP 时间戳类型
Year 年类型
🎯数值型
🎃整数型
tinyint(1), smallint(2), mediumint(3),int(4), bigint(8)。括号中表示该类型所占空间的长度(字节数)
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 字节 |
(-8388 608,8388 607) |
(0,16777215) |
大整数值 |
INT或INTEGER |
4 字节 |
(-2147483648,2147483647) |
(0,4294967295) |
大整数值 |
BIGINT |
8字节 |
(-9,223,372,036,854,775,808,9223372036854775807) |
(0,18446744073709551615) |
极大整数值 |
整形系统的可选参数: XXint(M) unsigned zerofill
例: age tinyint(4) unsigned 或者 stunum smallint(6) zerofill
Unsigned: 代表此列为无符号类型,会影响到列的存储范围(范围从0 开始)
(不加unsigned, 则代表该列默认是有符号类型,范围从负数开始)
列可以声明默认值,而且推荐声明默认值
Not null default 0;
Zerofill :代表0 填充,即:如果该数字不足参数M位,则自动补0,补够M位。
1. 如果没有zerofill 属性,单独的参数M,没有任何意义
2. 如果设置某列为zerofill, 则该列已经默认为unsigned, 无符号类型,M代表该列的显示宽度。
🎃小数类型
🎐 浮点数
小数型: float(M,D),decimal(M,D)
float(M,D): 浮点小数,代表可存储一共M位(不含小数点),其中,小数点后D位
decimal(M,D) :定点小树, M,D的意义同上.
区别: decimal 比float 精度更高,适合存储货币等要求精确的数字.
见下例:
🎯日期时间型
mysql 时间类型有,date,time,datetime,timestamp,year五种。
date类型: 支持的范围为’1000-01-01’到’9999-12-31’
time类型: 支持的范围是’-838:59:59’到’838:59:59’
datetime类型:支持的范围是’1000-01-01 00:00:00’到’9999-12-31 23:59:59’
timestamp类型:时间戳,就是表示“当前时刻”, 用int 来存储,是1970-01-01 00:00:00 到当前的秒数,类似函数now()获得的值,用于INSERT或UPDATE操作时自动获得当前时间。
一般存注册时间,商品发布时间等,并不是用datetime 存储,而是用时间戳。因此datetime 虽然直观,但计算不便。
year类型: 四位字符串,范围为’1901’到’2155’;四位数字,范围为1901到2155;两位字符串,范围为’00’到’99’;两位整数,范围为1到99
在mysql中除了timestamp 类型允许有默认值外,其他时间类型都不能有默认值,不然会报错。
mysql常用时间日期函数
获取当前日期和时间: now();
获取当前日期: curdate();
获取当前时间:curtime();
将具体时间转换为时间戳:unix_timestamp();
将时间戳转换为时间:from_unixtime();
🎯字符串类型
mysql提供的有CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
Char 定长类型
Char(M),M 代表宽度,( 即:可容纳的字符数),0<=255 之间
例: char(10), 则能输入10 个字符.
Varchar 变长类型
varchar(M),M 代表宽度,( 即:可容纳的字符数),0<=M<=65535(以ascii 字符为例, utf8 22000左右)
定长二进制字符串binary:类似char,应该设定长度值,只是按“二进制字节”保存存字符数据,最大255个字节,无编码问题
变长二进制字符串varbinary:类似varchar,需要设定长度值,只是按“二进制字节”存字符数据,最大65532个字节,无编码问题
文本列类型text:用于存储普通文本,不受行的最大长度的限制,同类还有:tinytext, mediuntext, longtext
二进制列类型blob:用于存储二进制字节内容,不受行的最大长度的限制,同类的还有:tinyblob, mediumblob, longblob
枚举类型enum: 类似单选项应用中的多个选项值,最大65535个选项值;使用形式:enum(‘value1’, ‘value2’, … );存储数据的时候其实存的是一个对应的数字序号(从1开始)
set类型:类似多选项应用中的多个选项,最多64个选项,使用形式:set(‘value1’, ‘value2’, …); 内部存储的也是数字(依次为1,2,4,8, ….),但可以是多个值,比如5就表示2个值(1,4),14就表示3个值(2,4,8)
Char(M) 如何占据M个字符宽度?
答:如果实际存储内容不足M个,则后面加空格补齐
取出来的时候,再把后表面的空格去掉. (所以如果内容最后有空格,将会被清除)速度上:定长速度快些。
Char 与varchar 相关实验
Concat 连接的意思
SET 和 enum
create table seTest(
id int auto_increment,
hobby set('篮球','足球','羽毛球','乒乓球','棒球'),
gender enum('male','female','not know'),
primary key(id)
)engine = myisam default charset = utf8;
insert into seTest(hobby,gender) values('篮球','male'),('篮球,足球,棒球','not know');
insert into seTest(hobby,gender) values('篮球','male,female');
insert into seTest(hobby,gender) values('篮球','male female');
insert into seTest(hobby,gender) values('排球','male female');
mysql> show warnings;
mysql> select * from setest;
可以看到,当插入的值跟set 、enum 字段值要求不符时,会插入空值。
常用字符串函数
concat(column|str1,column | str2,….)将多个字符串首尾相连后返回。
concat_ws(separator,str1,str2,….)将多个字符串指定连接符separator的首尾相连后返回
substr(str,pos[,len]) 从字符串中的指定位置pos开始取一个字串返回
repeat(str,count) 将字符串str重复count次后返回
reverse(str) 将字符串str反转后返回
🎯mysql字符集问题
Mysql 的字符集设置非常灵活
可以设置服务器默认字符集
数据库默认字符集
表默认字符集
列字符集
(如果某一个级别没有指定字符集,则继承上一级)
set names gbk
set names utf8
执行show variables like 'character%',获取字符集配置为:
由于CMD命令行只支持系统当前编码,所以一般需要将CMD与MYSQL服务器的交互编码设置为gbk才能正常显示utf8的数据。
character_set_client、character_set_connection和character_set_results变成了utf8,可以看出set names就是设置这三个参数的值。一个select执行的过程应该是:client——>connection——>server/database——>results——>connection——>client,任何一个环节的字符集不兼容都会出现乱码。
1、用户通过mysql.exe来操作mysqld.exe
2、真正的SQL执行是mysqld.exe来执行
3、mysql.exe将数据传入mysqld.exe的时候,没有告知其对应的符号规则(字符集),而mysqld也没有能力自己判断,就会使用自己默认的(字符集);
解决方案:
mysql.exe如果告知mysqld.exe对应的字符集类型为GBK
深层原理:
客户端、服务器、连接层
客户端传入数据给服务器:client
服务器返回数据给客户端:server
客户端与服务器端之间的连接:connection