不同的数据库、表和列字符集和校对规则会导致性能问题吗?

4

我正在使用ASP.net和MYSQL开发网站。

在我的网站中,我不想限制用户只能发布英文内容。因此,为了支持多语言,我决定将字符集设置为Utf8MB4,排序规则设置为utf8_general_ci。

现在我有几个问题:

1)我应该将数据库的字符集设置为Utf8MB4,排序规则为utf8_general_ci吗?

2)我应该将数据库的字符集设置为Latin1,排序规则设置为Swedish_ci,在表级别上也应该将表的字符集设置为Utf8MB4,排序规则为utf8_general_ci 吗?

3)我应该将数据库的字符集设置为Latin1,排序规则设置为Swedish_ci,在表级别和列级别都将字符集设置为Latin1和Swedish_ci,仅在某些列中将字符集设置为Utf8MB4,排序规则为utf8_general_ci吗?

所以我很困惑:不同的字符集和排序规则是否会导致性能问题?最佳方法是什么?

1个回答

2

utf8mb4utf8_general_ci对于多语言应用程序来说是不错的选择。在DDL(表定义)中为每个表明确注明这些内容,并避免依赖默认值。

另外,确保您的会话字符集值与您的表匹配也是一个好主意。您可以通过设置服务器范围(而不是数据库)的默认值,或者在从程序连接后立即发出此SQL命令来实现这一点。

  SET CHARACTER SET utf8mb4

一般来说,将mysql服务器配置为使用utf8utf8mb4utf8_general_ci的全局默认值是一个好主意。这里有解释。http://dev.mysql.com/doc/refman/5.6/en/charset-applications.html 列上的索引与列的排序规则相匹配。如果在查询中指定了特定的排序规则,则可以打败索引的使用。例如,如果您的默认排序规则是utf8_general_ci,但您想要西班牙语排序(区分N和Ñ),则可以在查询中执行此操作。
ORDER BY surname COLLATE utf8_spanish_ci

这样做可以得到正确的结果,但是它无法使用在你的列上建立索引的默认排序规则,因为这一规则已经被嵌入到了索引中。


2
utf8mb4_general_ci,而不是utf8_general_ci - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接