我有一个最初使用 latin1 编码和 latin1_swedish_ci 排序规则创建的大型数据库。
我做了很多更改,现在我使用的是 Doctrine2,它使用SET NAMES UTF8
之前的查询。我之前使用的是 Yii 框架,它也设置为使用 UTF-8。基本上我一开始就忽略了所有这些,但据我了解,我一直在将 UTF-8 数据写入数据库,尽管它应该都是 latin1。
我想将我的数据库转换为 utf-8,但不知道如何安全地做到这一点并确保我不会丢失数据。
两个问题:
有没有办法确保我正确地做到了这一点?我有 2 GB 的数据,所以我不能只扫描它来测试,但是我可以寻找某些字符来确定数据库是否已经使用 UTF-8?
转换一切的正确方法是什么?我见过有人说我必须 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
,但我不知道这是否有效。
编辑:
我已经转储了数据并发现了几个重音字符。这是否表明数据本身是 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,它就可以工作。我宁愿只修改东西而不是转储和重新创建,但如果没有人基于此提出任何其他建议或想法,我会求助于它。