随笔- 19  文章- 5  评论- 16 

最新评论

re: Dead End!! 米 2008-10-14 22:51  
来看看
wo ye shi
请问VC++连MySQL,有没有好点的参考书? youyouhenaini 2008-07-10 21:55  
请问VC++连MySQL,有没有好点的参考书?
请问VC++连MySQL,有没有好点的参考书? youyouhenaini 2008-07-10 21:54  
以前从未接触过M ySQL,现在想从基础学习它,之后开发一个小软件。
拜托赐教啦!
re: C#版中文数字转阿拉伯数字 wuyazhe 2008-05-02 09:32  
不要让自己感到时间充裕,否则只有到死的时候才会发现生命的短暂.

这句话很好。赞一个。
xxxx
ddddd
re: VC++连MySQL小记 *Alacky 2007-12-13 22:54  
@lmss
回复[lmss]关于乱码:
首先要设置正确的编码类型
MySql安装的时候会有设置数据库那项,默认是latin1,这里可以改成utf8,用来支持中文,不过latin1也可以存储中文,只不过用MySqlGUI工具检索数据时还是乱码,但程序里能正确显示.还可以在创建表的时候指定编码类型为utf8.创建字段时也可以指定编码类型.
在程序中要对输入输出的字符串做正确的编码转换.
查询数据时要设置返回数据的编码类型,即执行SET NAMES 'utf8'

下面是一段测试代码,虽然能够正确的插入和显示中文(程序中和MySql GUI Tools都能够正确显示),但可能还不是正确的方法.曾经看过一些文章说这中间存在多于的转换(和编码设置为latin1,但在程序里还能读取中文的情况差不多),不过我没有深究这个问题,现在主要用.net做东西,链接MySql用的mysql-connector-net-5.0.8.1,它是支持中文的.

CString ConvertMultiByteToUTF8(CString& multiStr)
{
char* buf;
wchar_t* wbuf;
int len;
len = MultiByteToWideChar(CP_ACP, 0, multiStr, -1, 0, 0);
wbuf = new wchar_t[len];
MultiByteToWideChar(CP_ACP, 0, multiStr, -1, wbuf, len);
len = WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, 0, 0, 0, 0);
buf = new char[len];
WideCharToMultiByte(CP_UTF8, 0, wbuf, -1, buf, len, 0, 0);
CString ret(buf);
delete wbuf;
delete buf;
return ret;
}

string ConvertUTF8ToMultiByte(string utf8Str)
{
//char* buf;
//wchar_t* wbuf;
//int len;
//len = MultiByteToWideChar(CP_UTF8, 0, utf8Str, -1, 0, 0);
//wbuf = new wchar_t[len];
//MultiByteToWideChar(CP_UTF8, 0, utf8Str, -1, wbuf, len);
//len = WideCharToMultiByte(CP_ACP, 0, wbuf, -1, 0, 0, 0, 0);
//buf = new char[len];
//WideCharToMultiByte(CP_ACP, 0, wbuf, -1, buf, len, 0, 0);
//CString ret(buf);
//delete wbuf;
//delete buf;
//return ret;

//测试用智能指针
if(utf8Str.empty())
return utf8Str;

int length = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, 0, 0);
auto_ptr<wchar_t> widechar(new wchar_t[length]);
MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, widechar.get(), length);

length = WideCharToMultiByte(CP_ACP, 0, widechar.get(), -1, 0, 0, 0, 0);
auto_ptr<char> multichar(new char[length]);
WideCharToMultiByte(CP_ACP, 0, widechar.get(), -1, multichar.get(), length, 0, 0);

return multichar.get();
}

void CMySQLTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//OnOK();
MYSQL* mysql;
mysql = mysql_init(NULL);

unsigned long long ptr;
stringstream ss;

CString version, hostInfo, serverVersion, colStr, characterSet, queryStr, introStr;
if(!(ptr = (unsigned long long)mysql_real_connect(mysql, "127.0.0.1", "root", "alacky", "hala", 3306, 0, 0)))
{
AfxMessageBox(mysql_error(mysql), 0, 0);
mysql_close(mysql);
return;
}

ss << ptr << " " << (unsigned long long)mysql;
string str = ss.str();
MessageBox(str.c_str());



// 获取链接信息
version = mysql_get_client_info();
hostInfo = mysql_get_host_info(mysql);
serverVersion = mysql_get_server_info(mysql);
characterSet = mysql_character_set_name(mysql);

// 操作数据
queryStr = "UPDATE lala1 SET intro = X'"; // 这里加X表示后面的字符串是十六进制编码的
this->edit_msg.GetWindowText(introStr);

introStr = ConvertMultiByteToUTF8(introStr);

char* buf = new char[introStr.GetLength()*2+1];
mysql_hex_string(buf, introStr, introStr.GetLength()); // 对字符进行16进制编码

queryStr += CString(buf);
delete[] buf;

queryStr += "'";
if(mysql_query(mysql, queryStr))
{
AfxMessageBox(mysql_error(mysql), 0, 0);
mysql_close(mysql);
return;
}
mysql_query(mysql, "SET NAMES 'utf8'");
if(mysql_query(mysql, "SELECT intro FROM lala1 ORDER BY id DESC LIMIT 1"))
{
AfxMessageBox(mysql_error(mysql), 0, 0);
mysql_close(mysql);
return;
}
MYSQL_RES* result = mysql_store_result(mysql);
ULONG columnLen = mysql_num_fields(result);
MYSQL_FIELD* columns = mysql_fetch_fields(result);
colStr = "";
MYSQL_ROW row = mysql_fetch_row(result);
colStr = row[0];
colStr = ConvertUTF8ToMultiByte(string((LPCSTR)colStr)).c_str();

// 清理
mysql_free_result(result);

MessageBox("MySQL Version:" + version + " Host:" + hostInfo + " v" + serverVersion + " " + characterSet);
MessageBox(colStr);

mysql_close(mysql);
}

re: VC++连MySQL小记 lmss 2007-12-10 23:50  
在VC下怎么解决乱码问题呢?
220.191.233.132

他妈的,这孙子也攻击我了.

要不咱给Y暴光得了 .浙江的地址.
re: 请教一个正则表达式 deerchao 2007-10-19 03:25  
如果像你说的那样只是去掉标签,而不要求“配对”的标签里的内容话,JS里也能实现。
re: 请教一个正则表达式 *Alacky 2007-10-18 22:25  
平衡组那里是.Net里的正则,JS里用不了。在网上搜到有人说JS只能用函数递归调用来完成这种工作,是这样么?
re: 请教一个正则表达式 *Alacky 2007-10-18 00:17  
@deerchao
谢谢!!
re: 请教一个正则表达式 deerchao 2007-10-18 00:14  
你可以看我的正则表达式30分钟入门教程,平衡组这一节有关于这个的讨论。
就这点攻击量,如果不是开卡巴,机器根本不会有问题