我知道MySQL默认使用的是latin1编码。显然,latin1将一个字符存储在1个字节中,而utf-8则需要3个字节 - 这是正确的吗?
我正在开发一个希望全球使用的网站。 我一定需要使用utf-8吗?还是可以使用latin1?
另外,我试图将一些表从latin1更改为utf8,但遇到了这个错误:
指定键太长;最大键长度为1000字节
有谁知道解决方案吗?我真的需要解决这个问题吗?还是latin1已经足够了?
谢谢, Alex
我知道MySQL默认使用的是latin1编码。显然,latin1将一个字符存储在1个字节中,而utf-8则需要3个字节 - 这是正确的吗?
我正在开发一个希望全球使用的网站。 我一定需要使用utf-8吗?还是可以使用latin1?
另外,我试图将一些表从latin1更改为utf8,但遇到了这个错误:
指定键太长;最大键长度为1000字节
有谁知道解决方案吗?我真的需要解决这个问题吗?还是latin1已经足够了?
谢谢, Alex
一个Latin1字符需要1个字节来存储,而一个UTF-8字符需要1到3个字节 - 这是正确的吗?
一个Latin1
字符需要1
个字节来存储,而一个UTF8
字符需要1
到3
个字节来存储。
如果您在字符串中只使用基本的拉丁字符和标点符号(Unicode的0
到128
),那么两种字符集将占用相同的长度。
此外,我试图将一些表从latin1更改为utf8,但我收到了这个错误:“指定的关键字太长;最大关键字长度为1000个字节”。有人知道解决方法吗? 我真的需要解决这个问题吗?或者说使用latin1就足够了吗?
如果您有一个长度为VARCHAR(334)
或更长的列,MyISAM
不允许您对其创建索引,因为该列可能占用超过1000
个字节。
请注意,这样长度的键很少有用。您可以创建一个前缀索引,它对任何实际数据几乎同样有效。
最起码我建议使用UTF-8。现在90%以上的数据库都支持UTF-8,因此您的数据将与其他任何数据库兼容。
如果您选择LATIN1/ISO-8859-1,则存在数据存储不正确的风险,因为它不支持国际字符... 因此您可能会遇到像图像左侧所示的问题:
如果您允许用户用自己的语言发布内容,并且希望来自各个国家的用户参与,那么您至少需要将包含这些内容的表切换到UTF-8 - Latin1仅覆盖ASCII和西欧字符。 如果您打算在UI中使用多种语言,则同样如此。请参见此文章以了解如何处理迁移。
utf8
字符集。相反,应该使用utf8mb4
,这是标准的正确实现。utf8mb4
中,字符具有可变的字节数。顾名思义,字符最多占用四个字节。对于作为utf8mb4
编码的拉丁字符集中的字符,它们仍然只占用一个字节。其他字符,包括带重音符号、汉字和表情符号,需要两个、三个或四个字节来存储。utf8mb4
列时,会出现“指定的键太长;最大键长度为1000个字节”的错误,因为索引可能超过此限制。您需要缩短一些字符列的列长度或缩短使用此语法在列上的索引长度,以确保其小于限制。
ALTER TABLE.. ADD INDEX `myIndex` ( column1(15), column2(200) );
由于键的最大长度为1000个字节,如果使用utf8,则将限制您最多333个字符。
然而,MySQL与Oracle在字符集方面不同。在Oracle中,您不能针对每个列使用不同的字符集,而在MySQL中可以,因此您可以将键设置为latin1,其他列设置为utf8。
最后,我相信只有已废弃的版本6.0alpha(当Sun收购MySQL时被放弃)才能容纳超出BMP(基本多语言平面)的Unicode字符。因此,即使使用UTF-8,您也无法拥有全部Unicode字符集。实际上,这仅对罕见的中文字符是一个问题,如果这真的很重要。
MD5
哈希(或任何足够唯一的哈希)建立索引。 - Quassnoi