Java开发常遇到的坑总结

210 阅读3分钟

Java日常开发的21个坑,你踩过几个?

mysql8数据库的时区坑

参考:mysql时区问题解决几种方法_mysql now 时区

  • 使用SELECT NOW()查看当前数据库时间

  • 使用SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)查看时区

image.png

使用show variables like'%time_zone'查询当前配置, system_time_zone:Mysqld在启动的时候,会读取系统配置,做为固化值,此参数只读,想要更改只能重启

image.png

如果不想改数据库和系统时间,还有一种是在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连接参数说明:

  1. 通过在JDBC连接URL中设置characterEncoding=utf-8,可以确保在与数据库进行字符数据交互时使用UTF-8编码,以防止字符乱码的问题。
  2. useUnicode=true:设置该参数可以在与数据库进行字符数据交互时使用Unicode字符编码。Unicode是一种字符编码方案,支持全球范围内的字符集和字符表示。启用useUnicode=true可以确保正确地处理非ASCII字符和国际化字符。
  3. zeroDateTimeBehavior=convertToNull:该参数指定在使用零日期和时间值时的行为。零日期是指数据库中的空日期或时间字段,默认情况下,当从数据库中检索到零日期时,JDBC将其转换为Java中的"0001-01-01"或"00:00:00"。通过设置zeroDateTimeBehavior=convertToNull,在检索到零日期时,JDBC将其转换为Java中的NULL值而不是"0001-01-01"或"00:00:00"。
  4. useSSL=true:该参数用于启用与MySQL数据库之间的安全连接(SSL)。使用useSSL=true可确保通过加密的安全套接字层(SSL)连接与MySQL数据库进行通信。这有助于保护数据在传输过程中的安全性,尤其是在通过公共网络进行连接时。

注意

useUnicode=truecharacterEncoding 是两个相关但不完全相同的概念。

  • useUnicode=true:该参数指示在与数据库进行字符数据交互时,使用Unicode字符编码。Unicode能够表示几乎所有的字符集,包括中文和其他国际字符。启用 useUnicode=true 会告诉 JDBC 驱动程序在传输数据之前将 Unicode 字符转换为字节流,并在接收到字节流时将其转换回 Unicode 字符。
  • characterEncoding:该参数指定在字符编码转换中使用的字符集编码。常见的值包括 utf8、utf8mb4、gbk 等。当数据库表的字符编码与 Java 应用程序中使用的字符编码不同时,需要通过设置 characterEncoding 来指定字符编码转换的方式。这样可以确保在与数据库进行字符数据交互时,数据能够正确地进行编码和解码。

通常情况下,如果要在与数据库进行字符数据交互时使用 Unicode 字符编码,则需要设置 useUnicode=true,同时还需要设置 characterEncoding 为与数据库表字符集相匹配的字符编码。