如何将Jalali自定义datetime格式存储到MySQL DATETIME字段并规避校验
MySQL存储Jalali日期问题解决方案
核心结论
MySQL的DATETIME类型是按照公历规则设计的,即使关闭校验存储了不符合公历规则的Jalali日期,后续所有MySQL内置日期函数(如DATEDIFF、DATE_ADD等)都会返回错误结果,完全不推荐关闭校验的操作。
关于关闭日期合法性校验的方法
如果你确实需要临时关闭校验,可通过调整SQL模式实现:
- 临时生效(当前会话有效):执行SQL语句
SET sql_mode = 'ALLOW_INVALID_DATES'; - 永久生效:修改MySQL配置文件
my.cnf(Windows系统为my.ini),在[mysqld]节点下添加配置sql_mode = ALLOW_INVALID_DATES,重启MySQL服务后生效。
该模式仅会检查月份范围为1-12、日期范围为1-31,不会校验具体月份对应的日期是否合法,可实现
1400-06-31 12:00:00这类日期的存储,但依然不建议用DATETIME类型存储非公历日期。
更合理的Jalali日期存储方案
针对非公历日期的存储需求,推荐以下三种无副作用的实现方案:
- 方案1:用
VARCHAR(19)类型直接存储格式化后的Jalali日期字符串,完全不受公历日期规则限制,需要做日期运算时在应用层转换处理即可。 - 方案2:用
BIGINT类型存储对应日期的Unix时间戳,所有历法的日期都可以统一转换为时间戳存储,需要展示时在应用层转为Jalali格式即可,同时支持直接通过数值比较实现日期范围筛选。 - 方案3:拆分字段存储,分别用
SMALLINT存年、TINYINT存月、TINYINT存日、TIME类型存时间,可自主实现Jalali规则的校验和运算,完全避免和公历规则冲突。
内容的提问来源于stack exchange,提问作者Mehrdad Dadvand
相关产品推荐
相关产品推荐

