一,如果页面是gbk编码,c++编码为gbk,数据库内编码也为gbk的情况: 为了保证中文存入数据库内也为gbk编码,可以使用以下几种方法:
1,第一种方法:使用mysql_set_character_set 来设置当前连接实例的数据库编码:
a,方法介绍:
Description
This function is used to set the default character set for the current connection. The string csname specifies a valid character set name. The connection collation becomes the default collation of the character set. This function works like the SET NAMES statement, but also sets the value of mysql->charset, and thus affects the character set used by mysql_real_escape_string()
Return Values
Zero for success. Nonzero if an error occurred.
Example
MYSQL mysql;
mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"host","user","passwd" ,"database",0,NULL,0))
{ fprintf(stderr, "Failed to connect to database: Error: %sn", mysql_error(&mysql));}
if (!mysql_set_character_set(&mysql, "gbk"))
{ printf("New client character set: %sn",mysql_character_set_name(&mysql));}
2,第二种方法:使用mysql_query(MYSQL *mysql, const char *stmt_str) 来设置每个查询语句的字符编码:
mysql_query(&mysql, "set names gbk");
保证每个查询都是按照gbk编码方式去进行的查询,where后面的条件,比如:‘table.column1’ = 后面的字符串为gbk编码;
二,如果页面是utf8编码,c++编码为gbk,数据库内编码也为gbk的情况:
只能先转换为gbk编码,之后再使用以上方法存入数据库内;
三,如果页面是utf8编码,c++编码为gbk,数据库内编码也为utf8的情况:
1,可以与先将utf8转换为gbk编码,传给c++,c++在通过iconv将gbk转换为utf8编码,之后使用mysql_set_character_set(&mysql, "utf8")) 或 mysql_query(&mysql, "set names utf8"); 注意:utf8 没有横杠;
2,可以使用c++内存拷贝的方式:
char数组,char * 作为变量进行memncpy之类的内存拷贝方式,将从页面拷贝过来的字符串传入数据库,从而保证数据编码的一致性。
千万不要使用:string这类带有编码依赖的数据类型,也不要使用用例如:snprintf,sprintf之类的方法,
比如传递过来的数据为:
例如:传递过来的二进制字节流为:char[4] param_01= "母亲";(utf8编码方式)
char utf8_str[10] = {0};
memcpy(utf8_str,param_01,sizeof(param_01));
2014-09-24 12:05:33