我有一个默认字符集的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` . 像这样混合木炭有什么后果?
1条答案
按热度按时间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字符;我看到的不是我储存的