Mysql数据库学习(二):数据类型(数值类型 日期和时间类型 字符串类型)

数据类型

数值类型 日期和时间类型 字符串类型

一、数值类型

整数

tinyint[M] [unsigned] [zerofill]    // [ ] 表示可选,这里的M表示显示宽度,并不是取值范围,显示宽度不够前面以0填充 bool是tinyint(1)的别名

浮点型

IEEE 754浮点数表示

S:符号位 E:指数位 M:尾数位,也叫有效数字位 N =(-1)^S * M * 2^E

单精度float 4个字节 ,取值范围-3.402823466E+38~3.402823466E+38, 精度大约7位 双精度double 8个字节,取值范围  -1.7976931348623157E+308~1.7976931348623157E+308, 精度大约15位

DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]  // M总位数,D是小数点后面的位数,这里是取值范围 real是double的别名

定点型

DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]  //M缺省是10,D缺省是0 decimal取值范围与double是一样的,但是有更高的精度。 decimal存储方式,参考:http://dev.mysql.com/doc/refman/5.1/zh/precision-math.html numeric是decimal的别名

create table t_number(a tinyint, b tinyint unsigned);
insert into t_number values(100, 200);
insert into t_number values(-129, 200);
insert into t_number values(128, 200);
insert into t_number values(127, 200);
insert into t_number values(127, -1);

create table t_number2(a int(4) zerofill);
insert into t_number2 values(123);
insert into t_number2 values(123456);

create table t_number3(a bool);

create table t_number4(a float, b double);
insert into t_number4 values(12345678.12345, 12345678.12345);
insert into t_number4 values(12345678.12345, 123456789123456789.12345); /* 12345700 | 1.2345678912345678e17  */
insert into t_number4 values(12345678.12345, 12345678912345.12345);


create table t_number5(a double(5,2));
/* -999.99 ~999.99 */

create table t_number6(a decimal(30,6));
insert into t_number6 values(123456789123456789.12345);
create table t_number7(a decimal(5,2));
/* -999.99 ~999.99*/

二、字符串类型

char(M) varchar(M)  //这里的M表示字符数

CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。VARCHAR的最大有效长度由最大行大小和使用的字符集确定。举例来说,如果字符集为uft8,那么一个字符需要3个字节来存储,则可以保存的字符数为65535/3=21845,此外还需要一个字符的位置来存储字符个数,故最大可填写的字符数为21844。若是latin1,一个字符只需1个字节存储,那么可填写的字符数为65532。

binary/varbinary

BINARY和VARBINARY 类似于CHAR和VARCHAR,不同的是它们包含二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值。

字符串存储需求

VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。 对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。

enum/set

create table t_enum(sex enum('male', 'female')); /* 1 2 */
insert into t_enum values('male');
insert into t_enum values('female');
insert into t_enum values(1);
select sex+0 from t_enum;

create table t_set(favourite set('dog', 'cat', 'bird')); /* 1 10 100 */
insert into t_set values('dog,cat');
insert into t_set values('dog,bird');
select favourite+0 from t_set;

枚举/集合看过去像是字符串,实际上保存的是整数。

三、日期和时间

日期和时间看起来像字符串,但是以整数来保存的。

create table t_datetime(a datetime);

insert into t_datetime values('2014-01-15 10:10:10');
insert into t_datetime values('9999-12-31 23:59:59');
insert into t_datetime values('10000-01-01 00:00:00');
insert into t_datetime values('999-01-01 00:00:00');
insert into t_datetime values('99-01-01 00:00:00');
insert into t_datetime values('69-01-01 00:00:00');


create table t_timestamp(a timestamp);
insert into t_timestamp values('2014-01-15 10:10:10');
insert into t_timestamp values('2038-01-19 03:14:07');
insert into t_timestamp values('2038-01-19 03:14:08');
insert into t_timestamp values('2038-01-19 11:14:07');
insert into t_timestamp values('2038-01-19 11:14:08');

create table t_date(a date);
insert into t_date values('2012-01-01');

create table t_time(a time); /* 可以表示时间差 */
insert into t_time values('23:12:12');
insert into t_time values('823:12:12');
insert into t_time values('3 23:12:12'); /* 3表示3小时 */

create table t_year(a year);
insert into t_year values (2000);
insert into t_year values ('2155');
insert into t_year values (2156);

参考:

《数据库系统概论》

mysql 5.1 参考手册

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程坑太多

JS实现运算符重载

1482
来自专栏CDA数据分析师

超能教程 十分钟学会 Python!

假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程。那么本教程将花费十分钟的时间带你走入Python的大门。本文的内容介于教程(Totur...

1876
来自专栏calmound

sprintf的用法

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者...

3246
来自专栏代码世界

前端之JavaScript内容

一、JavaScript概述 1、JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEn...

3457
来自专栏猿人谷

一个正则表达式测试(只可输入中文、字母和数字)

  在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到。之前在用java时特别是对用户名或密码使用正则非常爽,写脚本上用正则...

3016
来自专栏hbbliyong

Oracle字符串函数

Oracle字符串函数 平常我们用Oracle主要有两种字符串类型 1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填...

3606
来自专栏LIN_ZONE

java基础---->Java的格式化输出

  在JavaSe5中,推出了C语言中printf()风格的格式化输出。这不仅使得控制输出的代码更加简单,同时也给与Java开发者对于输出格式与排列更大的控制能...

311
来自专栏落影的专栏

Swift学习笔记

这是一篇学习swift的笔记 Objective-C是很好的语言,Runtime机制、消息机制等也是爱不释手。 Swift一直在更新,闲暇时间学一遍。学习的B...

4067
来自专栏landv

C语言-字符串文本串联

1163
来自专栏Crossin的编程教室

【编程课堂】文本包装 textwrap

欢迎回到编程课堂,本周我们将了解一个与文字处理相关的模块—— textwrap,依照惯例,此处应该有一思考题: 现在有一文本文件 ‘abc.txt’,有 100...

32710

扫码关注云+社区