在数据库中,我必须在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')
答案 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 NAMES
,INSERT
查询完整,我将SELECT
查询更改为:
SELECT BINARY(tok) AS tok, BINARY(sal) AS sal FROM user WHERE id=4 LIMIT 1
即。我将哈希字段转换为二进制。
虽然这有效,但如果有人提供(可能更正确的话)替代方案,我会保持开放。