这个错误表明 OpenResty 通过 JDBC-Proxy(如 MySQL Connector/J 的代理层)连接 MySQL 时,字符集/排序规则(collation)协商失败。以下是针对性解决方案:
错误原因深度解析
- 核心问题: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;
高级调试技巧
抓包分析握手过程:
tshark -i eth0 -Y "mysql.command==22" -V
观察握手阶段的
Character Set
(0x21)字段值日志诊断: “`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和方案2
- MySQL Router可能需要添加启动参数:
[DEFAULT]
collation_server=utf8_general_ci
- AWS RDS等云数据库可能需要联系厂商调整底层参数组
如需进一步帮助,请提供以下信息:
✅ OpenResty的 nginx -V
输出
✅ JDBC-Proxy的类型和版本号
✅ Wireshark抓包的握手阶段截图
内容由零声教学AI助手提供,问题来源于学员提问