【发布时间】:2011-12-15 19:23:51
【问题描述】:
在数据库中,我必须将名称等存储在 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')
【问题讨论】:
-
你的哈希列是如何定义的,你的读/写查询是什么样的?
-
@Jon: 更新了列和查询的摘录
-
读取时如何处理传入的值?这应该可以工作:
echo bin2hex(iconv("UTF-8", "ISO-8859-1", $sal)). -
@Jon:如果我尝试这样做,我只会得到空字符串。
-
@Jon:
mb_convert_encoding将其转换为 something,但仍然不是正确的值。