﻿<?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>单调专注的明王子 &#187; mysql</title>
	<atom:link href="http://uyun.com/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://uyun.com</link>
	<description>发梦都喊着亚历山大的男孩～</description>
	<lastBuildDate>Sun, 09 Oct 2011 08:16:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Mysql“海量”数据库的编码转换，成功案例 Latin1到Utf8</title>
		<link>http://uyun.com/mysql-mass-database-encoding-conversion-success-stories-latin1-to-utf8/</link>
		<comments>http://uyun.com/mysql-mass-database-encoding-conversion-success-stories-latin1-to-utf8/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 18:51:12 +0000</pubDate>
		<dc:creator>明王子</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[备份]]></category>
		<category><![CDATA[编码转换]]></category>

		<guid isPermaLink="false">http://www.uyun.com/?p=465</guid>
		<description><![CDATA[这些应用都不能算是海量了。大小也只是2个G，转换后成功率99.97%，重要的数据都对比了条数，没有缺少，很是...]]></description>
			<content:encoded><![CDATA[<p>这些应用都不能算是海量了。大小也只是2个G，转换后成功率99.97%，重要的数据都对比了条数，没有缺少，很是欣慰。</p>
<p>之前自己写了一个脚本，直接转换Mysql，没有先把数据存下来的那种，每次设定转换一定的数据量，不过只能适合普通的几十M的转换，除非CPU比较高。</p>
<p>源码如下：</p>
<p><a href="http://www.uyun.com/wp-content/uploads/2009/02/db_chasrset.rar">基于PTK的数据库备份方案</a></p>
<p>不过不建议用这个，只能说自己的水平比较有限，没有考虑到编码转换等的种种问题。</p>
<p><strong>经过研究发现：先把数据库备份下来再恢复是最佳的方案。</strong></p>
<p>之前记得有个帝国备份王的。感觉不错，于是就在上面做了一些修改：</p>
<p>原版（开源）：<a href="http://www.uyun.com/wp-content/uploads/2009/02/ebak2008.zip">帝国备份王2008 </a></p>
<p>修改了里面一个文件：class下面的functions.php就可以解决问题了。</p>
<p>下面附上functions.php的代码：</p>
<p><a href="http://www.uyun.com/wp-content/uploads/2009/02/functions.rar">修改帝国备份王2008的函数定义文件</a></p>
<p>这样子，就可以解决一两个G的数据库备份，转码等问题。</p>
<p>过程中，发现帝国备份王比其他的备份工具都要快，原因是因为我选择了按照条数来限制每次导出量，并且自动识别了主键。</p>
<p>在SQL查询是如何体现的呢？</p>
<p>核心代码如下：</p>
<blockquote><p>Select * From yanxue8_visit Where vid &gt;=(<br />
Select vid From yanxue8_visit Order By vid limit 10,1<br />
) limit 10 </p></blockquote>
<p>简单吧，更多的内容可以参照：</p>
<p><a href="http://www.phpobject.net/blog/read.php/119.htm">http://www.phpobject.net/blog/read.php/119.htm</a></p>
<p>此外，也有用命令行来做编码转换的，核心的导出：</p>
<blockquote><p>以原来的字符集为latin1为例，升级成为utf8的字符集。原来的表: old_table (default charset=latin1)，新表：new_table(default charset=utf8)。<br />
第一步：导出旧数据<br />
mysqldump &#8211;default-character-set=latin1 -hlocalhost -uroot -B my_db &#8211;tables old_table &gt; old.sql<br />
第二步：转换编码(类似unix/linux环境下)<br />
iconv -t utf-8 -f gb2312 -c old.sql &gt; new.sql<br />
或者可以去掉 -f 参数，让iconv自动判断原来的字符集<br />
iconv -t utf-8 -c old.sql &gt; new.sql<br />
在这里，假定原来的数据默认是gb2312编码。</p></blockquote>
<p>事实证明这个不明智，超过两个G的SQL文件，转码慢，无法一次打开，无法修改，用命令导入的时候Mysql经常自己掉线，最可怕的是数据丢失严重。我之前也是打算用命令行来转换后院的数据库的，后来发现，不行，丢失数据的情况很严重，然后自己写然后再出现了本文开头的那一幕。</p>
<p>分别学到的PHP跟MySQL语法有：</p>
<ul>
<li>识别当前字段类型 mysql_field_type</li>
<li>识别当前字段属性 mysql_field_flags（一般是判断是否是二进制，如果是就用base64_encode，导入的时候用base64_decode，这个是一个笨办法 :~ ）</li>
<li>在中文的系统，导出的SQL如果正常显示中文就说明已经是gbk的格式（ANSI文件格式），这个时候只要用 &#8220;character_set_client=&#8217;binary&#8217;; ENGINE=MYISAM DEFAULT CHARSET=gbk;&#8221; 就可以了。千万不要与目标编码对齐。</li>
<li>可以看备份王里面关于生成文件编码的处理，确实很优秀，值得学习跟推荐。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://uyun.com/mysql-mass-database-encoding-conversion-success-stories-latin1-to-utf8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

