linux下C连接mysql查询表信息汉字乱码问题

今天在linux下用C++封装了一下mysql数据库的连接,在执行 mysql_query(connection,  sql_str.c_str())时,查询得到的汉字是乱码。 最后在网上查阅资料发现需要设置读去数据库的编码格式mysql_query(connection, "set names utf8") 即在执行数据查询之前,要设置一下编码方式!


看到一篇文章是这样介绍“set names charset_name”的


1、SET NAMES ‘charset_name’
SET NAMES显示客户端发送的SQL语句中使用什么字符集。因此,SET NAMES 'cp1251'语句告诉服务器将来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。(例如,如果你使用一个SELECT语句,它表示列值使用了什么字符集。)

2、连接字符集和校对

(1) 一些字符集和校对规则系统变量与客户端和服务器的交互有关。
服务器字符集和校对规则可以用作character_set_server和collation_server变量的值。
默认数据库的字符集和校对规则可以用作character_set_database和collation_database变量的值。
在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。
每一个客户端有一个连接相关的字符集和校对规则变量。

(2)考虑什么是一个“连接”:它是连接服务器时所作的事情。

客户端发送SQL语句,例如查询,通过连接发送到服务器。

服务器通过连接发送响应给客户端,例如结果集。

对于客户端连接,这样会导致一些关于连接的字符集和 校对规则的问题,这些问题均能够通过系统变量来解决:

(3) 当查询离开客户端后,在查询中使用哪种字符集?
服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

(4) 服务器接收到查询后应该转换为哪种字符集?

转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection(除非字符串文字具有象_latin1或_utf8的引介词)。collation_connection对比较文字字符串是重要的。对于列值的字符串比较,它不重要,因为列具有更高的 校对规则优先级。


(5)服务器发送结果集或返回错误信息到客户端之前应该转换为哪种字符集?
character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据(如列名)。

你可能感兴趣的:(linux下C连接mysql查询表信息汉字乱码问题)