0

我将其插入的 mysql 表(我们称之为 foo)是 latin1 字符编码的(通过显示的命令显示如何查看 MySQL 数据库/表/列是什么字符集?)并且我的数据库在之后具有以下结果显示变量:

| character_set_client                    | latin1                                                                                    |
| character_set_connection                | latin1                                                                                    |
| character_set_database                  | latin1

在 foo 中,我在 varchar(255) col 中存储了一个带有字符串 foo® 的条目,当我以十六进制查看它时,它显示它是以 utf8 (666F6FC2AE) 编码的。从 mysql 提示符运行选择查询会显示 foo®。但是,当我插入以 latin1 666F6FAE 编码的相同字符串时,当我在同一个 mysql 命令提示符下运行选择时,我得到一个 foo。为什么我的 latin1 表中有 utf8 编码的数据,为什么我无法将 latin1 编码的数据插入到我的表中?

4

1 回答 1

0

您的命令行客户端似乎使用 UTF-8 进行显示/输入/输出。666F6FC2AE不是 latin-1 列中的 UTF-8 编码值,它是“foo®”的 latin-1 代码。从数据库中获取它,您的 CLI 将 latin-1 数据解释为 UTF-8,显示“foo®”。

为了显示:

  • CLI 以 UTF-8 运行
  • 您在 CLI 上输入“foo®”,即66 6F 6F C2AE
  • 数据库连接设置为 latin-1
  • 数据库将输入解释为 latin-1,认为您要存储“foo®”
  • 列编码是 latin-1,没问题,数据库存储“foo®”
  • 您从数据库中获取数据,全部为 latin-1,然后返回66 6F 6F C2 AE
  • CLI 将其解释为 UTF-8,显示“foo®”

您需要将连接编码设置为utf8,因为您的客户端发送 UTF-8。那,或者说服您的 CLI 在 Latin-1 中运行,这可能更难/不太方便/导致更多副作用。

于 2012-11-14T16:50:33.170 回答