MySQL 8.0升级后如何在JDBC连接字符串中设置SQL mode?
解决MySQL 8.0 JDBC连接字符串中设置SQL Mode的问题
这个错误是因为MySQL 8.0对应的Connector/J 8.x驱动对连接字符串的语法解析变得更严格了,你之前5.7里用的sessionVariables=sql_mode=''写法里的单引号嵌套会被驱动误判为格式错误——它会把第一个单引号当作参数值的起始,后面的='')就成了无效的语法片段,自然抛出解析错误。
下面是几种可行的解决方法:
方法1:URL编码转义单引号
把连接字符串里的单引号替换为URL编码的%27,这样驱动就能正确解析空SQL Mode的设置了:
jdbc:mysql://[host:port]/[database]?sessionVariables=sql_mode=%27%27
方法2:直接设置具体SQL Mode值(无嵌套单引号)
如果你需要设置非空的SQL Mode,直接写值即可,不需要额外嵌套单引号,比如关闭引擎替换限制:
jdbc:mysql://[host:port]/[database]?sessionVariables=sql_mode=NO_ENGINE_SUBSTITUTION
如果要设置多个SQL Mode规则,用逗号分隔:
jdbc:mysql://[host:port]/[database]?sessionVariables=sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
方法3:使用sql_mode直接参数(推荐,Connector/J 8.0.13+支持)
从Connector/J 8.0.13版本开始,驱动支持直接用sql_mode参数来设置,写法更简洁直观:
设置空SQL Mode:
jdbc:mysql://[host:port]/[database]?sql_mode=''
设置具体值:
jdbc:mysql://[host:port]/[database]?sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
额外注意事项
- 务必确保你使用的是适配MySQL 8.0的JDBC驱动(
mysql-connector-java8.x版本),5.x驱动和8.0实例存在诸多兼容性问题,不建议混用。 - 如果需要同时设置多个连接参数,记得用
&分隔,比如同时指定时区和SQL Mode:
jdbc:mysql://[host:port]/[database]?serverTimezone=UTC&sql_mode=%27%27
内容的提问来源于stack exchange,提问作者Fernet
相关产品推荐
相关产品推荐

