首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL字符编码

MySQL字符编码
EN

Stack Overflow用户
提问于 2012-04-19 05:11:16
回答 2查看 3.7K关注 0票数 2

我有一个大型数据库,最初是用latin1编码和latin1_swedish_ci排序规则创建的。

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

我想将我的数据库转换为utf-8,但是不知道如何安全地完成它,并确保我不会丢失数据。

两个问题:

  1. 是否有办法确保我做得对?我有大约2GB的数据,所以我不能只是扫描它来测试,但是是否有特定的字符可以确定数据库是否已经使用了UTF-8?
  2. -什么是正确的方式来转换所有的东西?我见过一些人说我必须转储和重新导入(带有某些标志,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(?)之后,我遗漏了所有字符。一。因此,我的标题设置为卷曲单引号,而新的数据库有这个字符和所有的字符后,它丢失。例如,下面是我正在运行的代码:

代码语言:javascript
复制
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,它就能工作。我宁愿只是修改东西,而不是转储和重新创建,但如果没有人有任何其他的建议或想法,我会求助于此。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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来访问该数据库),那么下面是您可以尝试的方法(我从上面的源代码中进行的修改)。

代码语言:javascript
复制
mysqldump -h example.org --user=foo -p -c --insert-ignore --skip-set-charset -r dump.sql dbname

再次检查它是否是UTF-8 (我的)

代码语言:javascript
复制
file dump.sql

对转储进行转换

代码语言:javascript
复制
perl -pi -w -e 's/CHARSET=latin1/CHARSET=utf8/g;' dump.sql

创建一个新数据库(我没有删除旧数据库,以防万一)

代码语言:javascript
复制
mysql --user=foo -p --execute="CREATE DATABASE dbnameutf8 CHARACTER SET utf8 COLLATE utf8_general_ci;"

导入

代码语言:javascript
复制
mysql --user=foo -p --default-character-set=utf8 dbnameutf8 < dump.sql

希望这能帮到别人。请记住,ALTER TABLE...可能不起作用(在我的情况下并非如此)。

票数 1
EN

Stack Overflow用户

发布于 2012-04-19 05:16:34

要检查一些事情,您可以这样做:

代码语言:javascript
复制
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到新的编码应该是可以的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10222000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档