MySQL字符编码

时间:2012-04-19 05:11:17

标签: mysql utf-8 character-encoding

我有一个大型数据库,最初是使用latin1编码和latin1_swedish_ci整理创建的。

我做了很多更改,现在我正在使用Doctrine2,它在查询之前使用SET NAMES UTF8。我之前使用的Yii框架也设置为使用UTF-8。基本上我一开始就忽略了所有这些,但据我所知,我一直在将UTF-8数据写入数据库,尽管它应该是latin1。

我想将我的数据库转换为utf-8但不知道如何安全地执行此操作并确保我不会丢失数据。

两个问题:

  1. 有没有办法确保我已正确完成此操作?我喜欢2 GB的数据,所以我不能只扫描它来测试,但我是否有某些字符可以确定数据库是否已经使用UTF-8了?

  2. 转换所有内容的正确方法是什么?我见过有人说我必须使用mysqldump并重新导入(使用某些标志http://blog.makezine.com/2007/05/08/mysql-database-migration-latin/http://docs.moodle.org/22/en/Converting_your_MySQL_database_to_UTF8)。其他人说你可以ALTER TABLE...每栏(http://www.bothernomore.com/2008/12/16/character-encoding-hell/)。而且我认为SET utf8之类的命令是我认为的ALTER TABLE的一部分,但我不知道是否有效。

  3. 修改

    我已经转储了数据并找到了几个重音字符。这是否表明数据本身是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;
    

    不知怎的,这导致我丢失数据。

    但是如果我转储,将每个表的charset从latin1更改为utf8,它就可以了。我宁愿只修改内容而不是转储和重新创建,但是如果没有人有基于此的任何其他建议或想法,我会诉诸它。

2 个答案:

答案 0 :(得分:2)

要检查一些事情,您可以执行以下操作:

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

基本上,在运行中,更改列的排序规则,看看是否会出现任何问题。

你绝对不需要重新导入所有内容,ALTER TABLE新编码应该没问题,假设一切都会转换好。

答案 1 :(得分:1)

我让它使用转储和重新导入。我主要遵循本指南:http://en.gentoo-wiki.com/wiki/Convert_latin1_to_UTF-8_in_MySQL

如果有其他人在我的情况下(你有一个latin1数据库中存储的UTF-8数据,你总是可以通过拨打SET NAMES utf8来访问),那么你可以试试(my)来自上述来源的修改)。

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...内容可能不起作用(在我的情况下不是这样)。