我在默认字符集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
中。混合这种字符集的后果是什么?
答案 0 :(得分:1)
对标题问题的简短回答是,可以将 common 的256个字符放到latin1和utf8中CHARACTER SET
柱。但是,您必须明确您正在使用的编码。否则®
可能会显示为®
(" Mojibake")。
不,SELECT
为该数据库中的任何新表提取默认。它不控制列的存储方式。
数据库具有新表的默认值
该表具有新列的默认值
该列具有CHARACTER SET
的 true 定义。
所以,做SHOW CREATE TABLE
并查看列。如果列没有指定字符集,则查看表的默认值,该表位于输出的末尾。 (还有一种方法可以从information_schema.COLUMNS
获取此信息,但这很笨拙。)
®
在latin1中为十六进制AE
或在utf8(或utf8mb4)中为C2AE
。该字符不存在于" ascii"字符集,停止在7位。
但是,由于®
和latin1
都存在utf8
,因此您可以安全地在两种编码之间来回切换。也就是说, IF 你告诉MySQL正确的东西。
客户端中的编码在SET NAMES
或连接参数中指定。如果客户端有AE
,则必须指定latin1;如果客户端有C2AE
,则必须指定utf8。
同时,列(不是表,也不是数据库)可以 latin1或utf8。如果需要,转换将以INSERT
和SELECT
完成。
警告:latin1只有256种不同的编码,没有中文,没有表情符号,除西欧字符外几乎没有。
展望未来,最好定义大多数列utf8mb4
。否则,可能会显示一堆便便(){。}}。
如果您收到问号,Mojibake等,请咨询Trouble with UTF-8 characters; what I see is not what I stored