打印

[php] 关于MySQL编码问题,经验总结

以下所描述无理论依据,纯属经验谈。

MySQL使用4.1以上版本,管他是什么字符集,一律使用默认。不用去设置MySQL。

然后举个使用GB2312和UTF-8的例子。

好,你只要保证你的写着INSERT SQL语句的PHP文件编码为GB2312,那么恭喜你,你使用写着SELECT SQL语句的GB2312编码的PHP文件读取出来的数据也是GB2312的。
同理,只要你插入数据库的PHP文件是UTF-8编码,那么你录入的就是UTF-8的,读取出来同样使用编码为UTF-8的读取。

如果我录入为GB2312,显示要使用UTF-8怎么办,
如果你的所有PHP文件为UTF-8编码,那么你在INSERT的时候,就必须使用iconv进行编码转换,将str转为GB2312入库,读取也一样,使用iconv转为UTF-8显示。

你的前端页面使用什么编码,那么你那些字符串已经被该种编码 编过了,所以,尽管入库,他的机器码肯定就是那样的,不管存放在哪里,不管MYSQL指定为何种编码,他在录入数据的时候,并不会对你的数据进行转换。只要保证你的前端录入使用UTF-8,那么你读取的也是UTF-8。

为什么使用PHPMYADMIN导入总是有问题呢?
我没有研究过PHPMYADMIN的工作原理,但是他的PHP文件都是UTF-8编码的,也就是这样导入数据都是UTF-8的,你采用GB2312的PHP文件来读取,当然一堆乱。解决办法我猜有三种,一种在读取的时候,使用SET NAME将其编码转换,不知道可行不,另外一种是读取后使用iconv将其转为GB2312,第三种,就是不用PHPMYADMIN导入,自己写个GB2312的PHP脚本导入即可。

总之一句话,你录入的时候采用什么编码,那么你读取的时候他就是什么编码。你想把这种编码显示成另外一种编码,那么你需要使用iconv或者mbstring将其进行编码转换。

以上仅为个人实际经验,没时间研究理论。欢迎大家探讨或者有错误请指正。

[ 本帖最后由 深空 于 2007-8-23 00:34 编辑 ]
本帖最近评分记录
  • wenming 威望 +1 经验分享 2007-8-23 12:21
深空MM可以加大深度,把整个数据库的编码问题都整下嘛,还有网站的编码。
                              --我是站着说话不腰疼

我感觉有时候保证怎么进去就怎么出来,出现问题的可能性就比较小。
不管怎么转,在某一步传递进去的时候如果进行了编码转换,在同样的层面出来的时候反过来转一下就可以了。
ForgotteN
其实在建数据库的时候选择一下编码。(这个很重要。个人经验,很多新手的乱码问题就是原先的数据库编码 没有指定。)

查询的时候,也就是在数据库连接类(文件)里加是set name '编码' 这几个编码要一致。

然后基本就不会有什么乱码问题了。反正我是没有遇到过
Gonna miss freedom

TOP

我录入的时候采用utf-8编码,读取的时候也是utf-8编码,显示没有问题。

可是在phpMyAdmin里看都是乱码,你们的是这种情况吗?数据库设置的是utf8_unicode_ci的
高雅清香的春兰秋桂,不慕求虚荣,不阿谀权贵;芳香出于自然,不是为了博取别人欣赏。

TOP

请认真看我的帖子好么?

TOP

我已经实现过了,我的phpmyadmin已经被我弄成可以看正确的字符了。修改语言包,修改set names就行。这帖子不错。
珍视拥有的、遗忘失去的。

TOP

分析的有道理,按LZ将的,解决了我的问题
BI网店汇总 thread-3005075-1-1.html

TOP

再加一点,utf-8的内容,js调用,比如:<script src="http://www.kuhanzhu.com/News/HB_topnew.asp?blog=news&TopicCount=10&titleCount=16"></script>
放到gb2312的页面中,比如放到这个论坛中。一般情况下会显示乱码,加上这个就不会了charset="UTF-8"
即:<script src="http://www.kuhanzhu.com/News/HB_topnew.asp?blog=news&TopicCount=10&titleCount=16" charset="UTF-8"></script>

其中charset编码为原始,即需要调用页的编码。
http://www.shangbanla.net/baibao
春哥,曾哥,谷哥,有你,有谷哥

TOP

引用:
原帖由 kuhanzhu 于 2007-8-24 20:09 发表
再加一点,utf-8的内容,js调用,比如:
放到gb2312的页面中,比如放到这个论坛中。一般情况下会显示乱码,加上这个就不会了charset="UTF-8"
即:

其中charset编码为原始,即需要调用页的编码。
直接在页面里写上utf-8应该也没事.

TOP

@mysql_query("SET NAMES 'utf8'");
@mysql_query("SET character_set_connection=utf8, character_set_results=utf8, character_set_client=binary");

不就完事了?

靠输出后转换感觉在效率上不专业。
23555455(WEB程序员Q群)

TOP

TOP

一般情况下set names 一下总是保险的,有时是必须的。
引用:
好,你只要保证你的写着INSERT SQL语句的PHP文件编码为GB2312,那么恭喜你,你使用写着SELECT SQL语句的GB2312编码的PHP文件读取出来的数据也是GB2312的。
同理,只要你插入数据库的PHP文件是UTF-8编码,那么你录入的就是UTF-8的,读取出来同样使用编码为UTF-8的读取。
没有错,也的确不用设置MySQL,但后果是MySQL里很可能是乱码,不方便查看和日后导出数据。

我做了个小小的实验来验证

MySQL版本:5.0.27

页面编码是utf-8(无标签)

MySQL的字符集为utf8-general-ci

insert正常,select显示正常,但查看MySQL记录却是乱码,我使用phpmyadmin和nativate查看都是这个结果。

PS:不知道你所用的phpmyadmin是什么版本,至少2.9.2的编码都是默认编码。

TOP