简介
本文介绍MySQL如何修改时区;驱动版本;连接器与驱动版本;驱动的类型。
时区
错误信息
java.sql.SQLException: The server time zone value ‘???ú±ê×??±??’ is unrecognized or represents more than one time zone
解决方法
修改时区。以下修改服务器或者客户端url连接的时区都可以。
法1:修改服务器时区
方式1:命令修改
set global time_zone = '+8:00'; ## 修改mysql全局时区为北京时间,即我们所在的东8区 set time_zone = '+8:00'; ## 修改当前会话时区 flush privileges; ## 立即生效
方式2:修改配置文件
【linux:my.cnf,windows:my.ini】
在[mysqld]区域中加上下边这行:
default-time_zone = '+8:00'
重启MySQL服务。
法2:修改客户端url连接时区
serverTimezone=xxx
UTC:世界均衡时间(英国伦敦时间)(比中国早8个小时)
GMT:格林尼治时间(也是英国伦敦时间,和UTC作用相同)
CST:美中地区(-6)
GMT%2B8:北京时间(+8)
Asia/Shanghai:上海时间(+8)(等于北京时间)
Asia/Hongkong:香港时间(+8)(等于北京时间)
尽量按照这个顺序:characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
配置方法可参考下边“驱动版本”。
驱动版本
com.mysql.jdbc.Driver 是 mysql-connector-java 5的,com.mysql.cj.jdbc.Driver 是 mysql-connector-java 6的。
因为springboot支持松散匹配,所以utf8与UTF-8是一样的。
Mysql5的application.yml配置
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai password: xxx username: yyy jpa: hibernate: ddl-auto: none
Mysql6及以上的application.yml配置
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai password: xxx username: yyy jpa: hibernate: ddl-auto: none
连接器与驱动版本
警告1:版本
如果mysql-connector-java(pom.xml的依赖版本)用的6.0以上的,但driver用的还是com.mysql.jdbc.Driver,就会报警告:
Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
此时需要把com.mysql.jdbc.Driver 改为com.mysql.cj.jdbc.Driver
警告2:SSL
WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
翻译:
不推荐不使用服务器身份验证来建立SSL连接。
如果未明确设置,MySQL 5.5.45+, 5.6.26+ and 5.7.6+版本默认要求建立SSL连接。
为了符合当前不使用SSL连接的应用程序,verifyServerCertificate属性设置为’false’。
如果你不需要使用SSL连接,你需要通过设置useSSL=false来显式禁用SSL连接。 如果你需要用SSL连接,就要为服务器证书验证提供信任库,并设置useSSL=true。
驱动类型
简介
有三种类型,如下:
- Class.forName(“com.mysql.jdbc.Driver”);(推荐)
- new com.mysql.jdbc.Driver() ;
- System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
1. Class.forName(“com.mysql.jdbc.Driver”); //加载数据库驱动
- Class.forName(“com.mysql.jdbc.Driver”); //加载数据库驱动
- String url=”jdbc:mysql://localhost:3306/databasename”; //数据库连接子协议
- Connection conn=DriverManager.getConnection(url, “username”, “password”);
此方式由于参数为字符串,因此很容易修改,移植性强。最常见的注册方式,也是推荐的方式。
2. new com.mysql.jdbc.Driver() ; // 创建driver对象,加载数据库驱动
- new com.mysql.jdbc.Driver(); // 创建driver对象,加载数据库驱动
- String url=”jdbc:mysql://localhost:3306/databasename”; //数据库连接子协议
- Connection conn=DriverManager.getConnection(url,”username”,”password”);
这里不需要这样写DriverManager.registerDriver(new com.mysql.jdbc.Driver()), 原因是com.mysql.jdbc.Driver类的静态代码快里面已经进行了注册的操作
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }
由new com.mysql.jdbc.Driver()可以知道,这里需要创建一个类的实例。创建类的实例就需要在java文件中将该类通过import导入,否则就会报错。即:采用这种方式,程序在编译的时候不能脱离驱动类包,为程序切换到其他数据库带来麻烦
3.System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”);
- System.setProperty(“jdbc.driver”,”com.mysql.jdbc.Driver”); //系统属性指定数据库驱动
- String url=”jdbc:mysql://localhost:3306/databasename”; //数据库连接子协议
- Connection conn=DriverManager.getConnection(url,”username”,”password”);
可以同时导入多个jdbc驱动,中间用冒号“:”分开,比如System.setProperty(“jdbc.drivers”,”XXXDriver:XXXDriver:XXXDriver”);这样就一次注册了三个数据库驱动。
请先
!