你好,游客 登录 注册 搜索
背景:
阅读新闻

一分钟看懂 MySQL数据类型

[日期:2016-11-15] 来源:Linux社区  作者:杨建荣 [字体: ]

今天在本地装了一个MySQL的学习环境,简单的熟悉了一下。准备开始好好学习MySQL了。

学习编程语言我都是从数据类型入手。每种编程语言的数据类型都有自己的特点,有点简单,有的种类丰富。

总体感觉而言,MySQL的数据类型要比Oracle丰富的多。用惯了oracle中的数据类型,一般number,varchar2,date就足够了,最常用的这3个数据类型在MySQL就有着巨大的变化,还是有点不适应。

MySQL中的数据类型都会和你“斤斤计较“,非常的细致,都在基本数据类型的范围内。oracle中的数据类型的维度要广。在http://www.linuxidc.com/Linux/2014-11/109765.htm中有过一些简单的总结。

-->数值类型

类型大小范围(有符号)范围(无符号)用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节 (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度
浮点数值
DOUBLE 8 字节 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度
浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值 



-->字符类型

类型大小用途
CHAR 0-255字节 定长字符串
VARCHAR 0-255字节 变长字符串
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字节 中等长度文本数据
LOGNGBLOB 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 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳 



-->数值类型
所以在oracle我们常使用的number,基本可以使用int来代替了。
在oracle中通过number能够控制数据的精度,比如我们制定Number(2),那么你如果数值过界了,就会直接报错。支持的数据范围精度也很高。可能在MySQL中会基于数据类型有对应的存储特性吧。
SQL> create table test (id number(2));
Table created.
SQL> insert into test values(127);
insert into test values(127)
                        *
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this column


在MySQL中尝试,按照tinyint的最大值127,我们输入128,会直接插入127,没有报错,有警告。

mysql> create table test(id tinyint);
Query OK, 0 rows affected (0.07 sec)

mysql> insert into test values(128);
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select*from test;
+------+
| id   |
+------+
|  127 |
+------+
1 row in set (0.00 sec)

-->字符类型
关于这个数据类型,对于varchar2是最不适应了。MySQL的varchar类型和oracle的varchar2使用是类似的。一个不同支持是MySQL支持的字符长度要小一些,只有256字节。

mysql中varchar(6)代表可以存放6个汉字,6个字母,或6个数字。
oracle中varchar2(6)代表可以中存放6个字节。采用utf8编码,oracle中一个汉字占用3个字节。

对于lob类型,最大支持长度和oracle一致。都是4G的样子。MySQL中分得比较细,比较灵活。
-->日期类型
对于日期类型,可能Oracle支持得更广一些,类型分得更细。考虑了timezone的部分。不过大部分使用来说基本没什么差别,我目前还没有用到timezone相关的数据类型。

DatatypeTime ZoneFractional Seconds
DATE No No
TIMESTAMP No Yes
TIMESTAMP WITH TIME ZONE Explicit Yes
TIMESTAMP WITH LOCAL TIME ZONE Relative Yes


顺带说一句,oracle和mysql中都可以使用current_date,current_timestamp。
SQL> select current_date from dual;
CURRENT_DATE
------------------
17-DEC-14

SQL> select current_date from dual; select current_date from dual;  --oracle中不能并行运行两个查询
select current_date from dual; select current_date from dual
                             *
ERROR at line 1:
ORA-00911: invalid character


mysql> select current_date;select current_date;  --mysql里面就可以很轻巧的实现
+--------------+
| current_date |
+--------------+
| 2014-12-17   |
+--------------+
1 row in set (0.00 sec)


+--------------+
| current_date |
+--------------+
| 2014-12-17   |
+--------------+
1 row in set (0.00 sec)   

本文永久更新链接地址http://www.linuxidc.com/Linux/2016-11/137176.htm

linux
相关资讯       MySQL数据类型 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款