如何使用Connector/C+;发送查询以填充utf8 VARCHAR列+;? 在我的C++应用程序(在Windows X64中使用VS2012开发),我使用MySQL连接器/C++连接MySQL数据库。我已经列出了所有有列的\u用户名: USERNAME VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci 但是,我不知道如何通过我的C++应用程序来触发UTF8查询。方法sql::Statement::executeUpdate接受sql::SQLString类型。它本质上是std::string
所以如果我做这样的事情:如何使用Connector/C+;发送查询以填充utf8 VARCHAR列+;? 在我的C++应用程序(在Windows X64中使用VS2012开发),我使用MySQL连接器/C++连接MySQL数据库。我已经列出了所有有列的\u用户名: USERNAME VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci 但是,我不知道如何通过我的C++应用程序来触发UTF8查询。方法sql::Statement::executeUpdate接受sql::SQLString类型。它本质上是std::string,c++,mysql,utf-8,mysql-connector,C++,Mysql,Utf 8,Mysql Connector,所以如果我做这样的事情: std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('अतुल')" executeUpdate(strQuery); 当我通过MySQL Workbench检查表记录时,我看到用户名是所有问号(?????) 我在Connector/C++文档中找不到关于此的任何内容。你知道怎么解决这个问题吗 我想尝试的: MySQL C API中有如下函数: mysql_options(&
std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('अतुल')"
executeUpdate(strQuery);
当我通过MySQL Workbench检查表记录时,我看到用户名是所有问号(?????)
我在Connector/C++文档中找不到关于此的任何内容。你知道怎么解决这个问题吗
我想尝试的:
MySQL C API中有如下函数:
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8");
mysql_options(&mysql, MYSQL_INIT_COMMAND, "SET NAMES utf8");
我想试试,因为我怀疑它会解决我的问题。
但我在Connector/C++中找不到它的对应项
更新:
SHOW CREATE TABLE
提供了以下信息:
'ALL_USERNAMES', 'CREATE TABLE `all_usernames` (\n `USERNAME` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8'
我的客户代码在这里(这是在我写我自己的答案之前):
我找到了这样做的方法,在这个问题的答案的帮助下
wstring
中获取unicode字符串,例如:
std::wstring wname = _T("अतुल");
#include <codecvt>
#include <string>
// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
std::string
:
std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('" + name + "')";
- 不要使用不推荐使用的
接口;使用mysql.*
或mysqli.*
PDO
- 使用
mysqli\u set\u字符集('utf8')代码>,而不是指示的命令
- 出现问号是因为:
- 客户端具有有效字符(良好),并且
与客户端的编码一致(良好),但集合名称
- 目标列的
不包括所需字符。所以字符集
- 将
声明为用户名
。(如果您已经这样做了,请提供字符集ut8
)SHOW CREATE TABLE
选择十六进制(列)…
,您是否得到E0A485E0A4A4E0A581E0A4B2的अतुल代码>?(这是它的utf8编码。)是的,我得到了完全相同的结果。根据当前的实现,我没有调用任何mysql\u*
或mysqli\u*
函数。我已经更新了问题:<代码>显示创建表< /C>输出和C++源(在Windows X64的Visual Studio 2012中)。请看一看。谢谢。上面的源代码给了我警告警告C4566:通用字符名“\u0905”表示的字符不能在当前代码页(1252)
中表示,我认为这是因为std::string
不能接受unicode文本。因此,我必须使用std::wstring
和\u T()
作为unicode。然后只需将unicode转换为std::string
。为此,我使用了我在回答中提到的方法。请让我知道此方法是否正确?仅供参考,\u0905代表天神字母A=अ是的,这是德夫纳加里的‘A’:)
std::string name = wstring_to_utf8(wname);
std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('" + name + "')";