MySQL:在现有数据库中添加对亚洲字符的支持

我正在寻找一种最佳实践方法,以便将对亚洲字符集的支持添加到现有数据库中。我们现有的表位于
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
作为数据库的默认值是否有意义?那有什么警告吗? 谢谢     
已邀请:
我对MySQL如何处理字符集没有多少经验,但我对字符集有一般的经验。   目前,当我们为描述字段输入UTF8字符时,我们会回来'?'往返亚洲角色的角色。 Latin1字符工作得很好。 因为您的表使用
latin1
进行编码,所以它只能存储latin1字符集中存在的字符。 Latin1是ISO-8859-1的简写,你可以看到它有什么字符 - 没有亚洲字符,这就是为什么它们不会存储。我有点惊讶MySQL没有这样的输入错误。   将utf8作为数据库的默认值是否有意义?那有什么警告吗? 如果您需要存储多种语言的字符,UTF-8将是一个不错的选择。 UTF-8作为Unicode编码,允许您存储来自多种语言的任何Unicode字符(实际上有数千个字符)。您可以使用UTF-8存储字符串“Dogcaféθλφ你好”。 UTF-8被广泛使用,并且能够编码任何东西 - 我强烈推荐它。 我会仔细阅读互联网,找到有关转换MySQL表的文献,以确保没有任何陷阱。如果这是生产数据,请在脱机数据集上进行测试 - 开发表或QA表。 最后,您似乎表明在您的数据库中存在一半存储的亚洲字符。我会弄清楚存储的是什么:如果它是亚洲字符的UTF-8序列,但数据库认为它是latin1(一个经典的mojibake案例),可能会有一些恢复。我担心转换可能会尝试将UTF-8代码单元转换为latin1,从而产生非常有趣的输出。测试测试。     
事实上你要回来'?'是一个好兆头,因为它表明Latin-1中不存在的字符已正确转换为替换字符。在开始转换数据的项目之前,请确保其中的所有内容都是合理的。如果您有多个应用程序和编程语言写入数据库,这一点尤为重要。 进行粗略和准备完整性检查的最简单方法之一是检查字符长度与字节长度。
SELECT length(foo), char_length(foo) FROM bar
第一个返回值是字符串的长度(以字节为单位),第二个是字符串的长度(以字符为单位)。如果在某种程度上有任何多字节字符,这两个值将不同。 互联网上提供了大量的转换指南,而且我发现这些指南非常有用。     

要回复问题请先登录注册