LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1904|回复: 2

请教mysql字符集的问题,已经折腾很久了

[复制链接]
发表于 2008-7-29 17:08:05 | 显示全部楼层 |阅读模式
创建数据库的时候指定的字符集为UTF8,刚开始运行一切正常,但是在一个不确定的时间之后发现,插入的中文字段变成了乱码,logstring为一条插入语句,我在调用rtv = mysql_real_query(log_mysql, logstring, n);之前将logstring记录下来发现logstring中的中文字符没有问题,但是插入之后在mysql命令行中查看的记录显示中文字段为乱码,在此之前的插入操作又没有问题。不重启数据库,重启应用程序又好了,但是过一段时间又会出现这个问题,请假各位这个问题怎么定位啊,谢过各位了
发表于 2008-8-8 15:50:50 | 显示全部楼层
mysql字符集问题,可以看一下这个博客文章:
http://rdc.taobao.com/blog/dba/h ... lation_concept.html

搜一下,里面还有好几篇讲字符集的问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-8-9 14:02:45 | 显示全部楼层
现在发现的问题估计在于数据库的字符集在变化,在mysql_real_connect之后调用了mysql_set_character_set(db,"utf8");我在某一个访问数据库的地方通过mysql_character_set_name获取字符集,运行过程中刚开始的时候一直返回正确的utf8,但是出问题的时候发现字符集变成了latin1了,代码如下:
const char *charset = mysql_character_set_name(db);
                sprintf(tmpstr,"query_string: %s charset=%s\n",query,charset);
                MYLOG_print(tmpstr); //1
                rtv = mysql_real_query(db, query, n);

                res_set = mysql_store_result(db);

charset = mysql_character_set_name(db);
                sprintf(tmpstr,"after mysql_real_query  charset=%s\n",charset);
                MYLOG_print(tmpstr); //2

在1处打印结果为:
query_string: SELECT COUNT(*)  FROM mgt.authentication charset=utf8
在2处打印结果为:
after mysql_real_query  charset=latin1

为什么在同一个函数内部前后字符集发生了变化? 如果是代码问题,大概哪些调用会悄悄改变字符集呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表