首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在UTF8数据库中存储Latin1文本的后果是什么?

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

Stack Overflow用户
提问于 2018-01-11 15:57:49
回答 1查看 1.5K关注 0票数 5

默认字符集latin1中有mysql数据库。

代码语言:javascript
复制
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中。像这样混合字符的后果是什么?

EN

回答 1

Stack Overflow用户

发布于 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位停止。

但是,由于®同时存在于latin1utf8中,所以您可以安全地在两个编码之间来回往返。也就是说,如果你告诉MySQL正确的事情。

客户端中的编码在SET NAMES或连接参数中指定。如果客户端具有AE,则必须指定latin1;如果客户端具有C2AE,则必须指定utf8。

同时,列(不是表,也不是数据库)可以是latin1或utf8。如果需要,转换将以您的INSERTSELECT方式完成。

注意: latin1只有256个不同的编码,没有中文,没有Emoji,几乎什么都没有,只有西欧字符。

接下来,最好定义大多数列utf8mb4。否则,可能会显示一堆-poo () ????

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48211137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档