QT(C++)连接MySQL中文乱码解决

方法1、QSqlDatabase对象设置UTF-8编码

QSqlDatabase db;
db.exec("SET NAMES 'UTF-8'");

方法2、将MySQL编码设置成UTF-8

show variables like 'character_set_%';

QT(C++)连接MySQL中文乱码解决_第1张图片
各字段的含有如下:
QT(C++)连接MySQL中文乱码解决_第2张图片
主要关注的是character_set_client、character_set_connection、character_set_results这三个变量。
他们的含义可以看以下例子:

首先client一般会发送一条sql给客户端,比如select * from table where name = ‘某某某’;,在分析的过程中,我们主要对查询参数“某某某”进行分析。
1、首先“某某某”三个字被client端进行编码为二进制流,传输给服务器。
2、服务器收到后,会认为客户端的编码为character_set_client对“某某某”进行解码,获取client发送的字符串sql。
3、解码之后,再把sql转换为character_set_connection格式,使得能与数据库连接的字符集相同。
4、解码成character_set_connection之后,就进行数据比对查询。此时如果要比对的列的字符集与character_set_connection不相等,那显然就是会有问题的。
5、数据查询出来之后,对结果要进行编码,编码的字符集就采用character_set_results字符集,此时如果客户端接收的字符集与character_set_connection不相同,那么客户端解码的数据也会出现问题。

设置MySQL编码:

set character_set_client=utf-8;
set character_set_connection=utf-8;
set character_set_database=utf-8;
set character_set_results=utf-8;
set character_set_server=utf-8;
set collation_database = utf8mb4_unicode_ci;
set collation_connection = utf8mb4_unicode_ci;

方法3、MySQL的my.ini文件或my.cnf设置UTF-8

在mysql数据库的安装根目录下找到my.ini,例:C:\ProgramData\MySQL\MySQL Server 8.0

# 在[mysql]下设置mysql客户端默认字符集
default-character-set=utf8 
# 在[mysqld]下设置服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8

然后重启MySQL服务。

方法4、头文件设置UTF-8

#pragma execution_character_set("utf-8")

方法5、使用QString::fromLocal8Bit()

QString sql = QString::fromLocal8Bit("SELECT * FROM table");

你可能感兴趣的