如何发送查询以使用 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.

中的答案的帮助下找到了执行此操作的方法
  1. 首先获取wstring中的unicode字符串 例如:

    std::wstring wname = _T("अतुल");
    
  2. 然后使用这个函数将上面的字符串转换为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);
    
  3. 您现在可以在MySQL查询中使用获得的std::string

    std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('" + name + "')";
    
  • 不要使用已弃用的 mysql_* 界面;使用 mysqli_*PDO.

  • 使用 mysqli_set_charset('utf8');,而不是指示的命令。

  • 出现问号是因为:

    • 客户有一个有效的字符(好),并且
    • SET NAMES同意客户端的编码(好),但是
    • 目标列的 CHARACTER SET 不包含预期的字符。所以...
  • 声明 USERNAMECHARACTER SET ut8。 (如果您已经这样做,请提供 SHOW CREATE TABLE。)