<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>后院&#124;kevin’s backyard &#187; 字符集</title>
	<atom:link href="http://kevin.9511.net/archives/tag/%e5%ad%97%e7%ac%a6%e9%9b%86/feed" rel="self" type="application/rss+xml" />
	<link>http://kevin.9511.net</link>
	<description>立志做一个混事业型男人</description>
	<lastBuildDate>Fri, 30 Apr 2010 16:55:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[转载]Mysql 数据库字符集</title>
		<link>http://kevin.9511.net/archives/173.html</link>
		<comments>http://kevin.9511.net/archives/173.html#comments</comments>
		<pubDate>Sun, 15 Mar 2009 18:52:20 +0000</pubDate>
		<dc:creator>kevin</dc:creator>
				<category><![CDATA[技术备案]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[字符集]]></category>

		<guid isPermaLink="false">http://kevin.9511.net/archives/173.html</guid>
		<description><![CDATA[MySQL 4.1开始，对多语言的支持有了很大变化 (这导致了问题的出现)。尽管大部分的地方 (包括个人使用和主机提供商)，MySQL 3、4.0 仍然占主导地位；但 MySQL 4.1 乃至5.0是 MySQL 官方推荐的数据库，已经有主机提供商开始提供并将会越来越多；因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集，成功的蒙蔽了许多 PHP 程序的开发者和用户，掩盖了在中文等语言环境下会出现的问题。
MySQL 4.1开始把多国语言字符集分的更加详细，所以导致数据库迁移，或则dz论坛升级到4.0后（dz4.0开始使用gbk或utf-8编码）出现乱码问题。
MySQL 4.1的字符集支持(Character Set Support)有两个方面：字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server)，数据库(database)，数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令：
QUOTE:
mysql&#62; SHOW VARIABLES LIKE &#8216;character_set_%&#8217;;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; Variable_name &#124; Value &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; character_set_client &#124; latin1 &#124;
&#124; character_set_connection &#124; latin1 &#124;
&#124; character_set_database &#124; latin1 &#124;
&#124; character_set_results &#124; latin1 &#124;
&#124; character_set_server &#124; latin1 &#124;
&#124; character_set_system &#124; utf8 &#124;
&#124; [...]]]></description>
			<content:encoded><![CDATA[<p><span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">MySQL 4.1开始，对多语言的支持有了很大变化 (这导致了问题的出现)。尽管大部分的地方 (包括个人使用和主机提供商)，MySQL 3、4.0 仍然占主导地位；但 MySQL 4.1 乃至5.0是 MySQL 官方推荐的数据库，已经有主机提供商开始提供并将会越来越多；因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集，成功的蒙蔽了许多 PHP 程序的开发者和用户，掩盖了在中文等语言环境下会出现的问题。</span></p>
<p>MySQL 4.1开始把多国语言字符集分的更加详细，所以导致数据库迁移，或则dz论坛升级到4.0后（dz4.0开始使用gbk或utf-8编码）出现乱码问题。</p>
<p>MySQL 4.1的字符集支持(Character Set Support)有两个方面：字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server)，数据库(database)，数据表(table)和连接(connection)。</p>
<p>查看系统的字符集和排序方式的设定可以通过下面的两条命令：<br />
QUOTE:<br />
mysql&gt; SHOW VARIABLES LIKE &#8216;character_set_%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| Variable_name | Value |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| character_set_client | latin1 |<br />
| character_set_connection | latin1 |<br />
| character_set_database | latin1 |<br />
| character_set_results | latin1 |<br />
| character_set_server | latin1 |<br />
| character_set_system | utf8 |<br />
| character_sets_dir | /usr/share/mysql/charsets/ |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
7 rows in set (0.00 sec) <span></span></p>
<p>mysql&gt; SHOW VARIABLES LIKE &#8216;collation_%&#8217;;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| Variable_name | Value |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| collation_connection | latin1_swedish_ci |<br />
| collation_database | latin1_swedish_ci |<br />
| collation_server | latin1_swedish_ci |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
3 rows in set (0.00 sec)</p>
<p>MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL，其中的一个数据库，其中的一张表，其中的一栏，应该用什么字符集。但是，传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置，它们用的是默认的配置，那么，默认的配置从何而来呢？</p>
<p>编译 MySQL 时，指定了一个默认的字符集，这个字符集是 latin1；<br />
安装 MySQL 时，可以在配置文件 (my.ini) 中指定一个默认的的字符集，如果没指定，这个值继承自编译时指定的；<br />
启动 mysqld 时，可以在命令行参数中指定一个默认的的字符集，如果没指定，这个值继承自配置文件中的；<br />
此时 character_set_server 被设定为这个默认的字符集；<br />
当创建一个新的数据库时，除非明确指定，这个数据库的字符集被缺省设定为 character_set_server；<br />
当选定了一个数据库时，character_set_database 被设定为这个数据库默认的字符集；<br />
在这个数据库里创建一张表时，表默认的字符集被设定为 character_set_database，也就是这个数据库默认的字符集；<br />
当在表内设置一栏时，除非明确指定，否则此栏缺省的字符集就是表默认的字符集；<br />
这个字符集就是数据库中实际存储数据采用的字符集，mysqldump 出来的内容就是这个字符集下的；<br />
当我们按照原来的方式通过PHP存取MySQL数据库时，就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询，你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。<br />
想要进行“正确”的存储和得到“正确”的结果，最方便的是在所有query开始之前执行一下： <span></span></p>
<p>SET NAMES &#8216;gbk&#8217;;<br />
其中gbk是数据库字符集。</p>
<p>它相当于下面的三句指令：<br />
SET character_set_client = gbk;<br />
SET character_set_results = gbk;<br />
SET character_set_connection = gbk;</p>
<p>4.1和5.0默认使用的是latin1字符集(木头:妈的,老外真霸道,妄想让全世界都是使用瑞典字符集吗)<br />
如果我们只想使用gbk字符集存储和获取数据,<br />
我们在编译mysql 4.1和 5.0的时候，需要注意在my.ini或者my.cnf中添加两处参数<br />
[mysqld]<br />
default-character-set=utf8</p>
<p>#settings for clients (connection, results, clients)<br />
[mysql]<br />
default-character-set=utf8</p>
<p>下面我们来说主题，如何转换数据库字符集</p>
<p>更改存储字符集<br />
主要的思想就是把数据库的字符集有latin1改为gbk，big5,或者utf8; 以下操作必须拥有主机权限。假设当前操作的数据库名为：database</p>
<p>导出<br />
首先需要把数据导为mysql4.0的格式，具体的命令如下：<br />
mysqldump -uroot -p &#8211;default-character-set=latin1 &#8211;set-charset=gbk &#8211;skip-opt databse &gt; d4.sql</p>
<p>&#8211;default-characte-set 以前数据库的字符集，这个一般情况下都是latin1的，<br />
&#8211;set-charset 导出的数据的字符集，这个可以设置为gbk，utf8,或者big5<br />
导入<br />
首先使用下面语句新建一个GBK字符集的数据库（test）</p>
<p>CREATE DATABASE `d4` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;<br />
然后把刚才导出的数据导入到当前的数据库中就ok了。</p>
<p>mysql -uroot -p &#8211;default-character-set=gbk -f d4&lt;d4.sql<br />
通过以上的导出和导入就把数据库的字符集改为正确的存储方式了。</p>
<p>其中d4为新建库的名称，d4.sql为导出文件的名字</p>
<p>但是这种方法，发现数据库数据存储量无端变大30%，真是郁闷</p>
]]></content:encoded>
			<wfw:commentRss>http://kevin.9511.net/archives/173.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

