在我的C ++应用程序中(在使用VS2012开发的Windows x64上)我使用MySQL Connector / C ++来连接MySQL数据库。我列出了包含列的ALL_USERNAMES:
USERNAME VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci
但是,我不知道如何通过我的C ++应用程序启动utf8查询。方法sql::Statement::executeUpdate
接受sql::SQLString
类型。它基本上是std::string
。
所以,如果我做这样的事情:
std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('अतुल')"
executeUpdate(strQuery);
当我通过MySQL Workbench检查表记录时,我将USERNAME视为所有问号(???????)。
我在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'
我的客户端代码在这里(这是在我写自己的答案之前):
sql::Connection *m_pConnection = NULL;
sql::Statement *m_pStatement = NULL;
sql::Driver *driver = NULL;
driver = get_driver_instance();
m_pConnection = driver->connect("tcp://127.0.0.1:3306", "username", "password");
m_pConnection->setSchema("DBNAME");
m_pStatement = m_pConnection->createStatement();
int RetVal = m_pStatement->executeUpdate("INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('अतुल')");
答案 0 :(得分:2)
不要使用已弃用的mysql_*
接口;使用mysqli_*
或PDO
。
使用mysqli_set_charset('utf8');
,而不是指示的命令。
出现问号是因为:
SET NAMES
同意客户端的编码(好),但CHARACTER SET
不包含预期的字符。所以... 声明USERNAME
为CHARACTER SET ut8
。 (如果您已经这样做,请提供SHOW CREATE TABLE
。)
答案 1 :(得分:1)
我在question的答案的帮助下找到了这样做的方法。
首先获取wstring
中的unicode字符串,例如:
std::wstring wname = _T("अतुल");
然后使用此函数将上面的字符串转换为utf-8字符串:
#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 name = wstring_to_utf8(wname);
您现在可以在MySQL查询中使用获得的std::string
:
std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('" + name + "')";