当前位置: 首页 > 知识库问答 >
问题:

数据库的字符集、表的字符集和列的字符集之间的关系?不同的字符集是否会导致性能问题?

澹台权
2023-03-14

我正在用ASP开发一个网站。net和我的数据库是MYSQL。在那里,用户可以提交文章。这个网站是国际性的,所以我不想把语言限制为英语。

所以我决定做几件事。如果我做了错误的选择,请指导我。

1) 我选择utf8mb4作为数据库字符集。因为它是UTF8的改进版本,用于存储更多字符。我的选择正确吗?我的意思是,我只有几个需要使用utf8mb4的表。那么我应该使用Latin1作为数据库字符集吗?

2) 我不知道上面的字符集使用哪个排序规则。我决定使用utf8mb4瑞典语。或者我应该使用通用Ci或任何其他?

3)在我的表中,大多数表不需要utf8mb4字符集。拉丁语1瑞典语将做这项工作。因此,我可以在特定的字符集和归类下维护选定的表,即使DB在另一个字符集和归类中?

4)我可以使用utf8mb4字符集为一个表中的拉丁1瑞典作为字符集的特定列?

如果可以,数据库字符集、表字符集和列字符集之间的关系是什么?

不同的字符集是否会导致任何性能问题?

非常感谢。

共有1个答案

滑畅
2023-03-14

数据库字符集由表继承,除非您重写它。(我建议在表格级别明确。)

表字符集由表中的列继承。因为一个通常只有一个字符集,所以这种继承是可以的。此外,当您执行SHOW CREATE TABLE时,每个列的设置非常清楚,而不必查看数据库或系统。

国际化--使用utf8或utf8mb4。我同意utf8mb4是更好的选择,尤其是对于中文和一些表情符号。

character\u set%——只有客户端、连接和结果才重要。这三个是由集合名称utf8mb4设置的。别管其他人。

utf8mb4的默认归类是utf8mb4_general_ci,如果您有多种语言,这可能是一个不错的选择。另一个选择是utf8mb4_unicode_ci。我在http://mysql.rjweb.org/doc.php/charcoll#combining_diacriticals中更多地谈论“组合变音”。本节给出了这两种归类不同之处的示例:http://mysql.rjweb.org/doc.php/charcoll#utf8_collations_examples

另请参见“最佳实践”部分。

拉丁文1小于西欧文本的utf8。MySQL将在需要时进行适当的转换,因此这不是问题。但是,我不希望通过混合字符集来混淆程序员。请记住,将现有表列从latin1转换为utf8需要一些努力、可能的停机时间和可能的风险。

4)我可以使用utf8mb4字符集为一个表中的拉丁1瑞典作为字符集的特定列?

是的。每一列(但不是每一行)可以有不同的字符集和/或排序规则。

不同字符集的存在本身并不是一种性能。当两列具有不同的字符集和/或排序规则时,中的col1=col2(以及其他情况)可能会对您产生影响。如果MySQL发现了一个不容易处理的差异,它将放弃一个本来非常好的索引。

 类似资料:
  • 我正在使用ASP. net开发一个网站,我的数据库是MYSQL。 在那里,我不希望用户限制只发布英文内容到我的网站。所以为了支持多语言,我决定使用Charset作为Utf8MB4,使用归类作为utf8_general_ci。 所以现在我有几个问题。 1) 我是否应该将数据库的字符集设置为Utf8MB4,并对utf8\u general\u ci进行排序? 2) 使用数据库的字符集Latin1和排序

  • 好了,通过上面的几个实例我们初步认识了 Python 的正则表达式,可能你就会问,正则表达式还有什么规则,什么字母代表什么意思呢? 其实,这些都不急,在本章后面会给出对应的正则表达式规则列表,而且这些东西在网上随便都能 Google 到。所以现在,我们还是进一步加深对正则表达式的理解,讲一下正则表达式的字符集。 字符集是由一对方括号 “[]” 括起来的字符集合。使用字符集,可以匹配多个字符中的一个

  • 多年来,通过阅读不断发展的规范,我假设RFC 3986最终确定了转义八位字节序列的UTF-8编码。也就是说,如果我的URI有,我可以获取解码八位字节序列(对于方案特定部分中的任何URI)并将生成的字节解释为UTF-8,以找出解码信息的意图。实际上,我可以调用JavaScript来自动为我进行解码。 然后,我阅读了

  • 像其它大多数的Java应用程序一样,FreeMarker使用 "UNICODE 文本"(UTF-16)来工作。 不过,也有必须处理 字符集 的情况, 因为它不得不和外界交换数据,这就会使用到很多字符集。 输入的字符集 当 FreeMarker 要加载模板文件(或没有解析的文本文件)时, 那就必须要知道文件使用的字符集,因为文件的存储是原生的字节序列。 可以使用 encoding 配置 来确定字符集

  • 问题内容: 我升级了httpmime程序包,现在我的字符串不作为UTF-8发送或接收 我想念什么?我曾经构建一个StringBody并在stringbody中设置字符集,但是现在已弃用了它,但似乎不起作用 问题答案: 解决了:)事实证明ContentType现在很重要,我发送的是纯文本,还有一些是JSON文本, 对于纯文本,可以使用: 对于JSON: 这样,字符集也可用于JSON字符串(很奇怪,但

  • 问题内容: 我需要能够使用Java中的字符串,并确定其中包含的所有字符是否都在指定的字符集中(例如ISO-8859-1)。我已经到处寻找了一种简单的方法(包括使用来玩),但是还没有找到任何东西。 取得字符串并确定所有字符是否都在给定字符集中的最佳方法是什么? 问题答案: 类CharsetEncoder在包java.nio.charset中提供的方法canEncode是否支持一个特定的字符来测试。