使用PHP混合MySQL中的UTF8和latin1_bin字段

时间:2011-10-26 14:48:45

标签: mysql encoding mamp

在数据库中,我必须在UTF8中存储名称等,并在latin1_bin中存储哈希值。我打电话给SET NAMES utf8,但我注意到当我尝试阅读时它损坏了latin1字段(我能够写得很好)。这很奇怪,因为如果我理解正确的查询只是发送数据到服务器,而不是接收它。

phpMyAdmin也会显示损坏的数据。

关于我可能做错了什么的任何线索?

(使用MAMP 1.9.6)

编辑:this回答指定这也是用于将数据发送回客户端的字符集。我感到很困惑:如果列的字符集如果被忽略的话,有什么意义呢?

编辑: 摘自列定义:

  `tok` char(64) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `sal` char(16) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
...
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_roman_ci ;

摘自查询:

SELECT tok,sal FROM user WHERE id=4 LIMIT 1

INSERT INTO user (tok, sal) VALUES (x'1387ea0c22277d3000bd23241c357e3a9ba45a2e28f50581d63a73bf785a7458a95cca4de27d0a86588f5bdfa94415d6a255c2c0379ebc2f00dacba03ae6b866', x'8fca28a592c29f245ff0a3ba5f97420c')

3 个答案:

答案 0 :(得分:4)

您应该更改表定义以使用MySql的BINARY类型,这种类型非常适合此类数据:

  

BINARY和VARBINARY类型与CHAR和VARCHAR类似,除外   它们包含二进制字符串而不是非二进制字符串。那   是,它们包含字节字符串而不是字符串。这个   意味着他们没有字符集,排序和比较   基于值中字节的数值。

列定义将变为:

`tok` binary(64) NOT NULL,
`sal` binary(16) NOT NULL,

答案 1 :(得分:-1)

set names ...仅为发送和接收数据设置连接的字符集(仅限客户端!)。它与数据库中字段的编码无关!它仅与您用作数据库客户端的编码有关,例如用PHP。数据库引擎将始终将表中的编码之间的编码转换为set names ...查询中指定的编码。

因此,在表定义中,您只需根据需要为每个字段指定编码,并且不会更改使用set names ...命令的方式 - 它只是保持与以前相同。

答案 2 :(得分:-1)

启用SET NAMESINSERT查询完整,我将SELECT查询更改为:

SELECT BINARY(tok) AS tok, BINARY(sal) AS sal FROM user WHERE id=4 LIMIT 1

即。我将哈希字段转换为二进制。

虽然这有效,但如果有人提供(可能更正确的话)替代方案,我会保持开放。