0

我正在寻找一种最佳实践方法来向现有数据库添加对亚洲字符集的支持。我们有latin1字符集中的现有表:

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

目前,当我们为该description字段输入 UTF8 字符时,我们会返回“?” 用于往返亚洲字符的字符。Latin1 字符工作得很好。

我可以简单地用这样的东西转换这个表吗?

ALTER TABLE books CONVERT TO CHARACTER SET utf8

我知道这不会神奇地修复表中已经存在的数据。我只是希望它能够为未来的新数据正常工作。

我需要担心整理吗?我不知道这对非拉丁字符有什么作用。

utf8为数据库设置默认值是否有意义?有什么警告吗?

谢谢

4

2 回答 2

0

我对 MySQL 如何处理字符集没有太多经验,但我对一般字符集有经验。

目前,当我们为描述字段输入 UTF8 字符时,我们会返回“?” 用于往返亚洲字符的字符。Latin1 字符工作得很好。

因为您的表latin1用于编码,所以它只能存储 latin1 字符集中存在的字符。Latin1 是 ISO-8859-1 的简写,你可以看到它有什么字符——没有亚洲字符,这就是它们不存储的原因。我有点惊讶 MySQL 在这样的输入上没有出错。

将 utf8 设为数据库的默认值是否有意义?有什么警告吗?

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

我会仔细阅读 Internet 以查找有关转换 MySQL 表的文献,以确保没有任何问题。如果这是生产数据,请在离线数据集(开发表或 QA 表)上进行测试。

最后,您似乎表明您的数据库中以某种方式存储了一半的亚洲字符。我会弄清楚到底存储了什么:如果它是亚洲字符的 UTF-8 序列,但数据库认为它是 latin1 ( mojibake 的经典案例,则可能有一些恢复我担心转换可能会尝试将 UTF-8 代码单元转换为 latin1,从而产生非常有趣的输出。测试测试测试。

于 2011-04-01T21:52:39.047 回答
0

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

进行粗略和现成的完整性检查的最简单方法之一是根据字节长度检查字符长度。

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

第一个返回值是以字节为单位的字符串长度,第二个是以字符为单位的字符串长度。如果其中有任何多字节字符,这两个值会有所不同。

互联网上有很多转换指南,我发现其中一个特别有用。

于 2012-05-01T07:04:31.177 回答