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%' 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小田田_XOW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值