我有一个大型数据库,最初是用latin1编码和latin1_swedish_ci排序规则创建的。
我做了很多修改,现在我使用的是Doctrine2,它在查询之前使用SET NAMES UTF8。我以前使用的Yii框架,也是设置使用UTF-8。基本上,我在一开始就忽略了所有这些,但据我所知,我一直在为数据库编写UTF-8数据,尽管这一切都应该是latin1。
我想将我的数据库转换为utf-8,但是不知道如何安全地完成它,并确保我不会丢失数据。
两个问题:
ALTER TABLE...每列(http://www.bothernomore.com/2008/12/16/character-encoding-hell/)。我看过像SET utf8这样的命令作为ALTER TABLE的一部分,但我不知道这是否有效。编辑:
我已经转储了数据并找到了几个重音字符。这是否表明数据本身是UTF-8?如果是这样的话,我将这里的说明应用到这里,因为我可以“转换”为blob,然后安全地返回http://codex.wordpress.org/Converting_Database_Character_Sets。
再次编辑:
在做了我在前一个链接中看到的内容之后,我发现比较数据,在第一个非ascii(?)之后,我遗漏了所有字符。一。因此,我的标题设置为卷曲单引号,而新的数据库有这个字符和所有的字符后,它丢失。例如,下面是我正在运行的代码:
ALTER TABLE articles CHANGE title title VARBINARY(255) NOT NULL;
ALTER TABLE articles CHANGE title title VARCHAR(255) CHARACTER SET utf8 NOT NULL;不知怎么的,这让我失去了数据。
但是,如果我转储,将每个表的字符集从latin1更改为utf8,它就能工作。我宁愿只是修改东西,而不是转储和重新创建,但如果没有人有任何其他的建议或想法,我会求助于此。
发布于 2012-04-20 03:45:12
我让它和垃圾堆一起工作然后再导入。我主要遵循这个指南:http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL
如果有其他人在我的情况下(您将UTF-8数据存储在一个latin1数据库中,您一直通过调用SET NAMES utf8来访问该数据库),那么下面是您可以尝试的方法(我从上面的源代码中进行的修改)。
mysqldump -h example.org --user=foo -p -c --insert-ignore --skip-set-charset -r dump.sql dbname再次检查它是否是UTF-8 (我的)
file dump.sql对转储进行转换
perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump.sql创建一个新数据库(我没有删除旧数据库,以防万一)
mysql --user=foo -p --execute="CREATE DATABASE dbnameutf8 CHARACTER SET utf8 COLLATE utf8_general_ci;"导入
mysql --user=foo -p --default-character-set=utf8 dbnameutf8 < dump.sql希望这能帮到别人。请记住,ALTER TABLE...可能不起作用(在我的情况下并非如此)。
发布于 2012-04-19 05:16:34
要检查一些事情,您可以这样做:
SELECT t1.*
FROM table_1 t1
JOIN table_1 t2 on t1.guid = t2.guid AND
t1.field_1 <> t2.field_1 COLLATE UTF-8基本上,在飞行中,更改列的排序,看看是否会有任何问题发生。
您肯定不需要重新导入所有的东西,假设一切都会转换为OK,ALTER TABLE到新的编码应该是可以的。
https://stackoverflow.com/questions/10222000
复制相似问题