如何使用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("अतुल");
    
  • 然后使用此函数将上面的字符串转换为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);
    }
    
  • 您现在可以在MySQL查询中使用获得的
    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 + "')";