mysqlpp存储汉字到mysql的问题

上海老李 2009-09-15 12:09:44
mysql的库和表都默认为utf8的编码。vc 工程用的是多字节编码,如果不进行转换的话,直接存,如:姓名,存进去是乱码,但通过vc读出来则是姓名。
使用
void ConvertUtf8ToGBK(CString& strUtf8)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
wchar_t * wszGBK = new wchar_t[len+1];
memset(wszGBK, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);

len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[len + 1];
memset(szGBK, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);

strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}


void ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
wchar_t * wszUtf8 = new wchar_t[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);

len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
存时转成utf8,取出来转成gbk,在自己的应用程序中,则是正确的,但是在数据库中是乱码,应怎么去保存汉字到mysql的utf8编码的表中呢?
...全文
424 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzcenter 2009-09-18
  • 打赏
  • 举报
回复
恭喜lz找到解决的方法。
上海老李 2009-09-17
  • 打赏
  • 举报
回复
最终是用unicode后,使用unicode与utf8间的码字转换实现的,但是在vc中还是要写入set names 'utf8';后再进行别的操作才可以正确使用
上海老李 2009-09-17
  • 打赏
  • 举报
回复
哥们,我在my.ini或通过sqlyog工具查看时都设的是utf8的编码,不是latin1或gbk
hzcenter 2009-09-16
  • 打赏
  • 举报
回复
存储之前,不需要程序进行转换,直接
先set names 'utf8'
insert into table (...) values ('字符集')保存好就可以了
取数据时候,也是先set names 'utf8'再select
这样就能看到了
上海老李 2009-09-16
  • 打赏
  • 举报
回复
试了没用,呵呵,gbk和utf8不是一个字符集呀,有哪位有通过mysql++保存汉字到mysql数据库的UTF8的字段中,再读出来的例子吗?
hzcenter 2009-09-16
  • 打赏
  • 举报
回复
用mysql工具看也是一样,先设置好字符集就没有问题了。
连接好数据库后,再set names 'gbk'类似这样就好了
MoXiaoRab 2009-09-16
  • 打赏
  • 举报
回复
修改 mysql 安装目录下的 my.ini
修改 default-character-set=latin1
把latin1 改为 gb2312 或 gbk 注意: 修改两处
CLIENT SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by MySQL client applications.
# Note that only client applications shipped by MySQL are guaranteed
# to read this section. If you want your own MySQL client program to
# honor these values, you need to specify it as an option during the
# MySQL client library initialization.
#
[client]

port=3306

[mysql]

default-character-set=latin1 //把 latin1 改为 gb2312或 gbk

# SERVER SECTION
# ----------------------------------------------------------------------
#
# The following options will be read by the MySQL Server. Make sure that
# you have installed the server correctly (see above) so it reads this
# file.
#
[mysqld]

# The TCP/IP Port the MySQL Server will listen on
port=3306


#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.0/"

#Path to the database root
datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=latin1

//将latin1 改为 gb2312 或 gbk
xwsn007 2009-09-16
  • 打赏
  • 举报
回复
学习,帮顶!
上海老李 2009-09-16
  • 打赏
  • 举报
回复
好象这样也不行,不管是在初始化数据模块还是每次的更新或查询前调用set names 'utf8';会造成insert 不成功。自然也不知是不是对的,如果通过mysql工具insert 的记录,set names 'utf8';后,select 出来的也是乱码
上海老李 2009-09-15
  • 打赏
  • 举报
回复
即使改了,也还是乱码
上海老李 2009-09-15
  • 打赏
  • 举报
回复
要改吗?我默认字符编码使用utf8,改成gb2312不是意味着不是utf8编码了吧?
dirdirdir3 2009-09-15
  • 打赏
  • 举报
回复
有没有把my.ini改成
default-character-set=gb2312......
上海老李 2009-09-15
  • 打赏
  • 举报
回复
呵呵,是的,希望是这样,但是由于还要进行WEB的显示,最好是用mysql工具能看到,我现在是mysql工具看时就乱码
hzcenter 2009-09-15
  • 打赏
  • 举报
回复
在数据库中其实也不是乱码,只是你没有按照他的编码方式显示而已

通常表的编码、存进去和取出来的编码一致的话,就不会有问题了。
上海老李 2009-09-15
  • 打赏
  • 举报
回复
有人有相关的经验吗?

4,011

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧