共计 3155 个字符,预计需要花费 8 分钟才能阅读完成。
今天在本地装了一个 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> 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 相关的数据类型。
Datatype | Time Zone | Fractional 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