当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL插入问号而不是unicode字符

勾喜
2023-03-14
SAVEPOINT "DAO"
LOG:  execute <unnamed>: insert into foo values ($1,$2,$3)
DETAIL:  parameters: $1 = '23', $2 = '34bcb5f2-e7ee-40cf-9103-f2d1bf2ac7acd853d7c6-1703-44d2-aa99-6fd1df84da37', $3 = 'Anyone-日本語_l'
23 | 34bcb5f2-e7ee-40cf-9103-f2d1bf2ac7acd853d7c6-1703-44d2-aa99-6fd1df84da37 | Anyone-???_l

我的第一个猜测是,这是一个数据库配置问题,但我已经确认(尽我所知),Postgres确实通过执行以下操作来接受UTF-8:

SHOW server_encoding;
server_encoding
-----------------
UTF8
(1 row)

SHOW client_encoding;
client_encoding
-----------------
UTF8
(1 row)

我还通过手动向数据库中插入一个条目进一步证实了这一点:

INSERT INTO foo values(25, ‘the_id’, ‘ΑΒΓΔΕΖΗΘ’);
INSERT 0 1
25 | the_id | ΑΒΓΔΕΖΗΘ

从上面可以理解,数据库已经接受了我的值,并且已经成功地将Unicode字符添加到数据库中。

jdbc:postgresql://localhost/bar?useUnicode=yes&characterEncoding=UTF-8

我排除了应用程序的代码,因为它是一个非常大的项目的一部分,并且相关的部分在这里和那里是支离破碎的。但是,我认为它们与问题无关,因为Postgres日志清楚地显示了它接收到的参数。

查询和数据库接收的unicode数据是正确的,那么是什么导致了这个问题呢?

OS: RHEL 6.6
Postgres version: 9.3.5
JDBC Connector: Tried a couple (8.1, 9.3)
JRE: 1.7

数据库确实需要UTF-8:

psql -U postgres -h localhost --list

Name      |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
----------------+----------+----------+-------------+-------------+--------------
bar       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
SELECT foo_name::bytea FROM foo;

foo_name
--------------------------
\x416e796f6e652d3f3f3f5f6c

数据库中其实已经插入了问号:

SELECT * FROM foo WHERE foo_name LIKE 'Anyone-?%'
23 | 34bcb5f2-e7ee-40cf-9103-f2d1bf2ac7acd853d7c6-1703-44d2-aa99-6fd1df84da37 | Anyone-???_l

我还抓取了我的一个测试的字节序列,该测试是由JDBC控制器生成的,然后将其提供给PGStream。

{65, 110, 121, 111, 110, 101, 45, -26, -105, -91, -26, -100, -84, -24, -86, -98, 95, 105}

我通过执行以下操作(在独立应用程序中)将其转换为UTF-8字符串:

String result = new String(bytes, StandardCharsets.UTF_8);

共有1个答案

公西俊德
2023-03-14

在深入研究遗留代码之后,我发现并修复了这个问题。

数据库层工作得很好;当系统试图使用ByteArrayInputStream将相同的值重新插入数据库时发生问题。

通过在包含foo_name的字符串中执行getBytes()填充ByteArrayInputStream。但是,在调用此方法时应定义UTF-8编码。

通过更改:

String name = "日本語";
InputStream is = new ByteArrayInputStream(name.getBytes());

致:

String name = "日本語";
InputStream is = new ByteArrayInputStream(name.getBytes(StandardCharsets.UTF_8));
 类似资料:
  • 在我的生产级应用程序中,我正在研究一些与unicode字符相关的问题,比如中文/日语字符串。 我的应用程序有一个启动程序和一个配置文件,它设置了运行JVM可以使用的所有参数。此配置文件作为命令行参数的一部分传递。 所以我创建了一个小程序来测试这个场景,该程序的工作是将一个文件路径作为命令行参数的一部分,打印它并读取该文件的内容。在运行之前,它看起来与上面类似,即“some/path/和/????.

  • 我需要在html页面上插入一个欧米茄(欧米茄)。我使用它的HTML转义代码来实现这一点,因此我可以编写并获得?。当我将它放入HTML元素中时,这一切都很好;但是,当我尝试将其放入我的JS中时,例如时,它将代码解析为JS,整个过程无法运行。有人知道怎么做吗?

  • 问题内容: 我有一个将某些变量插入数据库的MySQL语句。我最近添加了两个可选字段($ intLat,$ intLng)。现在,如果未输入这些值,我将传递一个空字符串作为值。如何将明确的NULL值传递给MySQL(如果为空)? 问题答案: 要将NULL传递给MySQL,只需执行此操作。 因此,在您的代码中,检查是,如果是,请使用代替或。

  • 问题内容: 我从一些python任务开始,使用gensim时遇到问题。我正在尝试从磁盘加载文件并进行处理(将它们分开并用lowercase()对其进行处理) 我的代码如下: 列表(dictionary_arr)包含所有文件中所有单词的列表,然后使用gensim corpora.Dictionary处理该列表。但是我遇到了一个错误。 我无法理解有什么问题,需要一些指导。 问题答案: 在diction

  • 问题内容: 我在使用SQL时遇到了一些问题。我正在尝试在表中插入2个值。 那就是我的查询:INSERT INTO tableinfo(table,date)VALUES(’Sell’,’August‘24’); 但它不起作用。我有类似的东西: 这是非常基本的,所以我不知道为什么它不起作用:( PostgreSQL 9.2.4 问题答案: 问题不是出自INSERT,而是您要发出的无效SQL。首先尝试

  • 如果有人知道是怎么回事,请帮忙。我已经尝试了我在互联网上找到的所有东西,但到目前为止都无济于事。出于某种原因,在idea中启动项目时,页面上显示的是问号而不是俄语字母 我已经尝试过: > 我确保windows控制台以866响应chcp请求,我读到最好设置此值 同样在区域标准设置中,在选项卡中,我还单击了“更改系统语言”按钮,然后取消选中“测试版:使用 Unicode (UTF-8) 支持全球语言”