2011-04-01 52 views
0

我正在寻找一种最佳实践方法来将亚洲字符集支持添加到现有数据库。我们现有的某些在latin1字符集表:“?”MySQL:将亚洲字符支持添加到现有数据库

show create table books 
CREATE TABLE `books` (
    `id` varchar(255) NOT NULL, 
    `category` varchar(255) default NULL, 
    `contactEmail` varchar(255) default NULL, 
    `description` text, 
    `price` varchar(255) default NULL, 
    PRIMARY KEY (`id`), 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

目前,当我们进入UTF8字符为description领域,我们回来亚洲字符的来回往返。 Latin1字符工作得很好。

我可以简单地将此表转换为类似这样的东西吗?

ALTER TABLE books CONVERT TO CHARACTER SET utf8 

我知道这不会奇迹般地修复表中已经存在的数据。我只是希望它能够正常工作以获得新的数据。

我需要担心整理吗?我不知道这对非拉丁字符是如何工作的。

utf8作为数据库的默认值是否有意义?有什么要注意的吗?

感谢

回答

0

我没有与MySQL是如何处理的字符集了不少经验,但我有一个字符集的一般经验。

当我们为描述字段输入UTF8字符时,我们返回'?'亚洲字符的来回往返。 Latin1字符工作得很好。

由于您的表格使用latin1进行编码,因此它只能存储latin1字符集中存在的字符。 Latin1是ISO-8859-1的简写,你可以see what characters it has - 没有亚洲人物,这就是他们不会存储的原因。我有点惊讶MySQL不会在这样的输入错误。

将utf8作为数据库的默认值是否有意义?有什么要注意的吗?

如果您需要存储多种语言的字符,UTF-8将是一个不错的选择。作为Unicode编码的UTF-8将允许您存储来自多种语言的任何Unicode字符(实际上有数千个)。您可以使用UTF-8存储字符串“Dogcaféθλφ你好”。 UTF-8被广泛使用,并且能够编码任何东西 - 我强烈推荐它。

我会仔细阅读互联网,找到关于转换MySQL表的文章,以确保没有任何问题。如果这是生产数据,则测试脱机数据集 - 开发表或QA表。

最后,您似乎表示在您的数据库中存在半个亚洲字符。我想知道是什么存储:如果它是亚洲字符的UTF-8序列,但数据库认为它是latin1(经典案例mojibake),则可能会有一些恢复。我担心转换可能会尝试将UTF-8代码单元转换为latin1,从而产生非常有趣的输出。测试测试测试。

0

事实上,你回来'?'是一个好兆头,因为它表明拉丁文1中不存在的字符已被正确转换为替换字符。在开始转换数据的项目之前,请确保所有内容都清晰。如果您有多个应用程序和编程语言写入数据库,这一点尤其重要。

一个最简单的方法来做一个粗略和准备好的完整性检查是检查字节长度与字节长度。

SELECT length(foo), char_length(foo) FROM bar 

第一返回值是length of the string in bytes,第二个是length of the string in characters。如果在那里有任何多字节字符,这两个值会有所不同。

有很多指南可以在互联网上转换,而我发现one in particular是非常有用的。