12

我知道MySQL有默认的latin1编码,显然它需要 1 个字节来存储一个latin1中的字符和 3 个字节来存储一个utf-8中的字符- 对吗?

我正在开发一个希望在全球范围内使用的网站。我绝对需要utf-8吗?或者我可以使用 latin1 吗?

另外,我尝试将一些表从latin1更改为utf8,但出现此错误: Speficief key was too long; max key length is 1000 bytes 有人知道解决方案吗?我真的应该解决这个问题还是 latin1 就足够了?

谢谢,亚历克斯

4

8 回答 8

11

在 latin1 中存储一个字符需要 1 个字节,在 utf-8 中存储一个字符需要 3 个字节 - 对吗?

存储一个字符需要1字节,存储一个latin1字符1需要3字节UTF8

如果您只在字符串中使用基本拉丁字符和标点符号 ( 0to 128in Unicode),则两个字符集将占用相同的长度。

另外,我尝试将一些表从 latin1 更改为 utf8,但出现此错误:“Speficief key was too long; max key length is 1000 bytes”有人知道解决方案吗?我真的应该解决这个问题还是 latin1 就足够了?

如果您有一列VARCHAR(334)或更长的列,MyISAM则不会让您在其上创建索引,因为该列极有可能占用更多1000字节。

请注意,这种长度的键很少有用。您可以创建一个前缀索引,该索引几乎对任何真实世界的数据都具有选择性。

于 2011-02-01T00:54:25.740 回答
9

我建议至少使用 UTF-8。您的数据将与现在的所有其他数据库兼容,因为其中 90% 以上是 UTF-8。

如果您使用 LATIN1/ISO-8859-1,则可能会因为数据不支持国际字符而无法正确存储数据……因此您可能会遇到类似于此图像左侧的情况:

在此处输入图像描述

如果您使用 UTF-8,则无需处理这些令人头疼的问题。

关于您的错误,听起来您需要优化数据库。考虑一下:http ://bugs.mysql.com/bug.php?id=4541#c284415

如果您针对该问题提供有关表架构和列的详细信息,将会有所帮助。

于 2011-02-01T00:48:36.823 回答
4

如果您允许用户以他们自己的语言发帖,并且如果您希望来自所有国家/地区的用户参与,您必须至少将包含这些帖子的表格切换为 UTF-8 - Latin1 仅涵盖 ASCII 和西欧字符。如果您打算在 UI 中使用多种语言,情况也是如此。请参阅这篇文章了解如何处理迁移。

于 2011-02-01T00:49:39.833 回答
2

根据我的经验,如果您计划支持阿拉伯语、俄语、亚洲语言或其他语言,那么前期对 UTF-8 支持的投资将获得回报。但是,根据您的情况,您可能会暂时摆脱英语。

至于错误,您可能有一个超过 333 个字符的键或索引字段,这是 MySQL 中使用 UTF-8 编码所允许的最大值。请参阅此错误报告

于 2011-02-01T00:50:32.777 回答
1

由于密钥的最大长度为 1000 BYTES,如果您使用 utf8,那么这会将您限制为 333 个字符。

但是 MySQL 与 Oracle 的字符集不同。在 Oracle 中,每列不能有不同的字符集,而在 MySQL 中可以,因此您可以将键设置为 latin1,将其他列设置为 utf8。

最后,我相信只有已失效的 6.0alpha 版本(在 Sun 购买 MySQL 时放弃)可以容纳 BMP(基本多语言计划)之外的 unicode 字符。所以基本上,即使使用 UTF-8,你也不会拥有所有的unicode字符集。实际上,这只是稀有汉字的问题,如果这对您来说真的很重要的话。

于 2011-02-01T00:52:56.537 回答
1

我们使用拉丁语做了一个应用程序,因为它是默认的。但是后来我们不得不将所有内容都更改为 UTF,因为西班牙字符,这不是难以置信的困难,但没有必要进行不必要的更改。

所以简短的回答是从一开始就使用 UTF-8,它会在以后为您省去麻烦。

于 2011-02-01T00:53:17.310 回答
1

我不是专家,但我一直明白 UTF-8 实际上是一个 4 字节宽的编码集,而不是 3。据我了解,utf8_unicode_ci 的 MySQL 实现只处理一个 3 字节宽的编码集......

如果你想要完整的 UTF-8 4 字节字符编码,你需要为你的 MySQL 数据库/表使用 utf8mb4_unicode_ci 编码。

于 2017-05-30T19:44:56.630 回答
0

当前的最佳实践是永远不要使用 MySQL 的utf8字符集。改为使用utf8mb4,这是标准的正确实现。

有关详细信息,请参阅Adam Hooper 的解释

请注意,在 中utf8mb4,字符的字节数是可变的。顾名思义,字符最多为四个字节。对于拉丁字符集中的字符,编码为utf8mb4,它们仍然只占用一个字节。其他字符,包括带有重音符号、汉字和表情符号的字符,需要两个、三个或四个字节来存储。

Specified key was too long; max key length is 1000 bytes索引包含列时会发生错误,utf8mb4因为索引可能超过此限制。您需要使用此语法缩短某些字符列的列长度或缩短列索引的长度,以确保它短于限制。

ALTER TABLE.. ADD INDEX `myIndex` ( column1(15), column2(200) );

于 2021-02-04T16:15:56.023 回答