2012-11-14 64 views
0

我将它插入(我们称之为foo)的mysql表为latin1字符编码(通过显示的命令How do I see what character set a MySQL database/table/column is?显示),我的数据库在显示后有以下结果变量:拉丁语1字符集表不是编码拉丁语中的字符编码

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

在富我有存储在与所述串foo®一个varchar(255)山口的条目,并且当我在十六进制查看它表明它是在UTF8(666F6FC2AE)编码。从mysql提示符运行选择查询显示我foo®。但是,当我插入相同的字符串编码在latin1 666F6FAE我得到一个foo ,当我在同一个mysql命令提示符下运行一个选择。为什么我在我的latin1表中使用utf8编码的数据,为什么我无法将latin1编码的数据插入到我的表中?

回答

0

你的命令行客户端似乎使用UTF-8来显示/输入/输出。 666F6FC2AE不是拉丁语-1列中的UTF-8编码值,而是“foo”的拉丁语-1代码。从CLI返回数据库,您的CLI将latin-1数据解释为UTF-8,并显示“foo®”。

举例说明:

  • CLI在UTF-8
  • 操作输入 “foo®” 的CLI,这是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,这可能会更不方便/导致更多的副作用。