MySQL - 在连接字符串中使用 UTF8 编码是否会降低性能?

MySQL - Are there performance penalties with using UTF8 encoding in the connection string?

连接到 MySQL 数据库时,是否存在与在连接字符串中使用 UTF8 相关的任何性能问题? (例如:在 ADO.NET 中使用 "charset=utf8" 或在 JDBC 中使用 "useUnicode=yes&characterEncoding=utf8")

假设相同的设置可用于不同的数据库,如果服务器数据库未配置为支持 UTF8,是否会出现任何转换问题?

例如,我知道对于 SQL 服务器,当针对非 Unicode 列 (https://lostechies.com/jimmybogard/2012/07/18/troubleshooting-sql-index-performance-on-varchar-columns/) 作为 Unicode 发送参数时,table 扫描存在一些严重的性能问题,并且想知道 MySQL.

是否有类似的东西

简答:否

关于主题和相关项目的冗长、漫无边际的回答:

所有 utf8mb4 始终是 "best" 方法。

至于在 INSERTSELECT 期间要求 MySQL 进行字符集转换时的性能损失,与所有其他问题(索引、搜索、网络带宽)相比,它是次要的,解析语句等。由于缺少合适的索引,一个非常糟糕的性能提升是进行 table 扫描。对于较大的 tables,磁盘 I/O 可能是一个压倒性的因素。但是函数、表达式、字符集问题等都是次要的。

另一方面,如果您是 JOINing 两个 table 并且连接列的数据类型不完全匹配,这可能会导致 table 扫描而不是索引使用。 CHARACTER SETCOLLATION 不匹配 有时 会导致此性能下降。

回到你的问题...首先,你确定客户端中的字符使用什么编码。您的示例显示为 utf8。 (拼写可能应该是 UTF-8。)然后您在列级别指定用于存储的字符集。 (数据库有一个默认值,它提供给 table,它可以有一个默认值;然后该列采用默认值,除非它覆盖。)

如果客户端字符以一种方式编码而列以另一种方式编码,则会发生转换。不用担心性能。

注意:我没有提到"collation"。该术语指的是同一字符集中的文本之间的比较。 INSERTSELECT(除了 WHEREORDER BY)不涉及比较。

在MySQL之外,通常拼写为"UTF-8"。在 MySQL 里面,也就是 "utf8mb4",它允许编码长达 4 个字节。在 MySQL 中,"utf8" 指的是 3 字节(或更短)的子集。

注意:我没有提到"Unicode"。使用 "UTF-8",而不是 "UCS2"。 (我认为 JDBC 连接参数同时提到 'UTF-8' 和 'Unicode' 是不幸和令人困惑的。)