如何使用Connector / C ++发送查询以填充utf8 VARCHAR列?

时间:2015-07-04 06:06:04

标签: c++ mysql utf-8 mysql-connector

在我的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);

当我通过My​​SQL 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 ('अतुल')");

2 个答案:

答案 0 :(得分:2)

  • 不要使用已弃用的mysql_*接口;使用mysqli_*PDO

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

  • 出现问号是因为:

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

答案 1 :(得分:1)

我在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 + "')";