2015-07-04 47 views
1

在我的C++應用程序(在使用VS2012開發的Windows x64上)我使用MySQL Connector/C++連接MySQL數據庫。我已經有一列的表ALL_USERNAMES:如何發送查詢以使用Connector/C++填充utf8 VARCHAR列?

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工作臺檢查表記錄我看到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++中找到它的對應部分。

UPDATE:

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 ('अतुल')"); 

回答

1

我發現在question的答案幫助下做到這一點。

  1. 首先得到unicode字符串在wstring例如:

    #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::wstring wname = _T("अतुल"); 
    
  2. 然後使用此功能轉換上面的字符串爲UTF-8串:

    std::string name = wstring_to_utf8(wname); 
    
  3. 您現在可以在MySQL查詢中使用所獲得的std::string

    std::string strQuery = "INSERT INTO ALL_USERNAMES (USERNAME) VALUES ('" + name + "')"; 
    
+0

如果你'選擇HEX(COL)...',你得到''爲अतुल'E0A485E0A4A4E0A581E0A4B2'? (這是utf8編碼。) –

+0

是的,我完全一樣。 – Atul

2
  • 不要使用過時mysql_*接口;使用mysqli_*PDO

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

  • 問號發生的原因:

    • 客戶端有一個有效的字符(良好),以及
    • SET NAMES同意客戶端有(好)的編碼,但
    • 目標列的CHARACTER SET不包括預期的字符。所以...
  • 聲明USERNAMECHARACTER SET ut8。 (請提供SHOW CREATE TABLE如果你已經做過這樣。)

+0

根據當前實現,我不會調用任何'mysql_ *'或'my_sqli_ *'函數。我用'SHOW CREATE TABLE'輸出和C++源代碼(在Windows x64上的Visual Studio 2012中)更新了問題。請看一看。謝謝。 – Atul

+0

上面的源代碼給了我警告'警告C4566:由通用字符名'\ u0905'表示的字符不能在當前代碼頁(1252)'中表示,我認爲是因爲'std :: string'不能接受unicode文字。所以我必須使用'std :: wstring'和'_T()'作爲unicode。然後,它需要的是將該Unicode轉換爲'std :: string'。爲此,我使用了我在答案中提到的方法。請讓我知道這種方法是否正確? – Atul

+0

僅供參考,\ u0905代表DEVANAGARI LETTER A = –