在 Latin1 数据库中存储 UTF8 文本有什么后果?

dav*_*ler 5 mysql utf-8 character-encoding

我有一个默认字符集的 mysql 数据库 latin1

mysql>  SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA ;
+--------------------+---------+-------------------+
| database           | charset | collation         |
+--------------------+---------+-------------------+
| dbname12345        | latin1  | latin1_swedish_ci |
Run Code Online (Sandbox Code Playgroud)

驱动程序(在本例中为 knex + node-mysql)配置为charset: 'utf8'. 因此,驱动程序以 UTF8 编码、存储和检索文本。

但是,mysql认为数据在latin1. 像这样混合字符集的后果是什么?

Ric*_*mes 3

对标题问题的简短回答是,可以将latin1 和 utf8 共有的256CHARACTER SET个字符放入列中。但是,您必须清楚您正在使用什么编码。否则\xc2\xae可能显示为\xc3\x82\xc2\xae(“Mojibake”)。

\n\n

不,这SELECT会获取该数据库中任何新表的默认值。它不控制列的存储方式。

\n\n

数据库有新表的默认值。
\n该表有新列的默认值。
\n该列具有的真实定义CHARACTER SET

\n\n

因此,请执行SHOW CREATE TABLE并查看这些列。如果列未指定字符集,则查看表的默认字符集,该默认字符集位于输出的末尾。(还有一种方法可以从 获取此信息information_schema.COLUMNS,但这比较笨拙。)

\n\n

\xc2\xaeAElatin1 或C2AEutf8(或 utf8mb4)中的十六进制。该字符不存在于“ascii”字符集中,该字符集中停在 7 位。

\n\n

但是,由于和 都\xc2\xae存在,因此您可以安全地在两种编码之间来回切换。也就是说,如果你告诉 MySQL 正确的内容。latin1utf8

\n\n

客户端中的编码在SET NAMES连接参数中指定。如果客户端有AE,则必须指定latin1;如果客户端有C2AE,则必须指定utf8。

\n\n

同时,列(不是表,也不是数据库)可以是latin1或 utf8。如果需要,转换将按您INSERT和 的方式完成SELECT

\n\n

注意:latin1 只有 256 种不同的编码,没有中文,没有表情符号,除了西欧字符之外几乎什么都没有。

\n\n

展望未来,最好定义大多数列utf8mb4否则,可能会显示一堆便便 ( ) ????

\n\n

如果您遇到问号、Mojibake 等问题,请参阅Trouble with UTF-8characters;我看到的不是我存储的

\n