ZBLOG

openresty连接jdbc-proxy报错 connect to mysql error : Unknown collation: '0'

这个错误表明 OpenResty 通过 JDBC-Proxy(如 MySQL Connector/J 的代理层)连接 MySQL 时,字符集/排序规则(collation)协商失败。以下是针对性解决方案:


错误原因深度解析

  1. 核心问题:JDBC-Proxy 与 MySQL 服务端的字符集映射不一致
    • Unknown collation: '0' 表示代理返回了无效的 collation ID
    • 常见场景:
      • JDBC-Proxy 版本过旧(尤其对 MySQL 8.0+ 支持不足)
      • OpenResty 使用的 lua-resty-mysql 驱动未正确处理代理响应
      • MySQL 服务端启用了新式 collation(如 utf8mb4_0900_ai_ci

分步解决方案

方案1:强制指定连接参数(首选)

在 OpenResty 连接配置中显式声明字符集和协议版本:

  1. local mysql = require "resty.mysql"
  2. local db, err = mysql:new()
  3. local ok, err = db:connect{
  4. host = "jdbc-proxy-host",
  5. port = proxy_port,
  6. user = "username",
  7. password = "password",
  8. database = "dbname",
  9. -- ↓↓↓ 关键参数 ↓↓↓
  10. charset = "utf8", -- 保守方案先用utf8
  11. collation = "utf8_general_ci", -- 明确指定传统collation
  12. protocol = "classic", -- 强制使用经典协议(避开部分代理问题)
  13. ssl_verify = false -- 若代理有SSL问题可临时关闭
  14. }

方案2:调整JDBC-Proxy配置

以常见的 MySQL Router / ShardingSphere-Proxy为例:

  1. # ShardingSphere-Proxy配置示例 (config-sharding.yaml)
  2. props:
  3. # ↓↓↓ 关键参数 ↓↓↓
  4. proxy-default-collation: utf8_general_ci
  5. proxy-mysql-version: 5.7.22 #伪装成老版本MySQL

方案3:升级或降级组件

  1. # OpenResty驱动升级(需确认兼容性)
  2. luarocks install lua-resty-mysql@latest
  3. # JDBC-Proxy升级(如ShardingSphere)
  4. wget https://dlcdn.apache.org/shardingsphere/5.3.2/apache-shardingsphere-5.3.2-shardingsphere-proxy-bin.tar.gz
  5. # MySQL驱动降级(临时方案)
  6. mvn dependency:get -Dartifact=mysql:mysql-connector-java:5.1.49

方案4:MySQL服务端调整

  1. --全局修改collation(需DBA权限)
  2. SET GLOBAL collation_server = 'utf8_general_ci';
  3. ALTER DATABASE your_db CHARACTER SET utf8 COLLATE utf8_general_ci;

高级调试技巧

  1. 抓包分析握手过程

    1. tshark -i eth0 -Y "mysql.command==22" -V

    观察握手阶段的 Character Set (0x21)字段值

  2. 日志诊断: “`sql – JDBC-Proxy执行(如ShardingSphere) SHOW VARIABLES LIKE ‘%coll%’; SHOW PROCESSLIST;

– MySQL服务端执行 SELECT * FROM information_schema.collations WHERE id=0;

  1. 3. **绕过代理测试直连**:
  2. ```lua
  3. db:connect{
  4. host = "real_mysql_ip", --直接连后端MySQL测试
  5. port = 3306,
  6. ...
  7. }

关键参数对照表

组件 推荐配置项 作用
OpenResty charset=utf8 避开新版字符集冲突
JDBC-Proxy proxy-default-collation=utf8_general_ci 统一代理层collation
MySQL服务端 character_set_server=utf8 全局默认字符集

⚠️注意事项

  1. 生产环境慎用降级操作,优先尝试方案1和方案2
  2. MySQL Router可能需要添加启动参数:
  1. [DEFAULT]
  2. collation_server=utf8_general_ci
  1. AWS RDS等云数据库可能需要联系厂商调整底层参数组

如需进一步帮助,请提供以下信息:
✅ OpenResty的 nginx -V输出
✅ JDBC-Proxy的类型和版本号
✅ Wireshark抓包的握手阶段截图


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23573

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?