老韩
18五/082

Unix+Apache+PHP+Mysql环境下GB2312转UTF8的总结

  注:很久很久以前的文章,存档在这里。

  有时候,在明明程序没有任何错误的情况下,经常会碰到插数据库不成功的问题,此时就要考虑是不是编码的问题了,比如我就曾经遇到这样的问题,最终一路查下是没有将GB2312编码的内容转成UTF-8所致,当时是因为 mysql的一些字段依然用的是的是latin1字符集(latin1是mysql默认的排序方式),用phpmyadmin转utf8编码的话还是很方便,只要选“操作”项,在“整理”类里选择utf8_general_ci,就可以转成功(PS下:UTF-8默认是utf8_spanish_ci,没 有utf8_gbk_ci,这里选择utf8_general_ci是为了适应汉字编码的需要!)!这样可以把表转成UTF-8字符集存储格式!
  这还没有完全成功,我就是在这上面花费了很多时间来研究,因为光把表转成utf8还不成,还要把char及text格式的字段转成utf8字符集存储!这里我是手工写代码批量转的,因为这样比较快,21世纪最重要的是什么?人才以及效率嘛,呵呵。
  以下是sql语句:
  把整个表转成utf8存储:

  1. ALTER TABLE `table_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  把一个字段转成utf8存储:

  1. ALTER TABLE `Field_name` CHANGE `invite` `invite` TEXT CHARACTER SET utf8 COLLATEutf8_general_ci DEFAULT NULL;

这就完了吗?别急,还没完呢,除了数据库的字符集,还有程序呀。在进行数据存储之前,有必要进行转码,当然,我想如果您既然都已经打算把你的数据都转成 utf8,那么也不会吝惜这样一点时间把程序也转成utf8吧?呵呵,从utf8页面post过来的数据不用转,直接用就可以了,如果你的form提交页 面还是gb2312或者gbk,则有必要convert一下,PHP里的iconv函数非常好用,我的页面都是用PHP写的脚本转的!OK,转完了,还 有,在在插数据库和取数据库之前必须执行如下sql语句:

SET NAMES ‘utf8′

这一句话的意思相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

这样就保证了存取mysql数据库时编码的一至性,不会导致有一些中文字符转不出来,或者丢字节!
mysql存取前需要加的PHP代码(mysql_select_db前加也行?没试!):
mysql_query(”SET NAMES ‘utf8′”);