mysql 插入utf-8字符

最近需要將文件字符編碼爲utf-8中的文本數據插入到數據庫中,由於使用mfc的CString 類型。在讀取到內存中的時候看到的是亂碼,一般情況下可以將utf-8轉成ascii編碼然後在進行插入。但是utf-8字符編碼下的有些字符在ascii碼中找不到對應的字符,從而會顯示??,因此會產生數據丟失。所以此方法不太可行,除非是沒有特殊字符:如數學中公式符號、集合符號等。

由於之前在別的工程中使用unicode編碼也可以正常將字段插入到數據庫中。又unicode和utf-8之間進行轉換並不會發生信息丟失,於是嘗試使用unicode來進行嘗試,開始還擔心需要將數據庫操作類全部改成unicode,後來發現並不需要,只需要在數據庫操作類中重載一個函數即可,即接受CStringW作爲傳入參數,然後執行插入操作。(我使用的是ADO的一套東西,需要在StdAfx.h中加入:

#import"c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF","EndOfFile"))

BOOL CDBOperator::ExecuteQuery(CStringW strSql)
{
	_RecordsetPtr repRs;
	_variant_t RecordsAffected;
	try
	{	
		repRs.CreateInstance(__uuidof(Recordset));
		repRs->Open(strSql.GetBuffer(strSql.GetLength()+10), m_pConn.GetInterfacePtr(), adOpenKeyset, adLockOptimistic, adCmdUnknown);
		strSql.ReleaseBuffer();
		return TRUE;
	}
	catch(_com_error &e)
	{
		//CString strErrorSql;
		//WStringToChar(strSql, strErrorSql);
		//ShowError(e, strErrorSql);
		return FALSE;
	}
	return FALSE;
}
這個函數與BOOL CDBOperator::ExecuteQuery(CString strSql)就是一個參數差別。居然也能運行,看來_RecordsetPtr 這個東西確實挺智能的。當然這樣做的後果是,你需要在寫插入語句的地方進行utf-8轉unicode,這個函數:

std::wstring UTF8ToWString(const char* lpcszString)
{
	int len = strlen(lpcszString);
	int unicodeLen = ::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, NULL, 0);
	wchar_t* pUnicode;
	pUnicode = new wchar_t[unicodeLen + 1];
	memset((void*)pUnicode, 0, (unicodeLen + 1) * sizeof(wchar_t));
	::MultiByteToWideChar(CP_UTF8, 0, lpcszString, -1, (LPWSTR)pUnicode, unicodeLen);
	wstring wstrReturn(pUnicode);
	delete [] pUnicode;
	return wstrReturn;
}

當然這個不是純天然的utf-8字符操作,具體直接插入utf-8參見大神博客:

http://blog.csdn.net/iaccepted/article/details/32939679


注:插入前請確認自己的數據庫默認語言是什麼: 使用show variables like '%char%' 



發佈了26 篇原創文章 · 獲贊 13 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章