最近在Phpfreaks.com论坛上提出了一个问题,即有人使用MySQL数据库存储用户出生日期的最佳方式。一个人建议使用varchar,因为他们最熟悉字符串函数。我的回答是使用MySQL日期类型。
我提供了一个快速的“使用日期的优点”比较列表:
存储为日期
•MySQL日期需要3个字节的存储空间
•您可以在mysql内部执行日期算术(搜索范围内的日期)并使用mysql函数直接计算值查询
•它本质上只存储有效日期
•您可以通过多种方式对其进行格式化
存储为Varchar
•字符串最少需要8个字节,或者10个字符串需要分隔符
•不能执行任何形式的高效本机范围查询
•无法在SQL中轻松地重新格式化
•将允许完全无效的日期
我认为这是一个很好的证明方法是表明你可以让MySQL使用他们的生日计算查询中人的当前年龄。当然使用字符串,例如使用PHP,您通常会查询数据库以提取字符串,并为每一行,将其转换为PHP日期并在代码中进行一些计算,然后您到达同一个地方,但是我想展示SQL的能力 - 在这种情况下,MySQL可以特别是当你使用本机数据类型和一些功能时。
在MySQL查询中计算一个人的年龄
我之前写过关于CURDATE()的文章,它可以让你访问“当前服务器日期”作为比较计算的基础。
要计算一个人当前的年龄,简单的食谱是“今年”减去“出生年份”。
使用MySQL Date类型存储用户生日的优点是,您可以使用YEAR()这样的简单函数来为您提供所需日期的任何部分。
mysql > 选择 YEAR ( CURDATE ()) ;
+ ----------------- +
| 年( CURDATE ()) |
+ ----------------- +
| 2011 |
+ ----------------- +
1行中 集合 (0.00秒)
为了测试这个概念,我们将创建一个简单的用户表,其中包含密钥,名称和生日。
CREATE TABLE用户( id int AUTO_INCREMENT PRIMARY KEY , name varchar (20 ), birthdate date ) ;
mysql > describe user;
+ ----------- ------------- + + ------ + ------ + --------- + ---------------- +
| 领域 | 输入 | 空| 钥匙| 默认| 额外的 |
+ ----------- ------------- + + ------ + ------ + --------- + ---------------- +
| id | int (11 ) | 没有 | PRI | NULL | auto_increment |
| 名字 | varchar (20 ) |是的 | | NULL | |
| 生日| 日期 | 是的 | | NULL | |
+ ----------- ------------- + + ------ + ------ + --------- + ---------------- +
3行中 集合 (0.27秒)
现在我们将添加一些用户行:
INSERT INTO用户(姓名,生日) VALUES ('Fran' , '1967-10-31' ) ;
INSERT INTO用户(姓名,生日) VALUES ('Bill' , '1964-05-07' ) ;
INSERT INTO用户(姓名,生日) VALUES ('Jimmy' , '1965-04-27' ) ;
INSERT INTO用户(名称,生日) VALUES ('Stacy' , '2002-11-30' ) ;
INSERT INTO用户(姓名,生日) VALUES ('George' , '2007-10-25' ) ;
mysql > select * from user;
+ ---- + -------- + ------------ +
| id | 名字 | 生日 |
+ ---- + -------- + ------------ +
| 1 | 弗兰 | 1967 - 10 - 31 |
| 2 | 比尔 | 1964年 - 05 - 07年|
| 3 | 吉米 | 1965 -04- 27 |
| 4 | Stacy | 2002 - 11 -30 |
| 5 | 乔治| 2007 - 10 -