当前位置: 首页 > 知识库问答 >
问题:

MySQL“set names latin1”似乎导致数据存储为utf8

殳凯捷
2023-03-14

我有一个表定义如下:

mysql> show create table temptest;
+------------+-----------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                  |
+------------+-----------------------------------------------------------------------------------------------------------+
| temptest | CREATE TABLE `temptest` (
  `mystring` varchar(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+------------+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
insert into temptest values ("é");
mysql> select hex(mystring) from temptest;
+---------------+
| hex(mystring) |
+---------------+
| E9            |
+---------------+

但是如果我发出一个“set names latin1”并执行相同的操作,我会看到它以utf8编码存储相同的字符。

mysql> set names latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into temptest values ("é");
Query OK, 1 row affected (0.01 sec)

mysql> select hex(mystring) from temptest;
+---------------+
| hex(mystring) |
+---------------+
| E9            |
| C3A9          |
+---------------+

据我所知,“set names”不应该影响mysql存储数据的方式(https://dev.mysql.com/doc/refman/8.0/en/set-names.html)。我错过了什么?对此的任何见解都将非常感谢。谢谢你。

共有1个答案

景星光
2023-03-14
  1. Set NAMES Latin1声明客户端中的编码为Latin1。
  2. 但(显然)它实际上是UTF8。
  3. 因此,当您键入é时,客户端将生成2个字节C3 A9
  4. 则这些文件将像latin1一样发送到服务器(mysqld)
  5. 服务器说:“哦,我正在获取一些latin1字节,我将把它们放入latin1列中,所以我不需要对它们进行转换。
  6. 在go中有两个latin1字符(十六进制C3A9)。这叫做mojibake。
  7. 如果您设置名称utf8选择文本,您将“看到”并且它将是4个字节(十六进制C383C2A9)!

底线:您的客户机编码实际上是utf8,因此您应该说设置名称utf8(或utf8mb4)。困惑?欢迎来到俱乐部。

 类似资料:
  • 我在我的Github帐户上有一个存储库,我从官方存储库中派生了这个存储库。 然后我在我的本地机器上克隆了它。它工作得很好。我创建了几个分支(在分支下)。我做了几次提交,它工作得很好。 当我这样做时,我不知道我是如何得到以下错误的: 如何在不影响Github上的存储库的情况下解决此错误? 我正在使用 我的<代码>的内容。git/config在执行cat$(git rev parse-show top

  • 我不能在我的服务课上用我的积垢。我可以创建存储库,但当我将其自动连接到我的服务类时,会出现以下错误: com中构造函数的参数0。测验服务testService需要“com”类型的bean。测验存储库。找不到TestRepository“”。 行动: 考虑定义COM类型的bean。测验存储库。配置中的TestRepository。 这对许多人来说似乎是一个大问题。我尝试了各种东西,如@Compone

  • 我不确定我的配置有什么问题,但据我所知,它应该是正确的,尽管spring宣布没有这样的bean定义。我证实了以下几点: null POM: 编辑:从pom中删除spring-data-jpa-starter并重新插入它之后,似乎它现在自动设置密码编码器也有问题。spring在自动驾驶方面的做法是否存在一个普遍的问题?

  • 防止在ASP.NET MVC中对使用属性的特定操作进行缓存 ASP.NET MVC如何禁用自动缓存选项?

  • 我有两个公共存储库:和: 当我尝试从公共存储库peterI获取最新代码时,出现以下错误: 存储库肯定存在:。我需要配置哪些访问权限?也许是关于权限的?谢谢。 更新1。我尝试了特雷弗·特雷西在他的回答中提出的建议,但没有成功: 更新2。我去看了文件. git\config,这是我在该文件末尾看到的: 公共存储库ssh://manuelM@示例。net/~ peterI/public\u html/p

  • 问题内容: 我认为这是一个n00b要做的事情。因此,我从未做到过。然后,我看到FriendFeed做到了这一点,实际上使他们的数据库扩展性更好,并减少了延迟。我很好奇我是否应该这样做。而且,如果是这样,正确的方法是什么? 基本上,什么地方是学习如何将MySQL中的所有内容存储为CouchDB类数据库的好地方?将所有内容存储为JSON似乎会变得更加轻松快捷(无需构建,延迟更短)。 此外,是否容易编辑