我正在使用ASP.net开发一个网站,我的数据库是MYSQL。在那里用户可以提交文章。这个网站走向国际,因此我不想将语言仅限于英语。
所以我决定了一些事情。如果我选错了,请指导我。
1)我选择utf8mb4作为数据库字符集。因为它是UTF8的改进版本,用于存储更多字符。我做出了正确的选择吗?我的意思是我只有几张表需要使用utf8mb4。那么我应该使用Latin1作为数据库字符集吗?
2)我不知道上面的charset使用哪种排序规则。我决定使用utf8mb4 swedish_ci。或者我应该使用一般的Ci还是其他任何一种?
3)在我的表中,大多数表都不需要utf8mb4字符集。 Latin 1 swedesh将完成这项工作。那么我可以在特定的charset和collation下维护选定的表,即使DB在另一个Charset和collation中吗?
4)我可以将utf8mb4字符集用于表格中具有Latin1 swedesh作为charset的特定列吗?
如果那些可以做数据库charset,table charset和column charsets之间的关系?
不同的字符集会导致任何性能问题吗?
非常感谢。
答案 0 :(得分:3)
数据库字符集由表继承,除非您覆盖它。 (我建议在表级别具体。)
表charset由表中的列继承。由于一个通常只有一个字符集,这种继承很好。此外,当您执行SHOW CREATE TABLE
每列设置的内容时,非常清楚 - 无需查看数据库或系统。
去国际 - 使用utf8或utf8mb4。我同意utf8mb4是一个更好的选择,特别是对于中文和一些表情符号。
character_set_%
- 只有_client,_connection和_results很重要。这些是由SET NAMES 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
另见“最佳实践”部分。
对于西欧文本,latin1小于utf8。 MySQL将在需要时进行适当的转换,因此这不是问题。但我不想通过混合字符集来混淆程序员。请记住,将现有的表格列从latin1转换为utf8需要付出一些努力,可能会造成停机,并可能带来风险。
4)我可以将utf8mb4字符集用于表格中具有Latin1 swedesh作为charset的特定列吗?
是。每列(但不是每行)可以具有不同的字符集和/或整理。
不同的字符集的存在本身并不是一种表现。当两列具有不同的字符集和/或整理时,可以咬你的是WHERE col1 = col2
(以及其他情况)。如果它看到一个不容易处理的差异,MySQL将放弃一个非常好的索引。