数据库中的url参数解释说明

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
      username: root
      password: root

上面的URL中的各项参数代表的含义分别是什么呢?

首先了解URL

url格式-百度百科
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可认为由四部分组成:协议、主机、端口、路径
URL的一般语法格式为:
(带方括号[ ]的为可选项)
protocol : // hostname[:port] / path / [:parameters][?query]#fragment

protocol(协议)
指定使用的传输协议, 最常用的是HTTP协议,它也是WWW中应用最广的协议。
http 通过 HTTP 访问该资源。 格式 HTTP://
https 通过安全的 HTTPS 访问该资源。 格式 HTTPS://

各参数含义

1、url: 统一资源定位符

2、jdbc:mysql 是协议名称 是指JDBC连接方式

3、localhost:3306 是主机:端口 还可以写作127.0.0.1:3306

4、test 是数据库名

5、useSSL: MySQL在高版本需要指明是否进行SSL连接 在mysql连接字符串url中加入ssl=true或者false即可 SSL

6、useUnicode: 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312或gbk,本参数值必须设置为true

7、characterEncoding: 当useUnicode设置为true,给定编码,常用utf8,默认是:autodetect

我们在连接mysql数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8 ,但是问什么要添加呢?

添加的作用是:指定字符的编码、解码格式。
例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
a、存数据时:
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
b、取数据时:
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。

8、serverTimezone: 设置时区 例如 serverTimezone=UTC(统一标准世界时间)或serverTimezone=Asia/Shanghai(中国时区)

9、zeroDateTimeBehavior=convertToNull

在查询 Mysql 数据库的时候,有时候会产生一个异常:
java.sql.SQLException: Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp
翻译为: 值“0000-00-00 00:00:00”不能表示为java.sql.Timestamp。
Datetimes with all-zero components (0000-00-00 …): These values cannot be represented reliably in Java. Connector/J 3.0.x always converted them to NULL when being read from a ResultSet.
翻译为:所有零组件的日期时间(0000-00-00…):这些值在Java中无法可靠地表示。当从结果集读取时,连接器/J 3.0.x总是将它们转换为NULL。
关键在于在 Mysql 里 0000-00-00 00:00:00 可能是有效的;而在 Java 中,这样的转换是无效的。
因此,Mysql JDBC 驱动将抛出一个 java.sql.SQLException ,因为 Java 不能识别 0000-00-00 00:00:00 这样的日期格式。
举个实际的栗子,你的方法中要传入来自页面的日期参数值 ,按照正常的做法,比如日期值为2016-10-11,但是由于误操作,传入了0000-00-00,并没有设置正确的数据,那么这时默认抛出java.sql.SQLException异常
(如果设定这一项 zero datetime behavior (英文字面意思为“0datetime反应”)=
convert to null(英文字面意思为“转化为null”),把日期转换为null代替异常处理):
即这类操作情况的处理策略,有3种
1.exception(不指定,则默认)---->默认抛出异常,
2.convertToNull------->转化为null
3.round------->替换成最近的日期即XXXX-01-01
这个在指定管理的数据库连接属性文件(jdbc.properties )jdbc 的URL常用到。

10、allowPublicKeyRetrieval=true
设置AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥。
AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。
问题一
当使用数据库查询第一条数据的时候,发现报了这个Public Key Retrieval is not allowed(不允许检索公钥)。出现这个问题原因是:mysql8以上版本默认使用 sha256_password 认证,密码在传输过程中必须加密保护,如果无法使用 TLS,就需要使用 RSA 公钥加密。

解决办法:设置AllowPublicKeyRetrieval=True即可解决此问题。

问题二
Access denied for user ‘root’@‘172.17.0.1’ (using password: YES)
此异常和问题一一样,从MySQL8.0 开始,默认的验证方式是caching_sha2_password

解决办法:
使用指令mysql -u root -p指令进入mysql,将验证方式修改为“mysql_native_password”

USE mysql; 
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
//密码123456改成自己的
  • 11
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值