Andy's Blog » mysql 编码, mysql编码, mysql 编码转换, mysql ת, mysql mb_convert_encoding, mysql 批量转换字体集, mysql mysqldump 字符集转换, mysql 字符编码函数, mysql select编码转换 CONVERT, mysql convert 转换字符编码为gb2312, mysql select 编码转换, mysql 编码转换函数, mysql convert encoding, mysql 字符编码转换, mysql 字符集编码, mysql数据库字符集编码转换, mysql转换编码函数, mb_convert_encoding mysql, mysql select 编码, mysql换字体, mysql编码转换, storm23m, becauselt2, locationync, effort85x, mixzlf, J1IK, percentv78, stagei4l, theoryx7y, platek7w, young2ja, perfectcrl, 4AAG, 69GI, forgetgma, husbandqmk, merelyjx3, poleapo, horsenl3, dollf2s, voyagexpf, noddedmbc, poor37z, edgeqx8 » MySQL字符集及MySQL编码转换

MySQL字符集及MySQL编码转换

今天找到这篇文章,里面提到从latin1到UTF8的MySQL编码转换。收藏一下,最近要将所有的数据库都转一次,一直错误的使用latin1,再不转以后麻烦大了。

出处:未知

个人建议,数据库字符集尽量使用utf8(utf-8),以使你的数据能很顺利的实现迁移,因为utf8字符集是目前最适合于实现多种不同字符集之间的转换的字符集,尽管你在命令行工具上无法正确查看数据库中的内容,我依然强烈建议使用utf8作为默认字符集.
接下来是完整的一个例子:
1.创建数据库表

mysql>CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;

#注意后面这句话 "COLLATE utf8_general_ci",大致意思是在排序时根据utf8编码格式来排序
#那么在这个数据库下创建的所有数据表的默认字符集都会是utf8了

mysql>create table my_table (name varchar(20) not null default '')type=myisam default charset utf8;

#这句话就是创建一个表了,制定默认字符集为utf8

2.写数据
通过php直接插入数据:

<?php
mysql_connect('localhost','user','password');
mysql_select_db('my_db');
 
//请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
//它的作用是设置本次数据库联接过程中,数据传输的默认字符集
mysql_query("set names utf8;");
 
//必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
mysql_query(mb_convet_encoding("insert into my_table values('测试');", "utf-8", "gb2312"));
?>

通过页面提交插入数据:

<?php
//输出本页编码为utf-8
header("content-type:text/html; charset=utf-8");

mysql_connect('localhost','user','password');
mysql_select_db('my_db');

if(isset($_REQUEST['name'))
{
    //由于上面已经指定本页字符集为utf-8了,因此无需转换编码
    mysql_query(sprintf("insert into my_table values('%s');", $_REQUEST['name']));
}

$q = mysql_query("select * from my_table");
while($r = mysql_fetch_row($q))
{
    print_r($r);
}
?>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<form action="" method="post">
<input type="text" name="name" value="">
<input type="submit" value='submit'>
</form>

自此,使用utf8字符集的完整的例子结束了.
如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束,例如:

create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;

附:旧数据升级办法
以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:导出旧数据

mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql

第二步:转换编码

iconv -t utf-8 -f gb2312 -c old.sql > new.sql

在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改old.sql,增加一条sql语句: "SET NAMES utf8;",保存。

mysql -hlocalhost -uroot my_db < new.sql

大功告成!

Incoming search terms:

Tags: mysql, mysql编码

本文地址: http://blog.21andy.com/20060514/297.html

3 评论 to “PHP开源CMS之MODx”

  1. yoyo 于 2007-09-22 08:25:44 发表:

    我以前用utf-8做页面的时候根本就不用mysql_query("set names utf8;");这句,但是所有的文件都设置为utf-8编码,也从没出过问题,而今天我在数据转换的时候出现了这个问题,不得不用mysql_query("set names utf8;");,请问为什么?希望你能给我回邮件,谢谢!

  2. 小·王 于 2008-12-08 18:13:30 发表:

    版主你写的东西可不行呀,运行一下都是错的,这不知道是你自己写的还是那在copy的,mb_convert_encoding你能写成mb_convet_encodeing,你是人才呀!

  3. wangwangwar 于 2011-05-15 21:22:25 发表:

    在测试中发现第二点中这个语句拼写有误:
    mysql_query(mb_convet_encoding("insert into my_table values('测试');", "utf-8", "gb2312"));
    mb_convet_encoding --> mb_convert_encoding.

    另外发现转换了在数据库中是乱码,直接写
    mysql_query("insert into my_table values('测试');");
    正常的。可能是因为我的文件编码本来就是utf8吧。