ZBLOG

openresty报错do_query_db(): connect to mysql error : Unknown collation: '0' , errno : 1273 , sqlstate : HY000

这个错误表明 OpenResty 在连接 MySQL 数据库时遇到了字符集排序规则(collation)不兼容的问题。以下是详细分析和解决方案:


错误原因

  1. 不支持的 Collation
    MySQL 报错 Unknown collation: '0' 表示客户端或驱动尝试使用了 MySQL 服务端不支持的字符集排序规则(如 utf8mb4_0900_ai_ci 等新版本规则)。

  2. 版本不匹配

    • 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;

验证步骤

  1. 确认MySQL支持的Collation
    登录MySQL执行:

    SHOW COLLATION LIKE 'utf8%';
    
  2. 测试连接
    修改后的OpenResty代码重新加载,观察是否报错。


常见问题扩展

  • 若仍失败:检查防火墙、用户权限、MySQL服务状态。
  • 性能优化:建议连接池复用和管理,避免频繁创建新连接。

通过以上步骤应能解决问题。如果仍有疑问,可以提供更多上下文进一步分析!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?