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

Posted

技术标签:

【中文标题】clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?【英文标题】:clojure jdbc postgres: Why do the results from my query return unicode characters in table names as �?clojure jdbc postgres:为什么我的查询结果将表名中的 unicode 字符返回为 �? 【发布时间】:2013-06-27 22:07:17 【问题描述】:

我的表名是 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 上。

【问题讨论】:

这可能与您上一个问题中的问题/错误相同。 (这也可能是 clojure 驱动程序中的错误,但我怀疑根据您发现的 PG 错误不太可能。)参考链接:***.com/questions/17353469/… .... 以及您的 Java、PostgreSQL 和 PgJDBC 版本?数据库编码是什么(SHOW server_encoding)? 哦,你用什么来显示结果? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

这可能涉及编写驱动程序测试用例、使用替代客户端来现场检查数据等。

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

您应该检查 字符代码 以找出结果中不正确的字符 - 实际的二进制数据。看看它们是否对应正确的代码。如果他们不这样做,那么他们变成的代码可能是您遇到的编码问题类型的有力线索。

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

【讨论】:

以上是关于clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?的主要内容,如果未能解决你的问题,请参考以下文章

clojure/java.jdbc 和 postgres:Prepared statments 比字符串连接查询慢 100 倍?

clojure连接postgres

在 clojure.jdbc 和 postgres 中使用保存点进行测试的嵌套事务

java.jdbc clojure 执行!插入数量

Clojure PostgreSQL JDBC执行查询时不断出错

Clojure - Postgres没有找到合适的司机