您的位置:首页 > 理论基础 > 计算机网络

mysql的数据类型- 特别是表示日期/时间的数据类型: 参考: http://www.cnblogs.com/bukudekong/archive/2011/06/27/2091590.html

2017-11-11 11:15 501 查看
通常认为:

日期 就是 年-月-日:

时间就是: 小时:分钟:秒

要严格区分"日期"和 "时间"的 说法. 日期就是日期, 时间就是时间, 两者是不同的!!

日期和时间类型

  在处理日期和时间类型的值时,MySQL 带有 5 个不同的数据类型可供选择。它们可以被分成简单的日期、时间类型,和混合日期、时间类型。

根据要求的精度,子类型在每个分类型中都可以使用, 并且 MySQL 带有 内置功能 可以把多样化的输入格式变为一个标准格式。

注意这里的 内置功能, 可以把多样化的输入格式 转变为一个标准格式, 比如下面的插入中, 日期格式字符串使用了: -, 2000/01/02, 2000|3|04 等格式, mysql都能转换为标准的 2000-01-02格式:



甚至你设置的 时间格式字符串 的分隔符 很 "过分", "很杂乱" 它都能 转换为标准格式, 但是 还是 最好的使用 标准 格式 来输入, 避免不必要的转换和 不可预测的错误:



类型 大小 (字节) 范围 格式 用途

DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值 (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 混合日期和时间值 (中间还要存储2 个表示 分割的 字节符号)

TIMESTAMP 8 1970-01-01 00:00:00/2037 年某时 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

DATE、TIME 和 TEAR 类型

  MySQL 用 DATE 和 TEAR 类型存储简单的日期值,使用 TIME 类型存储时间值。 表示方法: 这些类型可以描述为字符串或不带分隔符的整数序列。 如果描述为字符串,DATE 类型的值应该使用 连字号 作为分隔符分开,而 TIME 类型的值应该使用冒号作为分隔符分开。

一定要有这样的认识: 一个字符序列, 如果要表示数字, 就要从 字面上看出是一个合法的数字; 如果是字符串,就要加上引号; 否则, mysql就会当做 变量/或字段 来看. 而报错, 所以 表示 日期/时间的 值, 一定要用 字符串 , 用引号阔气来, 带 - 和 : 分隔符.

  需要注意的是,没有冒号分隔符的 TIME 类型值,将会被 MySQL 理解为持续的时间,而不是时间戳。

  MySQL 还对日期的年份中的两个数字的值,或是 SQL 语句中为 TEAR (year????) 类型输入的两个数字进行最大限度的通译。因为所有 TEAR 类型的值必须用 4 个数字存储。MySQL 试图将 2 个数字的年份转换为 4 个数字的值。把在 00-69 范围内的值转换到 2000-2069 范围内。把 70-99 范围内的值转换到 1970-1979 之内。如果 MySQL 自动转换后的值并不符合我们的需要,请输入 4 个数字表示的年份。

DATEYIME 和 TIMESTAMP 类型

   除了日期和时间数据类型,MySQL 还支持 DATEYIME 和 TIMESTAMP 这两种混合类型。它们可以把日期和时间作为单个的值进行存储。这两种类型通常用于自动存储包含当前日期和时间的时间戳,并可在需要执行大量数据库事务和需要建立一个调试和审查用途的审计跟踪的应用程序中发挥良好作用。

  如果我们对 TIMESTAMP 类型的字段没有明确赋值,或是被赋与了 null 值。MySQL 会自动使用系统当前的日期和时间来填充它。

注意, mysql中, 要获得日期/时间, 没有 单独 的date(), time()函数 , 而是 用 now () 函数, 或者 current_timestamp()函数或 内置系统/状态变量: current_timestamp. 注意timestamp变量返回的结果是一个整数值.





用来表示// 或者 设置// 返回 结果 的 日期的标准格式, 总是: 'YYYY-mm-dd' , 表示 时间的标准格式总是: 'HH:ii:ss' , 而 datetime类型的标准格式总是: "YYYY-mm-dd H:i:s"

mysql时间函数很多, 主要只记住两个函数 就好了:

一是, 从已有的日期/时间值(是字符串格式的), 提取/获取某个 年份/ 月份/ 时间等的, 函数 是: time_format, date_format('datevalue', 'format_string'), 格式字符串, 如同 C语言中的 格式字符串是一样的, 比如c语言中, %d %s %c, 这里的格式字符串包括 "%Yy%m%d %H %i%s" ...

二是, 将字符串 转换为 日期/时间类型变量: str_to_date('普通的字符串', '对应的日期/时间格式字符串, 包括一些分隔符 也要对应着写')...

str_to_date('2010-01-02', '%Y-%m-%d'); str_to_date('10/08/2000' , '%m/%d/%Y')...

关于 日期/时间 操作的一些实例:

MariaDB [test]> select * from foo where name='jac';

+----+------+------------+

| id | name | when (date类型) | // 插入now() 的时候, 会自动 截取前面的日期.

+----+------+------------+

| 17 | jac | 2017-11-11 |

+----+------+------------+

1 row in set (0.00 sec)

由上可以看出, select 后面 总是接 "输出echo, print"的内容, 可以是 变量, 数字, 字符串 , 或字段, 所以 这里的* 表示的是 "所有的 字段" 注意是 字段,不是 记录行

关于数据库中的 用户和权限?



一个完整的用户, 应该是 用户+主机, 即 username@host, 比如, 用 select user() 的输出就是 root@localhost

MariaDB [(none)]> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)


::1 是ip6 的本地回环地址, 相当于127.0.0.1, 是ipv6的本地ip地址

localhost 是通过 "本地的" /var/lib/mysql/mysql.sock 的套接字来连接的, 而127.1 是通过 TCP/IP 网络网卡 来连接的.

为什么mysql上有那么多的 root用户?

在mysql上要标识一个用户, 要通过 用户名@host 来标识. 这么多的 root账号, 是因为他们的 host 不同:

localhost, 叫做 本地 主机, 注意是 本地 不是本机 , 就是说 是你就在 当前这个机器旁边, 这个机器上的. localhost也叫local, 它是不经过 网卡的, 不受网络防火墙和网卡的限制的;

127.1 , 叫本机 主机, 是本机 服务器, 实际上是一个 网络地址, 是要 受 防火墙和 网卡的 限制的;

::1 , 类似 于 127.1, 只不过 是ip v6, 访问 127.1, 实际上 是经过 网络网卡 的传输, 有数据包的传递, 只不过是: 本地(客户端)的数据包, 经过网卡 传输到 本机服务器.

而 localhost.localdomain, 则是一个 标准的 网络域名了, 类似于 www_example_com. 是要经过TCP/IP的网卡/ 网络传输的.

也就是说, 这四种 host都是不同的,有区别 的, 所以 这些mysql 账户 自然就是有区别的





mysql的匿名 用户?

匿名用户就是 user='', 用户名为空的用户, 或者叫做 "Any" 的用户

匿名用户的权限是 usage [ju:'sid3], 实际上, 就是没有任何权限 的本地用户 : grant usage on . to ''@'localhost'

可以删除匿名用户( 即空用户, any用户): delete from mysql.user where user=''

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐