MySQL:为什么要使用UTF-8

MySQL:为什么要使用UTF-8,sql,mysql,utf-8,Sql,Mysql,Utf 8,这是一个信息丰富的问题,而不是一个如何解决的问题。我正在MySQL中创建一个默认编码设置为UTF-8的数据库。现在,一些主键是varchar,它接受超过1000位限制的主键,因为使用utf-8的每个字符是3个字节。每个密钥是255个字符,这使密钥达到1530字节 因此,如果我想将编码改为拉丁语-1,主键将在1000字节以下,就像魔术一样,解决方案会奏效。但是使用UTF-8有什么好处(如果有的话)?为什么它如此流行?UTF-8之所以流行,是因为它在处理非英语字符时带来了理智。它支持各种非英语字母,

这是一个信息丰富的问题,而不是一个如何解决的问题。我正在MySQL中创建一个默认编码设置为UTF-8的数据库。现在,一些主键是varchar,它接受超过1000位限制的主键,因为使用utf-8的每个字符是3个字节。每个密钥是255个字符,这使密钥达到1530字节


因此,如果我想将编码改为拉丁语-1,主键将在1000字节以下,就像魔术一样,解决方案会奏效。但是使用UTF-8有什么好处(如果有的话)?为什么它如此流行?

UTF-8之所以流行,是因为它在处理非英语字符时带来了理智。它支持各种非英语字母,如阿拉伯语或汉语。如果您的应用程序有志于本地化为其他语言,UTF-8肯定会为您省去很多麻烦。只要搜索“字符编码”,你就会看到其中有多少


除此之外,出于性能原因,我建议您将主键尽量短(最好是数字键)。

一般问题的一般答案:
首先;似乎有一两种误解:

第一,;UTF-8仅对需要此功能的字符使用多个字节;这是一种VBR编码

第二;255乘以3不是1530;只有一半

第三;请记住,我本身并不是一个真正的数据库专家;VARCHAR主键听起来是个非常糟糕的主意

UTF-8s受欢迎的原因;正如@Tomas Kohl所述;它可以表示任何Unicode字符;但仍然允许以单个字节表示ASCII(U+127及以下)

如果你有任何国际野心;永远不要使用UTF-8(或简称N'DUUH!);否则你会后悔的


Hard

UTF-8是一种可变字节编码,根据特定字符的不同,字符使用的字节数也不同。对于采用7位ASCII编码的字符(大致为英语字母数字和一些标点符号),UTF-8编码只使用一个字节(实际上是同一个字节)。如果您说的是“拉丁1”,因此可能会考虑一些重音字符,那么这些字符将仅为2字节UTF-8字符

所以,当你说“使用utf-8的每个字符是3个字节”时,你是不对的——除非你说的是非拉丁语的外来字符


UTF-8将允许您在将来使用更大范围的字符,对于英文文本,几乎不需要(如果有的话)额外的空间。

这听起来不太正确。如果您使用的是Latin-1字符集中的字符,那么这些字符将不会使用三个字节作为UTF-8。大多数字符将使用一个字节,也许少数字符将使用两个字节。我没有检查,但我怀疑拉丁-1字符集中的任何字符都会使用三个字节作为UTF-8


当需要存储多种字符时,Unicode非常有用。例如,您可以在同一字段中存储英语、汉语、希腊语、俄语和希伯来语文本,这在任何单字节编码中都是不可能的。

我认为真正的问题是:“为什么要使用VARCHAR(255)作为主键?”@Mchl:No;真正的问题是:“255*3怎么变成1530?”他可能试图在两个这样的字段(m-to-n关系表或类似的东西)上创建唯一的复合索引,甚至:如果使用拉丁语-1就可以了,如何计算每个字符的3字节数?@araqnid:-在创建密钥时,MySQL使用最悲观的变量来计算长度。
永远不要使用UTF-8
。我喜欢它;)我经常使用varchars作为PK(存储32个字符的guid)。当同步不同的系统时,它们很棒,因为PK在所有系统中都是唯一的。关于GUID的文章:@PavelRadzivilovsky:对不起,什么?我想你需要重读我的命令:“永远不要使用UTF-8!”里面有一个双重否定。意思是“始终使用UTF-8!”。我承认后者会更清晰,但它会缩写为“AUU!”,这太愚蠢了。@WillihamTotland,人类不太擅长双重否定。不过,该宣言的链接已经到期。你也可以贡献部分:)+1它甚至不必像中文那么有异国情调——只要看看15种左右的ISO-8859-x编码,其中大部分是针对欧洲语言的。Unicode(及其编码UTF-8)是字符编码地狱中的一道亮光。