我无法在PostgreSQL 8.4中使用Hibernate 3.6.10将特殊字符(例如欧元符号(€))写入LOB字符串属性.
我所知道的是PostgreSQL提供了两种不同的方法来将大字符对象存储在表的一列中.它们可以直接存储到该表列中,也可以间接存储在单独的表中(实际上称为pg_largeobject).在后一种情况下,该列保存对pg_largeobject中行的引用(OID).
Hibernate 3.6.10中的默认行为是间接OID方法.但是,可以在Lob属性中添加额外的注释@ org.hibernate.annotations.Type(type ="org.hibernate.type.TextType")以获取直接存储行为.
两种方法都可以正常工作,除了我想要使用特殊字符(如欧元符号(€))的那一刻.在这种情况下,直接存储机制继续工作,但间接存储机制中断.
我想以一个例子来证明这一点.我创建了一个带有2个@Lob属性的测试实体.一个遵循直接存储原则,另一个遵循间接存储:
@Basic
@Lob
@Column(name = "CLOB_VALUE_INDIRECT_STORAGE", length = 2147483647)
public String getClobValueIndirectStorage()
Run Code Online (Sandbox Code Playgroud)
和
@Basic
@Lob
@org.hibernate.annotations.Type(type="org.hibernate.type.TextType")
@Column(name = "CLOB_VALUE_DIRECT_STORAGE", length = 2147483647)
public String getClobValueDirectStorage()
Run Code Online (Sandbox Code Playgroud)
如果我创建一个实体,使用欧元符号填充这两个属性,然后将其保存到数据库中当我执行SELECT时看到以下内容我看到
id | clob_value_direct_storage | clob_value_indirect_storage
----+---------------------------+----------------------------
6 | € | 910579
Run Code Online (Sandbox Code Playgroud)
如果我然后查询表pg_largeobject我看到:
loid | pageno | data
--------+--------+------
910579 | 0 | \254
Run Code Online (Sandbox Code Playgroud)
pg_largeobject的'data'列的类型为bytea,这意味着信息存储为原始字节.表达式'\ 254'表示一个单字节,而UTF-8表示字符'¬'.这正是我从数据库加载实体时得到的值.
UTF-8中的欧元符号由3个字节组成,因此我希望'data'列有3个字节而不是1个字节.
这不仅适用于欧元符号,也适用于许多特殊字符.这是Hibernate中的问题吗?还是JDBC驱动程序?有没有办法可以调整这种行为?
在此先感谢,
亲切的问候,
Franck de Bruijn
我一直在谷歌搜索超过2个小时,但我真的很困惑这个.
我想PostgreSQL(我在Debian上使用的是8.4版本)开始只记录慢速查询.
为此,我在以下配置中使用postgresql.conf:
log_destination = 'csvlog'
logging_collector = on
log_min_messages = log
log_min_duration_statement = 1000
log_duration = on
log_line_prefix = '%t '
log_statement = 'all'
Run Code Online (Sandbox Code Playgroud)
配置的其余部分都是默认设置(已注释掉).日志记录有效,但它会记录所有语句,甚至是低于1000(ms)阈值的语句.如果我执行'全部显示',我会看到所有设置都有效.我也试过重启Postgres.
我希望有人可以帮助我.