杂谈:使用Mysql时可能不被注意的小细节
导语
最近笔者在学习写一个小项目,开发过程比较顺利,但也会出现一些小bug。尤其是在使用数据库时,如果不注意处理一些细节问题,在开发过程中就有可能频繁地跳出bug。因此,今天就对这几个小问题写一个汇总式的杂谈。
注:笔者使用的Mysql 版本为5.7。如果是更高的版本,可能又会有新的差异(尤其是Mysql 8.0以上的版本)。因此,请大家多多留心。
---------------------以下为正文内容------------------------
1. TIMESTAMP 默认值为零的错误
错误内容如下:
1067 – Invalid default value for ‘comment_date’
这个异常会出现在数据库创建表的过程中,当在给拥有TIMESTAMP属性字段中添加带0的日期或者null的日期时就会报出此错误。
出现问题的原因:sql_mode设置值的问题,具体设置值大家可以参考这篇文章:sql_mode合理设置.
解决方案:修改sqlmode中的设置值
方案一:以管理员身份打开数据库配置文件: “my.cnf”,找到 [mysqlId] 中的sql_mode字段后,删除 “NO_ZERO_DATE”,“NO_ZERO_IN_DATE” 两个参数,再重启mysql服务即可。
方案二:在终端(Windows系统为cmd,Mac或Linux系统为Terminal)中,使用命令行登录数据库,之后添加如下两行代码,之后退出再连接mysql即可:
mysql-> set global;
mysql-> sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
2. 建表时忽略字符编码设置,导致中文不可用
首先在此提醒:强烈建议大家在创建数据表时,一定在最后加上utf-8编码设置,否则将无法添加中文值。(图片中的最后一行)
如果忘记添加,可以通过以下方法解决:
在Navicat等工具中,右键选择“表格设置”,之后把需要中文的字段添加utf-8编码即可:
3. 零值日期导致Java代码查询时出错
具体错误见图:
问题原因:mysql中的date类型数值范围是1000-01-01 00:00:00到9999-12-31 23:59:59,而0000-00-00 00:00:00不在范围内,因而报出异常。
解决方案:修改jdbc连接代码
在jdbc的连接代码中,在后面添加以下内容即可:
&zeroDateTimeBehavior=convertToNull
完整的连接代码为:
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
以此,jdbc会把把零值日期转换为NULL,问题得以解决。
至此,本篇杂谈所说的三个问题就结束了。各位伙伴如果还遇到别的值得注意的mysql相关问题,可以在评论区中留言。