本节介绍连接到 MySQL 的 URL 语法。
这是连接 URL 的通用格式
protocol//[hosts][/database][?properties]
URL 由以下部分组成
任何出现在连接 URL 任何部分的 URL 保留字符(例如,/
、:
、@
、(
、)、[
、]
、&
、#
、=
、?
和空格)必须进行百分比编码。
协议
连接可能使用的协议如下:
jdbc:mysql:
用于普通和基本的 JDBC 故障转移连接。jdbc:mysql:loadbalance:
用于负载均衡 JDBC 连接。有关详细信息,请参阅第 9.3 节,“使用 Connector/J 配置负载均衡”。jdbc:mysql:replication:
用于 JDBC 复制连接。有关详细信息,请参阅第 9.4 节,“使用 Connector/J 配置源/副本复制”。mysqlx:
用于 X DevAPI 连接。jdbc:mysql+srv:
用于使用 DNS SRV 记录的普通和基本的故障转移 JDBC 连接。jdbc:mysql+srv:loadbalance:
用于使用 DNS SRV 记录的负载均衡 JDBC 连接。jdbc:mysql+srv:replication:
用于使用 DNS SRV 记录的复制 JDBC 连接。mysqlx+srv:
用于使用 DNS SRV 记录的 X DevAPI 连接。
主机
根据具体情况,主机
部分可能仅包含主机名,也可能是一个复杂结构,包含多个主机名、端口号、特定于主机的属性和用户凭据等元素。
-
-
-
主机
部分以主机
:端口
的格式编写。这是一个简单的单个主机连接 URL 示例jdbc:mysql://host1:33060/sakila
主机
可以是 IPv4 或 IPv6 主机名字符串,在后一种情况下,它必须放在方括号内,例如 “[1000:2000::abcd].” 当未指定主机
时,将使用localhost
的默认值。端口
是一个标准端口号,即 1 到 65535 之间的整数。普通 MySQL 连接的默认端口号为 3306,使用 X 协议的连接的默认端口号为 33060。如果未指定端口
,则使用相应的默认值。
-
-
-
在这种情况下,主机被定义为一系列
对。键用于标识主机、端口以及任何特定于主机的属性。有两种用于指定键的替代格式键
=值
-
““地址等号”” 格式
address=(host=host_or_ip)(port=port)(key1=value1)(key2=value2)...(keyN=valueN)
这是一个使用““地址等号”” 格式的示例 URL
jdbc:mysql://address=(host=myhost)(port=1111)(key1=value1)/db
-
““键值”” 格式
(host=host,port=port,key1=value1,key2=value2,...,keyN=valueN)
这是一个使用““键值”” 格式的示例 URL
jdbc:mysql://(host=myhost,port=1111,key1=value1)/db
-
主机和端口由键
主机
和端口
标识。上面不添加特定于主机的属性的单个主机 中关于主机
和端口
格式和默认值的描述也适用于此。可以添加的其他键包括
用户
、密码
、协议
等等。它们会覆盖在属性
URL 部分中设置的全局值。将覆盖限制为用户、密码、网络超时以及语句和元数据缓存大小;其他每个主机覆盖的效果未定义。-
不同的协议可能需要不同的键。例如,
mysqlx:
方案使用两个特殊键,地址
和优先级
。地址
是一个主机
:端口
对,优先级
是一个整数。例如mysqlx://(address=host:1111,priority=1,key1=value1)/db
键
区分大小写。两个仅大小写不同的键被认为是冲突的,并且不保证使用哪个键。
-
-
-
有两种格式可用于指定多个主机
-
以逗号分隔列表形式列出主机
host1,host2,...,hostN
每个主机都可以以上面单个主机 中描述的三种方式中的任何一种进行指定。以下是一些示例
jdbc:mysql://myhost1:1111,myhost2:2222/db jdbc:mysql://address=(host=myhost1)(port=1111)(key1=value1),address=(host=myhost2)(port=2222)(key2=value2)/db jdbc:mysql://(host=myhost1,port=1111,key1=value1),(host=myhost2,port=2222,key2=value2)/db jdbc:mysql://myhost1:1111,(host=myhost2,port=2222,key2=value2)/db mysqlx://(address=host1:1111,priority=1,key1=value1),(address=host2:2222,priority=2,key2=value2)/db
-
以逗号分隔列表形式列出主机,然后用方括号括起列表
[host1,host2,...,hostN]
这称为主机子列表形式,它允许所有列表中的主机共享用户凭据,就好像它们是单个主机一样。列表中的每个主机都可以以上面单个主机 中描述的三种方式中的任何一种进行指定。以下是一些示例
jdbc:mysql://sandy:secret@[myhost1:1111,myhost2:2222]/db jdbc:mysql://sandy:secret@[address=(host=myhost1)(port=1111)(key1=value1),address=(host=myhost2)(port=2222)(key2=value2)]/db jdbc:mysql://sandy:secret@[myhost1:1111,address=(host=myhost2)(port=2222)(key2=value2)]/db
虽然无法递归地写入主机子列表,但主机列表可以包含主机子列表作为其成员主机。
-
-
用户凭据可以在连接 URL 之外设置,例如,作为从
java.sql.DriverManager
获取连接时的参数(有关详细信息,请参阅第 6.3 节,“配置属性”)。当使用连接 URL 设置用户凭据时,有几种方法可以指定它们-
使用
@
将单个主机、主机子列表(请参阅多个主机)或主机列表中的任何主机与用户凭据前缀起来user:password@host_or_host_sublist
例如
mysqlx://sandy:secret@[(address=host1:1111,priority=1,key1=value1),(address=host2:2222,priority=2,key2=value2))]/db
-
使用键
用户
和密码
为每个主机指定凭据(user=sandy)(password=mypass)
例如
jdbc:mysql://[(host=myhost1,port=1111,user=sandy,password=secret),(host=myhost2,port=2222,user=finn,password=secret)]/db jdbc:mysql://address=(host=myhost1)(port=1111)(user=sandy)(password=secret),address=(host=myhost2)(port=2222)(user=finn)(password=secret)/db
在这两种形式中,当指定多个用户凭据时,最左边的凭据优先——也就是说,从连接字符串的左到右,找到第一个适用于主机的凭据,即使用该凭据。
在 内部 主机子列表中,任何主机都不能以 @ 格式拥有用户凭据,但单个主机可以以键格式指定用户凭据。
-
数据库
要打开的默认数据库或目录。如果没有指定数据库,则连接将建立,但没有默认数据库。在这种情况下,您可以在 Connection
实例上调用 setCatalog()
方法,或者在您的 SQL 语句中使用数据库名称来指定表名(即 SELECT
)。通常,在构建与多个数据库(例如 GUI 数据库管理器)一起使用的工具时,才会在未指定要使用的数据库的情况下打开连接。dbname
.tablename
.colname
FROM dbname.tablename...
在 JDBC 应用程序中,始终使用 Connection.setCatalog()
方法来指定所需的数据库,而不是使用 USE
语句。database
properties
一系列应用于所有主机的全局属性,以 ?
开头,并以
对的形式编写,对之间用符号 “key
=value
&.
” 分隔。以下是一些示例
jdbc:mysql://(host=myhost1,port=1111),(host=myhost2,port=2222)/db?key1=value1&key2=value2&key3=value3
以下内容适用于键值对
key
和value
只是字符串。Connector/J 在内部执行适当的类型转换和验证。key
区分大小写。两个仅大小写不同的键被认为是冲突的,并且不确定将使用哪一个。在 单个主机,包含主机特定属性 和 多个主机 中以键值对形式指定的任何主机特定值都将覆盖此处设置的全局值。
有关配置属性的详细信息,请参见 第 6.3 节,“配置属性”。