默认字符集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,被配置为charset: 'utf8'。因此,UTF8中的驱动程序对文本进行编码、存储和检索。
然而,mysql认为数据在latin1中。像这样混合字符的后果是什么?
发布于 2018-01-11 21:48:26
标题问题的简短回答是,将latin1和utf8共同使用的256个字符放入列的CHARACTER SET中是可以的。但是,您必须清楚您使用的是什么编码。否则,®可能会显示为® ("Mojibake")。
不,该SELECT获取该数据库中任何新表的默认值。它不控制列的存储方式。
数据库对新表具有默认设置。
该表对于新列具有默认设置。
该列具有CHARACTER SET的真正定义。
所以,执行SHOW CREATE TABLE并查看列。如果列没有指定字符集,那么查看表的默认值,该表位于输出的末尾。(也有一种从information_schema.COLUMNS获取这些信息的方法,但这更麻烦。)
®是latin1中的十六进制AE或utf8中的C2AE (或utf8mb4)。该字符不存在于"ascii“字符集中,该字符集以7位停止。
但是,由于®同时存在于latin1和utf8中,所以您可以安全地在两个编码之间来回往返。也就是说,如果你告诉MySQL正确的事情。
客户端中的编码在SET NAMES或连接参数中指定。如果客户端具有AE,则必须指定latin1;如果客户端具有C2AE,则必须指定utf8。
同时,列(不是表,也不是数据库)可以是latin1或utf8。如果需要,转换将以您的INSERT和SELECT方式完成。
注意: latin1只有256个不同的编码,没有中文,没有Emoji,几乎什么都没有,只有西欧字符。
接下来,最好定义大多数列utf8mb4。否则,可能会显示一堆-poo () ????。
如果您得到问号、Mojibake等,请咨询Trouble with UTF-8 characters; what I see is not what I stored
https://stackoverflow.com/questions/48211137
复制相似问题