利用lua脚本查询mysql结果中文乱码的问题

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

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脚本查询的数据正文也可以访问了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夙白风语

有需要的可以看看

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值