`

[转]小谈MySQL字符集

    博客分类:
  • Work
阅读更多

小谈MySQL字符集

<script language="javascript" src="/misc/cr.js"></script>

作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。

<!---->

首先,这片文章纯粹是我的个人经验之谈,适用于我常见的环境及项目中.
个人建议,数据库字符集尽量使用utf8(HTML页面对应的是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.写数据
例子1是通过php直接插入数据:
a.php
<!----> mysql_connect('localhost','user','password');
mysql_select_db('my_db');

//请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
//它的作用是设置本次数据库联接过程中,数据传输的默认字符集
//其他编程语言/接口也类似,例如 .net/c#/odbc
//jdbc则设置连接字符串为类似"jdbc:mysql://localhost/db?user=user&password=123456&useUnicode=true&characterEncoding=UTF-8"

mysql_query("set names utf8;");

//必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
mb_convert_encoding("insert into my_table values('测试');", "utf-8", "gb2312");
?>

例子是通过页面提交插入数据2:
b.php
<!----> //输出本页编码为utf-8
header("content-type:text/html; charset=utf-8");

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

mysql_query("set names utf8;");

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">




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

附1:旧数据升级办法
以原来的字符集为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
第二步:转换编码(类似unix/linux环境下)
iconv -t utf-8 -f gb2312 -c old.sql > new.sql
或者可以去掉 -f 参数,让iconv自动判断原来的字符集
iconv -t utf-8 -c old.sql > new.sql
在这里,假定原来的数据默认是gb2312编码。
第三步:导入
修改old.sql,在插入/更新语句开始之前,增加一条sql语句:

"SET NAMES utf8;"

,保存。
mysql -hlocalhost -uroot my_db < new.sql
大功告成!!

附2:支持查看utf8字符集的MySQL客户端有
1.) MySQL-Front,据说这个项目已经被MySQL AB勒令停止了,不知为何,如果国内还有不少破解版可以下载(不代表我推荐使用破解版 :-P)。
2.) Navicat,另一款非常不错的MySQL客户端,汉化版刚出来,还邀请我试用过,总的来说还是不错的,不过也需要付费。
3.) PhpMyAdmin,开源的php项目,非常好。
4.) Linux下的终端工具(Linux terminal),把终端的字符集设置为utf8,连接到MySQL之后,执行 SET NAMES UTF8; 也能读写utf8数据了。

附3:本站提供转换文件内容字符集工具(CCT),可以支持最大2Mb的文件字符集转换,欢迎使用。

<!---->

<meta content="mysql 字符集,MySQL字符集,MySQL 乱码,mysql字符集设置,MySQL utf8,MySQL utf-8,MySQL charset,mysql 默认字符集,mysql 字符集和整理,mysql 中文 字符集,mysql中文问题" name="keywords">
<meta content="mysql 字符集,MySQL字符集,MySQL 乱码,mysql字符集设置,MySQL utf8,MySQL utf-8,MySQL charset,mysql 默认字符集,mysql 字符集和整理,mysql 中文 字符集,mysql中文问题" name="description">

评论

实属好文章!转码函

实属好文章!
转码函数有笔误,对初学者可能会走弯路,希望叶兄修正:

mb_convet_encoding("insert into my_table values('测试');", "utf-8", "gb2312");

应为:

mb_convert_encoding("insert into my_table values('测试');", "utf-8", "gb2312");

也许我没说明白我备

也许我没说明白
我备份只是mysql下wordpress目录和apache目录下相关的目录!
而不是直接备份的数据库??
能说清每个步骤吗????

你好。原来mysql5.0.21

你好。
原来mysql5.0.21 wordpress 用的是原默认latin1
直接拷备的/mysql/var/wordpress/* 和 htdocs/wordpress
现在是mysql5.0.41,新数据库设置默认都 为utf8
把它俩再拷回到相应目录下。再设置worpress数据库的用户和密码
而现在的worpress数据库是原来的latin1
用浏览器上wordpress 全是乱码
请问:如何,改成utf8??

游客 (未验证)

你可以把 在 phpmyadmin

你可以把 在 phpmyadmin 里 把数据先 导出,然后,改 .sql 里的 CHARSET=latin1

改成 CHARSET=utf8

然后在 导入 到你要放的 数据库 里,就可以了

希望你成功!!

如有问题可以和我联系!!

QQ:36380150
MSN:guopeng623@hotmail.com

按照上面所说的,先

按照上面所说的,先用iconv之类的工具转换一下编码后,重新倒入。

MySQL方案、培训、支持

给你的祝福,要让你招架不住!

也许我没说明白我备

也许我没说明白
我备份只是mysql下wordpress目录和apache目录下相关的目录!
而不是直接备份的数据库??
能说清每个步骤吗????

改用mysqldump来备份呗

改用mysqldump来备份呗?

MySQL方案、培训、支持

给你的祝福,要让你招架不住!

也许我没说明白我备

也许我没说明白
我备份只是mysql下wordpress目录和apache目录下相关的目录!
而不是直接备份的数据库??
能说清每个步骤吗????

贝贝 (未验证)

mysql的乱码确实很烦人

mysql的乱码确实很烦人,utf8页面的表单,又没有文件上传好像还不一样。

具体区别在哪呢,我

具体区别在哪呢,我好像没碰到过...

MySQL方案、培训、支持

给你的祝福,要让你招架不住!

按上述设置后 CREATE

按上述设置后
CREATE DATABASE `中文`
CHARACTER SET 'utf8'
COLLATE 'utf8_general_ci';
后,在data目录下的文件夹名是乱码.
windowsxp系统,mysql5,请问大家有没有遇到这个情况?如何解决?

谢谢! :-)

mysql

mysql 5.x中,系统文件夹(数据库文件夹)的字符集都是utf8的,因此如果你的操作系统不支持utf8的话,显示起来就似乎是'乱码',但是并不影响你正常使用。
另外,强烈建议采用英文来命名,否则很容易产生兼容性问题,将来麻烦的很。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

谢谢,我看到5.1里有

谢谢,我看到5.1里有一个设置set filesystem charset 默认是 binary 但是我改了以后反而不能用了,不知道这个是不是可以更改存盘的charset?

还有就是字段名称使用汉字是否功能键全?

谢谢!

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

系统全局变量character_s

系统全局变量character_set_filesystem跟你的文件系统相关,最好是不要改动它.另外,还是那句话,除非迫不得已,一定不要采用中文命名数据库/表/字段等.

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

谢谢,今天把所有中

谢谢,今天把所有中文字段都改成英文啦,呵呵,挺无奈的,等mysql升级吧。

有些特殊的词用英语不容易表达,有些遗憾。 :-)

呵呵,可以用英文单

呵呵,可以用英文单词的第一个字母组合啊,很简单的哦

欢迎来到MySQL中文网: http://imysql.cn
欢迎加入Google MySQL中文用户群:http://groups.google.com/group/imysql

给你的祝福,要让你招架不住!

我用的是mysql5.0.24,

我用的是mysql5.0.24,设定为utf8,使用WP很正常,但用phpmyadmin和命令行操作mysql的是候显示的中文还是乱码~~为什么会这样的呢??

请加入本站的

请加入本站的详细讨论。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

我在使用varchar(

我在使用varchar(非binary)时,"coco"和"球球"编码(gb)重合了,请问可否在不改变字段和编码的情况下,区分开这两个词?

你试着改改一下数

你试着改改一下数据表的COLLATION,然后试试看。
参见ALTER TABLE语法。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

"旧数据升级办法"-

"旧数据升级办法"---不好意思,这个地方看的不是很懂能否说的具体点.谢谢....

哪里看不懂?欢迎

哪里看不懂?欢迎用邮件(首选)或者msn跟我交流。。。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

那我想咨询一下,

那我想咨询一下,如果是类似于like的单字符搜索结果会准确吗?例如:like '%徐%',请帮忙测试一下,我用的版本是5.0.19,谢谢!

如果是非英文字符

如果是非英文字符的,最好加binary修饰符,例如:
select x from xx where binary xx like '%徐%';
但仍旧可能会把不包含'徐'字的内容给检索出来,比较好的办法就是用utf-8字符集来存储,并且指定是utf-8校验字符集。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

您的这句: select x from

您的这句:
select x from xx where binary xx like '%徐%';
中,binary XX应该是字段名吧?
再问:如果表或字段都没有在定义时指定 binary ,是否可以这样用呢?
------------------------------
任凭岁月悠悠,我心依然风流.

这个就更不会出问

这个就更不会出问题了,放心。ascii字符它不会转成别的。

欢迎来到MySQL中文网: http://imysql.cn

给你的祝福,要让你招架不住!

我的是RH9

我的是RH9 数据库是MYSQL5,用的是RPM安装。默认的字符是latin1.手动插入中文,用JSP读取后出现乱码。这是怎么回事?
mysql的默认数据库放在/var/lib下,我能不能将新建的数据放到其它地方?

另外:
在windows下mysql为什么用GBK字符,JSP才能正常读取中文?用UTF8怎么会出乱码?

这几个问题一直困扰我好几天,一直没想明白。还请指点。在此不胜感激!
我的邮箱:pmy54@163.com
谢谢·

表的默认字符集是

表的默认字符集是latin1也不能保证你在用JDBC连接数据库时就定不会出现乱码。
记住JAVA是unicode编码的。所以在连接数据库的url中一定要指定编码类型。

另外向表里插入记

另外向表里插入记录时最好使用getBytes("iso-8859-1")转换一下。
从表里取出后,也可以用此方法getBytes("latin1")转一下码。

你应该是通过jdbc连接my

你应该是通过jdbc连接mysql的吧,大致的解决办法可以在这里找到!
对jsp和jdbc我不是了解,抱歉。

放心,除非

放心,除非有不能识别的生僻字,常见的字符都能支持的。

分享到:
评论

相关推荐

    Linux SecureCRT显示乱码解决方案

    2、设置字符集为GB2312后保存好后确认退出。 3、再次测试一下。 您可能感兴趣的文章:基于SecureCRT向远程Linux主机上传下载文件步骤图解浅谈ubuntu 使用securecrt vi编辑出现的问题SecureCRT中文显示乱码问题的...

    PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码

    老声长谈,着是困惑很多人的问题,如果处理不好,都是乱码,说这些话并不是我对编码很精通,只是在这方面是得留神,自己总结了一点小经验(容易出现乱码的地方有php文件里面 ,数据库里面 存储 的编码 ,页面显示 ,...

    php 各种应用乱码问题的解决方法

    1) 使用 标签设置页面编码 这个标签的作用是声明客户端的浏览器用什么字符集编码显示该页面,xxx 可以为 GB2312、GBK、UTF-8(和 MySQL 不同,MySQL 是 UTF8)等等。因此,大部分页面可以采用这种方式来告诉浏览器显示...

    ASP.NET3.5从入门到精通

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if 语句的使用方法 ...

    ASP.NET 3.5 开发大全11-15

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 ...

    ASP.NET 3.5 开发大全

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 ...

    ASP.NET 3.5 开发大全1-5

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 ...

    ASP.NET 3.5 开发大全word课件

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 ...

    ASPNET35开发大全第一章

    2.3.4 声明并初始化字符串 2.3.5 操作字符串 2.3.6 创建和使用常量 2.3.7 创建并使用枚举 2.3.8 类型转换 2.4 编写表达式 2.4.1 表达式和运算符 2.4.2 运算符的优先级 2.5 使用条件语句 2.5.1 if语句的使用方法 ...

    javaSE代码实例

    14.7 映射集 301 14.7.1 Map接口及含义 301 14.7.2 HashMap类的使用 302 14.7.3 Hashtable类的使用 303 14.7.4 LinkedHashMap类的使用 304 14.7.5 SortedMap接口与TreeMap类 305 14.7.6 映射的遍历 ...

    asp.net知识库

    也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多语言支持 (一) 应用系统的多语言支持 (二) 自动...

    经典全面的SQL语句大全

    mysql select * From 表名 Order By rand() Limit n  Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)  语法 select table1.fd1,table1,fd2,...

Global site tag (gtag.js) - Google Analytics