在latin1数据库中存储utf8文本的后果是什么?

yrefmtwq  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(507)

我有一个默认字符集的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 |

驱动程序(在本例中是knex+node mysql)配置为 `charset: 'utf8'` . 因此,文本由utf8中的驱动程序进行编码、存储和检索。
然而,mysql认为数据在 `latin1` . 像这样混合木炭有什么后果?
ryevplcw

ryevplcw1#

标题问题的简短回答是,可以将拉丁1和utf8共有的256个字符放入其中一个 CHARACTER SET 对于一列。但是,您必须清楚您使用的是什么编码。否则 ® 可能显示为 ® (“mojibake”)。
不,那个 SELECT 获取该数据库中任何新表的默认值。它不控制列的存储方式。
数据库具有新表的默认值。
该表具有新列的默认值。
列具有 CHARACTER SET .
所以,你要做什么 SHOW CREATE TABLE 看看这些柱子。如果一列没有指定字符集,那么查看表的默认值,该值位于输出的末尾(还有一种方法可以从 information_schema.COLUMNS ,但那更笨重。) ® 是十六进制 AE 拉丁文1或 C2AE 在utf8(或utf8mb4)中。该字符不存在于“ascii”字符集中,它在7位处停止。
然而,自从 ® 两者都存在 latin1 以及 utf8 ,您可以安全地在两种编码之间来回移动。也就是说,如果你告诉mysql正确的东西。
客户端中的编码在中指定 SET NAMES 或连接参数。如果客户有 AE ,必须指定拉丁文1;如果客户有 C2AE ,必须指定utf8。
同时,列(不是表,也不是数据库)可以是latin1或utf8。转换,如果需要,将按您的要求进行 INSERT 以及 SELECT .
注意:拉丁文1只有256种不同的编码,没有中文,没有表情符号,除了西欧字符几乎什么都没有。
接下来,最好定义大多数列 utf8mb4 . 否则,一堆便便( ? )可能会显示 ???? .
如果你得到问号,mojibake等,咨询麻烦与utf-8字符;我看到的不是我储存的

相关问题