如何发送查询以使用 Connector/C++ 填充 utf8 VARCHAR 列?
How to send query to populate utf8 VARCHAR column using Connector/C++?
在我的 C++ 应用程序中(在使用 VS2012 开发的 Windows x64 上)我正在使用 MySQL Connector/C++ 连接 MySQL 数据库。我 table 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 检查 table 记录时,我看到 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 ('अतुल')");
我在 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 + "')";
不要使用已弃用的 mysql_*
界面;使用 mysqli_*
或 PDO
.
使用 mysqli_set_charset('utf8');
,而不是指示的命令。
出现问号是因为:
- 客户有一个有效的字符(好),并且
SET NAMES
同意客户端的编码(好),但是
- 目标列的
CHARACTER SET
不包含预期的字符。所以...
声明 USERNAME
为 CHARACTER SET ut8
。 (如果您已经这样做,请提供 SHOW CREATE TABLE
。)
在我的 C++ 应用程序中(在使用 VS2012 开发的 Windows x64 上)我正在使用 MySQL Connector/C++ 连接 MySQL 数据库。我 table 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 检查 table 记录时,我看到 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 ('अतुल')");
我在 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 + "')";
不要使用已弃用的
mysql_*
界面;使用mysqli_*
或PDO
.使用
mysqli_set_charset('utf8');
,而不是指示的命令。出现问号是因为:
- 客户有一个有效的字符(好),并且
SET NAMES
同意客户端的编码(好),但是- 目标列的
CHARACTER SET
不包含预期的字符。所以...
声明
USERNAME
为CHARACTER SET ut8
。 (如果您已经这样做,请提供SHOW CREATE TABLE
。)