Mysql常用数据类型
数值类型
Bit(M) 位类型。M指定位数,默认值1,范围1-64
Bool,Boolean 使用0或1表示真或假 1个字节
TinyInt [unsigned] 带符号是(-128,127) 无符号(0,255) 默认是有符号 1 字节
SmallInt [unsigned] 带符号是(-32768,32767) 无符号(0,65535) 2 字节
MediumInt [unsigned] 带符号是(-8388608,8388607) 无符号(0,16777215) 3 字节
Int或Integer [unsigned] 带符号是(-2147483648,2147483647) 无符号(0,4 294967295) 4 字节
Float[(M,D)] [unsigned] M指定显示长度,d指定小数位数, 4 字节
BigInt [unsigned] 带符号是 负的 2的63次方 到 2的63次方-1 ,无符号 2的64方 -1 8 字节
Double[(M,D)] [unsigned] 表示比float精度更大的小数, 8 字节
Decimal(M,D) [unsigned] 定点数 M指定长度,D表示小数点的位数 大小:对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2
字符串类型
Char 0-255字节 定长字符串
Varchar 0-65535 字节 变长字符串 最大65532字节 【utf-8编码最大21844字符 1-3个字节用于记录大小】
Tinyblob 0-255字节 不超过 255 个字符的二进制字符串
Tinytext 0-255字节 短文本字符串
Blob 0-65 535字节 二进制形式的长文本数据
Text 0-65 535字节 长文本数据
Mediumblob 0-16 777 215字节 二进制形式的中等长度文本数据
Mediumtext 0-16 777 215字节 中等长度文本数据
Longblob 0-4 294 967 295字节 二进制形式的极大文本数据
Longtext 0-4 294 967 295字节 极大文本数据
日期和时间类型
Date 3字节 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
Time 3字节 '-838:59:59'/'838:59:59' HH:MM:SS 时间值或持续时间
Year 1字节 1901/2155 YYYY 年份值
Datetime 8字节 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
Timestamp 4字节 1970-01-01 00:00:00/2038 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
结束时间是第 2147483647 秒,
北京时间 2038-1-19 11:14:07,
格林尼治时间 2038年1月19日 凌晨 03:14:07
它可用于自动记录insert,update操作时间
String类型
Enum 类型(枚举) Enum是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串('')或NULL:
Set 类型(集合) Set是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。
这样SET成员值本身不能包含逗号。SET最多可以有64个不同的成员可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值
数值型(整数)的使用细节
在mysql种,整型可以指定为有符合的,或者没有符号的,默认是有符号的
我们可以通过指定来说明某个数值是否有符号
create table t10 (id int not null default 0); //默认是有符号的 not null:不为空 default 0:默认值为0
create table t11 (id int unsigned not null default 0); 无符号的 unsigned:无符号
关于zerofill 的说明(前面自动填充0)
在数据库定义是 int(6) 这个6到底表示什么意思?
对于数值型(也可以是tinyint 等),我们这样定义时
int(6) unsigned zerofill
/*①zerofill 只能和 unsinged 配合使用*/
/*②6 表示当zerofill 时,填充的宽度,就是如果数据不足6位,则这个字段将被 0 填充,如果不设置zerofill ,则这个6没有什么含义 */
/*③int(6) zerofill /*只要指定 zerofill 则 默认就是unsigned */
/*④6 并不是表示 存放的数不能超过6位,这点请注意*/
数值型Bin的使用
Bin[M]
位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略,默认为1。
细节说明
1.bit字段在显示时,按Asci码对应的字符显示
2.查询的时候仍然可以用 注:查询显示asci显示,但是仍可以用0,1去筛选 select * from db_name where bit字段=0 or bit字段=1
3.如果一个值只有0,1可以考虑用bit,可以节约空间
4.位类型。M指定位数,默认指1,范围1-64
数值型(小数)的基本使用
Float[(M,D)] [unsigned]
M指定显示长度(一共显示的位数,包含小数位),d指定小数位数,占用空间4个字节
小数:folat(4,2) 表示范围是-99.99~99.99
float(4,2) unsigned:无符号 表示的范围 0-99.99
细节:99.994可以存进去 99.995不能存进去
超出设置的精度后,这里存的时候采用四舍五入的机制,四舍五入后不超出范围则可以存进去
Decimal(M,D) [unsigned]
定点数 M指定长度(一共显示的位数,包含小数位),D表示小数点的位数 大小:对Decimal(M,D) ,如果M>D,为M+2否则为D+2
decimal(5,2) 表示的范围是 -999.99~999.99
decaimal(5,2) unsigned 表示的范围是 0~999.99
关于Float和Decimal的区别,我们应该选择哪个数据类型
Float[(M,D)] [unsigned]
单精度浮点数精确到大约7位小数位 超过7位会导致小数点位会乱
Decimal(M,D) [unsigned]
可以支持更加精确的小数位,压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。
小数点和(负数)的负数‘-’符号不包括在M中。如果D是0,则值没有小数点或分数部分。
Decimal整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。
建议:如果希望小数的精度高,推荐使用decimal
字符串的基本使用
Char(size) 固定长度字符串 最大255 字符 注意这里指的是字符不是字节(字符中文英文都可以)
当char值保存时,在他们的右边填充空格以达到指定的长度,当检索char值时,尾部的空格被删除掉,在存储或检索过程中不进行大小写转换
Varchar(size) 可变长度字符串 最大65532字节 size大小和编码有关【1-3个字节用于记录大小】 size指的是字节
当Varchar值保存时不进行填充,当值保存和检索时尾部的空格仍保留,符合标准sql
utf-8编码最大65532/3=21844字符 utf8一个汉字占用3个字节
gbk编码最大65532/2=32766字符 gbk中一个汉字占用2个字节
字符串使用细节1
Char(4) //这个4表示字符数(绝对最大255),不是字节数 ,不管是中文还是字母都是放四个,按字符计算.
Varchar(4)//这个4表示字符数 ,不管是字母还是中文都以定义好的表的编码来存放数据.
字符串使用细节2
Char(4) 是定长,就是说,即使你 插入 'aa' , 也会占用 分配的4个字符.
Varchar(4) 是变长,就是说,如果你插入了 'aa',实际占用空间大小是 L+1
[注:同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。]
字符串使用细节3
什么时候使用 char , 什么时候使用varchar
答:如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号码等.
如果一个字段的长度是不确定,我们使用varchar ,比如留言,文章
查询速度, char > varchar
字符串使用细节4
char 在存放空格时会丢失一定要小心, varchar不会丢失
比如 在 char 中存放了 'aaa '取出来就是 'aaa’'了
而 varchar中存放了 ‘aaa ’ ,取出来还是 ‘aaa ’, 后面的那个空格没有丢失
为什么,因为char的存放规则是当数据放入不够时,后面全面补 空格,这样就导致mysql数据库会误杀 你希望的空格,小心
字符串使用细节5
在存放文本时,也可以使用Text 数据类型.
可以将TEXT列视为VARCHAR列, 注意 Text 不能有默认值.
注:一个表的所有字段的长度全部加起来,不能超过65535个字节;
日期类型的基本使用
CREATE TABLE birthday( t1 DATE, t2 DATETIME, t3 TimeStamp); timestamp时间戳
mysql> INSERT INTO birthday (t1,t2) VALUES('2016-01-01','2016-01-01 12:12:12');
日期类型的细节说明
TimeStamp在Insert和update时,自动联动 (insert,update操作时间会自动修改TimeStamp类型)
Enum, SET类型基本使用
基本语法
enum('值1', '值2', ...) /*不能设置默认值*/
set('值1', '值2',....) /*不能设置默认值*/
enum枚举类型基本使用
枚举类型,其实就是“单选”类型,对应网页表单中的“单选项”的数据值;
形式:
enum(‘选项值1’, ‘选项值2’, ‘选项值3’,...... );
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中的一个值;
而且,出于效率的考虑,这些值实际存储的是“数字”,因为这些选项,每个选项值,依次对应如下数字:1, 2, 3, 4, 5, ....... 最多65535个;
SET类型基本使用
就是“多选”类型,对应网页表单中的“多选项”的数据值
形式:
set(‘选项值1’, ‘选项值2’, ‘选项值3’,...... );
该设定只是提供了若干个选项的值,最终一个单元格中,实际可存储了任何其中的多个值(就是多选);
而且,出于效率的考虑,这些值实际存储的是“数字”,因为这些选项,每个选项值,依次对应如下数字:1, 2, 4,8, 16, 32, ......最多64个;[偶数]
创建调查表
create table voter(username varcher(60) not null default '',
hobby set('苹果','菠萝','西瓜') not null,
sex enum('男','女') not null)charset=utf8 engine=myisam;
insert into voter values('张三','菠萝,西瓜','男')
insert into voter values('张三','6','1')
select * from voter where sex='男'
select * from voter where find_in_set('菠萝',hobby);
find_in_set 的使用 配合set使用
select * find_in_set('a','a,b,c')
find_in_set会返回第一个字符串在第二个字符串列表,隔开的位置[字符串列表],从1开始计算,如果没有则返回0
第一个字符串不能包含,逗号,第二个字符串,逗号隔开,并且在第二个字符串时完全相同的元素才会返回位置
显示表的细节问题:此问题只针对cmd窗口显示mysql表数据
如何在显示表有较长中文字符时,可以对其显示的技巧
先将控制台的宽度设置大一点 比如 800宽
登录的时候这样登录
mysql --default-character-set=latin1 -uroot -pxxxx
然后进入后再设置成 set names gbk 即可对其显示中文了.