mysql8数据库的时区坑
参考:mysql时区问题解决几种方法_mysql now 时区
-
使用
SELECT NOW()查看当前数据库时间 -
使用
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)查看时区
使用show variables like'%time_zone'查询当前配置,
system_time_zone:Mysqld在启动的时候,会读取系统配置,做为固化值,此参数只读,想要更改只能重启
如果不想改数据库和系统时间,还有一种是在jdbc连接的url后面加上serverTimezone=UTC或GMT即可,如果指定使用gmt+8时区,需要写成GMT%2B8,否则可能报解析为空的错误。示例如下:
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=UTC&characterEncoding=utf-8
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=GMT%2B8&characterEncoding=utf-8
jdbc.url=jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
推荐使用serverTimezone=Asia/Shanghai
jdbc连接参数说明:
- 通过在JDBC连接URL中设置
characterEncoding=utf-8,可以确保在与数据库进行字符数据交互时使用UTF-8编码,以防止字符乱码的问题。 useUnicode=true:设置该参数可以在与数据库进行字符数据交互时使用Unicode字符编码。Unicode是一种字符编码方案,支持全球范围内的字符集和字符表示。启用useUnicode=true可以确保正确地处理非ASCII字符和国际化字符。zeroDateTimeBehavior=convertToNull:该参数指定在使用零日期和时间值时的行为。零日期是指数据库中的空日期或时间字段,默认情况下,当从数据库中检索到零日期时,JDBC将其转换为Java中的"0001-01-01"或"00:00:00"。通过设置zeroDateTimeBehavior=convertToNull,在检索到零日期时,JDBC将其转换为Java中的NULL值而不是"0001-01-01"或"00:00:00"。useSSL=true:该参数用于启用与MySQL数据库之间的安全连接(SSL)。使用useSSL=true可确保通过加密的安全套接字层(SSL)连接与MySQL数据库进行通信。这有助于保护数据在传输过程中的安全性,尤其是在通过公共网络进行连接时。
注意
useUnicode=true 和 characterEncoding 是两个相关但不完全相同的概念。
- useUnicode=true:该参数指示在与数据库进行字符数据交互时,使用Unicode字符编码。Unicode能够表示几乎所有的字符集,包括中文和其他国际字符。启用 useUnicode=true 会告诉 JDBC 驱动程序在传输数据之前将 Unicode 字符转换为字节流,并在接收到字节流时将其转换回 Unicode 字符。
- characterEncoding:该参数指定在字符编码转换中使用的字符集编码。常见的值包括 utf8、utf8mb4、gbk 等。当数据库表的字符编码与 Java 应用程序中使用的字符编码不同时,需要通过设置 characterEncoding 来指定字符编码转换的方式。这样可以确保在与数据库进行字符数据交互时,数据能够正确地进行编码和解码。
通常情况下,如果要在与数据库进行字符数据交互时使用 Unicode 字符编码,则需要设置 useUnicode=true,同时还需要设置 characterEncoding 为与数据库表字符集相匹配的字符编码。