这个错误表明 OpenResty 在连接 MySQL 数据库时遇到了字符集排序规则(collation)不兼容的问题。以下是详细分析和解决方案:
错误原因
不支持的 Collation
MySQL 报错Unknown collation: '0'表示客户端或驱动尝试使用了 MySQL 服务端不支持的字符集排序规则(如utf8mb4_0900_ai_ci等新版本规则)。版本不匹配
- MySQL 服务端版本较旧(如 5.7),而客户端或驱动默认使用新版本的 Collation(如 MySQL 8.0+ 的规则)。
- OpenResty 使用的 Lua MySQL 驱动(如
lua-resty-mysql)可能未正确配置字符集。
解决方案
1. 检查并统一字符集配置
在 OpenResty 连接 MySQL 的代码中,显式指定兼容的字符集和排序规则:
local mysql = require "resty.mysql"
local db, err = mysql:new()
db:set_timeout(1000) -- 超时时间
local ok, err, errno, sqlstate = db:connect({
host = "127.0.0.1",
port = 3306,
database = "your_db",
user = "user",
password = "password",
charset = "utf8", -- 明确指定字符集
collation = "utf8_general_ci" -- 使用旧版排序规则
})
2. 升级或对齐 MySQL 版本
- 方案A:升级 MySQL 服务端到与客户端驱动兼容的版本(如均使用 MySQL 8.0+)。
- 方案B:在旧版 MySQL(5.7)中手动创建所需的 Collation(需谨慎操作)。
3. Lua-Resty-MySQL驱动的调整
确保使用的 lua-resty-mysql 最新版本,并检查其默认配置:
http {
lua_package_path "/path/to/lua-resty-mysql/lib/?.lua;;";
}
4. SQL语句显式指定Collation
在查询中强制指定已知的 Collation:
SELECT * FROM table_name COLLATE utf8_general_ci;
验证步骤
确认MySQL支持的Collation
登录MySQL执行:SHOW COLLATION LIKE 'utf8%';测试连接
修改后的OpenResty代码重新加载,观察是否报错。
常见问题扩展
- 若仍失败:检查防火墙、用户权限、MySQL服务状态。
- 性能优化:建议连接池复用和管理,避免频繁创建新连接。
通过以上步骤应能解决问题。如果仍有疑问,可以提供更多上下文进一步分析!
内容由零声教学AI助手提供,问题来源于学员提问




