1.发现问题:mysql返回中文乱码
利用 docker 上的 mysql 结合redis和 lua 脚本进行数据查询时,总是中文乱码。redis一直中午是乱码。一开始我以为是脚本的问题,然后在网上各种查询,诸如:
1.在查询之前,先调用db:query("SET NAMES utf8")
2.脚本头部:ngx.header.content_type="application/json;charset=utf8",本来我就写的这个,百度上各种说这个写法不对,有让改成 UTF-8 的,有让改成 utf-8 的;
还有说前面的 content_type 应该是 ngx.header['Content-Type'] 这种写法。
但是我试了,都没用,最后得出结论,与这些好像没多大关系,
正确的还是:
ngx.header.content_type="application/json;charset=utf8"
lua代码:
ngx.header.content_type="application/json;charset=utf8"
local cjson = require("cjson")
local mysql = require("resty.mysql")
local uri_args = ngx.req.get_uri_args()
local id = uri_args["id"]
local db = mysql:new()
db:set_timeout(1000)
local props = {
host = "XXX",
port = 3306,
database = "XXX",
user = "XXX",
password = "XXX"
}
local res = db:connect(props)
local select_sql = "查询sql语句"..id.." order by 列名"
res = db:query(select_sql)
db:close()
local redis = require("resty.redis")
local red = redis:new()
red:set_timeout(2000)
local ip ="XXX"
local port = 6379
red:connect(ip,port)
red:set("content_"..id,cjson.encode(res))
red:close()
ngx.say("{flag:true}")
2.思考问题:Navicat命令是会话级别
还是找不到思路,会不会是mysql的问题。
后来查询到mysql返回中午乱码问题。在Navicat,做如下查询:
SHOW VARIABLES LIKE '%char%';
结果发现:

先改一下
set character_set_server=utf8;
再次修改

可是,我重新开启一个会话的,还是会显示

显然,这并不是从Navicat的会话窗口可以解决的,这个窗口是会话级别的,所以真正修改,还是需要从mysql的配置文件修改才行。
3.解决问题:修改数据库配置文件
Linux中修改MySQL配置文件my.cnf
1.查找my.cnf文件:which mysql
root@9081c72995ce:/etc/mysql/mysql.conf.d# which mysql
/usr/bin/mysql
2.在查询出来的MySQL路径后加上–verbose --help | grep -A 1 ‘Default options’,即可看到my.cnf的路径

上图红框中的提示信息是指,首先读取的是 /etc/my.cnf 文件,如果前一个文件不存在则继续读 /etc/mysql/my.cnf 文件,依此类推,如若还不存在便会去读/usr/etc/my.cnf文件。即mysql的默认加载文件顺序。
3.我是在/etc/mysql/mysql.conf.d的 mysqld.cnf文件中,增加下面代码
character_set_server=utf8
[client]
default-character-set=utf8
操作如下

再次连接,发现正常了

lua脚本查询的数据正文也可以访问了。
在使用lua脚本结合docker上的mysql和redis查询数据时遇到中文乱码问题。通过检查发现Navicat命令是会话级别解决不了问题。最终通过修改MySQL配置文件my.cnf,具体在/etc/mysql/mysql.conf.d/mysqld.cnf中添加相关设置,成功解决了中文乱码问题。

1070

被折叠的 条评论
为什么被折叠?



