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