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

时间:2018-01-11 15:57:50

标签: mysql utf-8 character-encoding

我在默认字符集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中。混合这种字符集的后果是什么?

1 个答案:

答案 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。如果需要,转换将以INSERTSELECT完成。

警告:latin1只有256种不同的编码,没有中文,没有表情符号,除西欧字符外几乎没有。

展望未来,最好定义大多数列utf8mb4。否则,可能会显示一堆便便(){。}}。

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