mysql查询中文列名返回’?'字符
问题描述:
1)C语言使用ODBC连接mysql,并查询某表的列名(该表名与列名均为中文),数据库编码为utf-8。此时表名无法识别,设置部分属性后(character_set_client设置为了utf8mb4)中文列名返回问号,英文列名正常返回,SQLFetch返回警告信息,sqlstate为22018。
2)窗体字符集为utf-8,屏幕输入中文变量值,接收后写入txt文档,该中文写入文档后乱码。
解决方案:
1)使用odbc通过驱动连接时设置字符集。例如:连接时使用的字符串str:
SERVER=%s;DRIVER=%s;PORT=%d;DATABASE=%s;USER=%s;PASSWORD=%s;OPTION=67108866;CHARSET=%s;
2)将接收到的utf8变量值转为gbk后写入文档。
提示:下面为问题解决过程中涉及到的相关知识
一、字符集环境设置与数据库参数不一致
在使用SQL进行查询时,有时会遇到客户端查询返回乱码或者查询结果异常的问题,造成这些问题的主要原因为字符集的参数character_set_client,character_set_connection,character_set_results,collation_connection设置不合理导致,只有保证客户端环境字符集与数据库参数设置字符集一致,才能避免问题的发生。
接下来文章的主要内容是关于解析SQL查询过程中涉及到的相关字符集参数的作用以及如何正确设置字符集参数。
————————————————
1.1 MySQL字符集转化流程
从客户端发起SQL查询到查询结果返回这个过程中需要经过多个流程的编码以及解码,当其中一个流程的字符集设置不正确,就可能导致查询结果返回乱码或者查询结果异常的情况。字符集转化流程如下:
1)客户端环境字符集:
客户端环境的字符集将发送字符编码为字节值发送给MySQL
客户端环境的字符集查询:1)echo $LANG;2)对中文字符查看字节数;
2)character_set_client:
MySQL根据character_set_client设置的字符集将客户端发送的字节值转化为字符
例如将character_set_client参数设置为gbk:set character_set_client=gbk;
3)character_set_connection及collation_connection:
MySQL根据character_set_connection设置的字符集将上一步的字符转化为当前字符集编码,这个参数不同的字符集设置其实不影响结果的查询返回,因为下一步还是会转化为表字段的字符集再进行比较,这一步主要的作用还是collation_connection参数对字符串的比较规则
4)character_set_results:
MySQL根据参数character_set_results设置的字符集将返回结果编码发送给客户端
总结:
1、四个参数character_set_client,character_set_connection,character_set_results,collation_connection只有character_set_client,character_set_results,collation_connection对查询可能造成影响。
2、避免客户端查询返回乱码或者查询结果异常的方法就是保证客户端环境字符集与数据库参数character_set_client,character_set_connection,character_set_results,collation_connection字符集设置一致。
utf8的窗体字符集向txt中写入中文乱码
需要在写入之前,将要写入的内容转码为GBK,然后进行写入。转码方式:可参考