clojure jdbc postgres:为什么我的查询结果会将表名中的unicode字符返回为?

时间:2013-06-27 22:07:17

标签: postgresql jdbc unicode clojure

我的表名是pinkƒpink1,当我选择

   (sql/with-query-results res
     "select pinkƒpink1.growth555 as pinkƒpink1$growth555, pinkƒpink1.status_id as pinkƒpink1$status_id, pinkƒpink1.status_position as pinkƒpink1$status_position, pinkƒpink1.i1l0 as pinkƒpink1$i1l0, pinkƒpink1.f∆ as pinkƒpink1$f∆, pinkƒpink1.env_id as pinkƒpink1$env_id, pinkƒpink1.position as pinkƒpink1$position, pinkƒpink1.created_at as pinkƒpink1$created_at, pinkƒpink1.locked as pinkƒpink1$locked, pinkƒpink1.updated_at as pinkƒpink1$updated_at, pinkƒpink1.id as pinkƒpink1$id from pinkƒpink1 as pinkƒpink1 where pinkƒpink1.id in (select * from (select pinkƒpink1.id from pinkƒpink1 order by pinkƒpink1.position asc) as _conditions_) order by pinkƒpink1.position asc"
     (doall res))

结果全都搞砸了:

{:pink�pink1$id 1, :pink�pink1$status-position 0, :pink�pink1$updated-at #inst "2013-06-27T21:58:01.711000000-00:00", :pink�pink1$status-id 1, :pink�pink1$growth555 1.3333388822M, :pink�pink1$env-id 1, :pink�pink1$i1l0 YELLL, :pink�pink1$position 0, :pink�pink1$created-at #inst "2013-06-27T21:58:01.712084000-00:00", :pink�pink1$f∆ 55555, :pink�pink1$locked false}

知道发生了什么事吗?我在OSX 10.8.2上。

2 个答案:

答案 0 :(得分:1)

在将关键字打印到屏幕时,repl似乎可能会破坏名称。 也许您可以尝试将结果吐出到文件中,并在编辑器中打开它,并使用您信任的unicode支持。

您也可以尝试在查询中设置:keywordize-keys false以阻止此转换

答案 1 :(得分:0)

这是编码不匹配或已解码/编码已编码数据的解码的经典标志。

当您处理编码问题时,您必须逐步跟踪正在发生的事情。我担心这真的很烦人。您需要确定编码转换完成的每个点,并找到破坏数据或错误解释数据的那个点。

这可能涉及编写驱动程序测试用例,使用备用客户端来原位检查数据等。

另一种可能性是结果很好,但是用于显示结果的工具没有合适的字体;它缺少字符的字形,因此它们显示为占位符。

您应该检查结果中错误字符的字符代码 - 实际的二进制数据。看看它们是否符合正确的代码。如果他们不这样做,那么他们所使用的代码就可以成为您所遇到的编码问题的强有力线索。

最常见的问题是编码已经-utf-8文本,好像它是另一种编码,如iso-8859-1(“latin-1”),但这产生了一个特征签名,这个问题没有。如果这是一个编码问题,那么这个问题更可能是1字节编码不匹配,比如将iso-8859-1文本解码为其他1字节编码。我无法识别哪个其他1字节编码(如果这实际上是问题),而没有问题字形的字符代码。