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 连接配置中显式声明字符集和协议版本:

local mysql = require "resty.mysql"
local db, err = mysql:new()

local ok, err = db:connect{
    host = "jdbc-proxy-host",
    port = proxy_port,
    user = "username",
    password = "password",
    database = "dbname",
    -- ↓↓↓ 关键参数 ↓↓↓
    charset = "utf8",                      -- 保守方案先用utf8
    collation = "utf8_general_ci",         -- 明确指定传统collation
    protocol = "classic",                  -- 强制使用经典协议(避开部分代理问题)
    ssl_verify = false                     -- 若代理有SSL问题可临时关闭
}

方案2:调整JDBC-Proxy配置

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

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

方案3:升级或降级组件

# OpenResty驱动升级(需确认兼容性)
luarocks install lua-resty-mysql@latest

# JDBC-Proxy升级(如ShardingSphere)
wget https://dlcdn.apache.org/shardingsphere/5.3.2/apache-shardingsphere-5.3.2-shardingsphere-proxy-bin.tar.gz

# MySQL驱动降级(临时方案)
mvn dependency:get -Dartifact=mysql:mysql-connector-java:5.1.49

方案4:MySQL服务端调整

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

高级调试技巧

  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;


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

关键参数对照表

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

⚠️注意事项

  1. 生产环境慎用降级操作,优先尝试方案1和方案2
  2. MySQL Router可能需要添加启动参数:
[DEFAULT]
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

注册

已经有帐号?