gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:42:44 25 4
gpt4 key购买 nike

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

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 |

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

但是,mysql 认为数据在 latin1 中。像这样混合字符集会产生什么后果?

最佳答案

title 问题的简短回答是,可以将 latin1 和 utf8 common 的 256 个字符放入 CHARACTER SET 列。但是,您必须清楚您使用的是什么编码。否则 ® 可能显示为 ®(“Mojibake”)。

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

数据库有新表的默认值。
该表具有新列的默认值。
该列具有 CHARACTER SETtrue 定义。

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

® 是 latin1 中的十六进制 AE 或 utf8(或 utf8mb4)中的 C2AE。该字符不存在于“ascii”字符集中,该字符集停在 7 位。

但是,由于 ® 存在于 latin1utf8 中,您可以安全地在两种编码之间来回切换。也就是说,如果您告诉 MySQL 正确的内容。

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

同时,列(不是表,也不是数据库)可以是 latin1 或 utf8。如果需要,转换将在您 INSERTSELECT 时完成。

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

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

如果遇到问号、Mojibake等,咨询Trouble with UTF-8 characters; what I see is not what I stored

关于mysql - 在 Latin1 数据库中存储 UTF8 文本有什么后果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48211137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com