读书人

绝望!mysql 插入泰文有关问题!

发布时间: 2012-03-14 12:01:12 作者: rapoo

绝望!!!mysql 插入泰文问题!!!
在vc和vc2005环境下如何插入泰文??在vc2005下可以直接在sqlserver中nvarchar插入泰文,但在mysql中不行,我已经把字符集设置为utf8,但还是不行,插入中,英,日,韩文都可以,
CFile file;
WCHAR *strFileName=_T("Unicode.txt");
BOOL bFlag = file.Open(strFileName,CFile::modeReadWrite);
LONG lOffset = 2, lActual;
file.Seek( lOffset, CFile::begin );
lActual = file.GetLength();
WCHAR Buffer[1024]={0};
try
{
//file.Read( (void *)&Buffer,lActual);
file.Read(Buffer,lActual);
}
catch (CFileException* e)
{
int cause = e->m_cause;
e->Delete();
}
CDatabaseEx db;
CString str(Buffer);
MessageBox(str,_T("显示"),MB_OK); 此处可以显示为泰文
try
{

if(db.OpenEx(_T("DSN=s8200;UID=root;PWD=root;")))
{
CString strSQL;
strSQL.Format(_T("INSERT INTO a_factory VALUES(10,'EV8000',1,'泰国宾馆:???????????','%s','张sir')"), str);

db.ExecuteSQL(strSQL);
……
在此感谢wqvbjhc 和supper_jerry这几天帮了很多的忙,希望更多的高手指点!thanks



[解决办法]
我不懂vc编程, 只知道直接用c/c++连接操作数据库.这个是mysql的c api中escape的说明, 楼主自己找找相关函数吧.
如果不使用escape, 会导致sql被截断, 程序出错. 比如一段字符内容是a[128] = "泰国宾馆:aaaa\'\"bbb", 注意中间有'和"这样的特殊字符, 如果直接用
("INSERT INTO a_factory VALUES(10,'EV8000',1, '%s', '%s','张sir')", a, str); //a,str中有特别字符都一样
就会出错(是sql出错)

20.4.13 mysql_escape_string()
unsigned int mysql_escape_string(char *to, const char *from, unsigned int length)

20.4.13.1 说明
把在from中的字符串编码为在一条SQL语句中可以发给服务器的转义的SQL字符串,将结果放在to中, 并且加上一个终止的空字节。编码的字符是NUL(ASCII 0)、‘\n’、‘\r’、‘\’、‘'’、‘"’和Control-Z(见7.1 文字:如何写字符串和数字)。

由from指向的字符串必须是length个字节长。你必须分配to的缓冲区至少length*2+1个字节长。(在更坏的情况,每个字符可能需要使用2个字节被编码,并且你需要为终止空字节的空间) 当mysql_escape_string()返回时,to的内容将是空字符终止的字符串。返回值是编码后的字符串的长度,不包括终止空字符。

20.4.13.2 范例
char query[1000],*end;

end = strmov(query,"INSERT INTO test_table values(");
*end++ = '\'';
end += mysql_escape_string(end,"What's this",11);
*end++ = '\'';
*end++ = ',';
*end++ = '\'';
end += mysql_escape_string(end,"binary data: \0\r\n",16);
*end++ = '\'';
*end++ = ')';

if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
fprintf(stderr, "Failed to insert row, Error: %s\n",
mysql_error(&mysql));
}

例子中所用的strmov()函数被包括在mysqlclient库中且功能类似于strcpy(),但是返回一个指向空终止的第一个参数的指针。

20.4.13.3 返回值
放进to的值的长度,不包括终止空字符。

20.4.13.4 错误
无。

读书人网 >C++

热点推荐