`

[转]小谈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我不是了解,抱歉。

放心,除非

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

分享到:
评论

相关推荐

    浅谈mysql的中文乱码问题

    MySQL版本5.5.17在默认情况下可能使用不同的字符集,比如拉丁1(latin1),而Eclipse或JDBC可能使用的是UTF-8或者其他支持中文的字符集。 解决乱码问题的关键在于确保所有环节的字符集一致。以下是具体的调整步骤:...

    浅谈Mysql如何处理表情,MySql如何存储表情

    MySQL在处理表情符号时面临的主要问题是其默认的UTF-8编码(实际上是UTF-8变种,也称为utf8,只支持三字节的Unicode字符)无法完全覆盖Unicode字符集,尤其是那些包含表情符号的四字节UTF-8字符。当你尝试在MySQL中...

    浅谈PHP值mysql操作类

    此外,构造函数还设置了数据库字符集为UTF-8,确保数据存取时中文字符不会出现乱码。 接着,文档描述了`tbField`方法,该方法用于获取指定表的所有字段名称。通过执行MySQL的DESCRIBE语句并遍历结果集,将每个字段...

    浅谈PHP值mysql操作类_.docx

    此外,该构造函数还设置了字符集为`utf8`,并初始化了一些操作选项,如字段选择、条件、排序和分组。 `tbField()`方法用于获取指定表的所有字段名。它执行`DESC` SQL语句来获取表的描述,然后遍历结果,将每个字段...

    浅谈mysql_query()函数的返回值问题

    首先,`mysql_query()` 的主要功能是接收一个SQL查询字符串作为参数,然后尝试在连接的MySQL数据库上执行该查询。如果查询成功,函数将返回一个结果集资源,用于后续的数据处理,如获取查询结果行。这个资源可以被`...

    浅谈mysql 自定义函数

    MySQL自定义函数是数据库系统中一个非常实用的功能,允许用户根据特定需求编写自己的函数,以扩展MySQL的标准功能集。在上述描述中,我们看到如何创建一个简单的MySQL自定义函数,名为`onlineFunction`,用于根据...

    浅谈mysql导出表数据到excel关于datetime的格式问题

    此外,值得注意的是,由于MySQL的表可能采用UTF-8编码,而Excel可能默认使用GBK编码,为了避免导出的Excel文件打开时出现乱码,需要在`INTO OUTFILE`语句中指定字符集为GBK。这确保了数据导出后能正确显示。 补充一...

    浅谈乱码问题的解决方案

    更改字符集的地方有两个:一是MySQL配置文件(通常为`my.cnf`或`my.ini`),二是创建数据库时指定的字符集。在配置文件中找到`default-character-set=latin1`这一行,将其改为`default-character-set=gb2312`。改完...

    浅谈mysql explain中key_len的计算方法

    2. 字符编码:不同的字符集可能会有不同的字节占用,如UTF8每个字符3字节,UTF8MB4每个字符4字节。 3. 是否允许`NULL`:`NULL`字段会占用额外的1字节来标记是否为空。 4. 内部存储开销:可能存在额外的字节用于内存...

    浅谈Python访问MySQL的正确姿势

    - 连接参数:如主机名(host)、用户名(user)、密码(password)、数据库名(db)和字符集(charset)。 - 执行SQL语句:`cursor.execute(sql, params)`,其中params是一个元组,用于参数化查询。 - 获取结果:`...

    浅谈php中mysql与mysqli的区别分析

    值得一提的是,MySQLi扩展支持更广泛的字符集编码转换,这在处理国际化数据时非常有用。另外,MySQLi也支持更复杂的查询,例如连接查询(JOIN)和子查询。 在具体应用中,MySQLi对事务的处理也是其一大亮点。MySQLi...

    浅谈c中如何访问数据库

    - 查询数据库使用`mysql_query`,处理结果集使用`mysql_store_result`或`mysql_use_result`。 - 完成操作后,记得使用`mysql_close`关闭连接。 3. 数据库操作步骤: - 查询:使用SQL的`SELECT`语句,如`SELECT *...

    浅谈Python peewee 使用经验

    - 如果需要支持 emoji,则需要设置 `charset=utf8mb4` 并确保创建数据库时的字符集设置正确。 - 支持的 schemes 包括 SQLite、MySQL、PostgreSQL 及其扩展和连接池版本。 ##### 4.2 其他高级特性 - **事务管理**...

    浅谈使用ADO.NET和ASP.NET访问SQL Server数据库.pdf

    由于提供的【部分内容】中大部分内容均为乱码,无法从中提取出有意义的IT知识点,但是根据标题“浅谈使用***和***访问SQL Server数据库.pdf”和【描述】中的重复标题,我们可以推断出本文档的主要内容。以下将围绕**...

    Linux SecureCRT显示乱码解决方案

    2. **设置字符集**:接着,转到“终端” -&gt; “仿真” -&gt; “VT特性”标签页,在“字符集”部分,选择“GB2312”。这是因为GB2312是中国大陆常用的一种汉字编码标准,可以较好地处理中文字符。不过,如果你的服务器...

    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 语句的使用方法 ...

    PostgreSQL+经验谈(德哥)-PostgreSQL2012-p72

    10. **外部数据源表**:支持通过多种方式连接外部数据源,如其他PostgreSQL数据库、文件系统、MySQL、Oracle、Sybase、ODBC接口、Redis、CouchDB等,并能对这些外部数据源执行JOIN操作以及收集统计信息,虽然目前...

Global site tag (gtag.js) - Google Analytics