PostgreSQL的TEXT字段错误- NHibernate不能读取它
本文关键字:不能 不能读 读取 NHibernate TEXT 字段 错误 PostgreSQL | 更新日期: 2023-09-27 18:10:38
我有这个实体:
public class Product
{
public virtual long ID { get; set; }
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual ProductCategory Category { get; set; }
public virtual byte[] Image { get; set; }
public virtual string IsAvaliableToSell { get; set; }
public virtual DateTime InsertDate { get; set; }
public virtual DateTime UpdateDate { get; set; }
}
使用Map类:
public ProductMapping()
{
[...]
Map(model => model.Image, "fldProductImage")
.Insert()
.Update()
.Nullable()
.CustomType("Text");
[...]
}
当我试图检索添加到数据库中的产品时,我得到了一个错误:
无法强制转换"System"类型的对象。字符串'到类型'系统。Byte[]"。
应该在我的Image属性中。有人知道发生了什么吗?
对于原因的可能解释是text
类型有一些bytea
没有的限制和要求:
-
text
不能存储空字节,因为系统使用以空结尾的字符串;如果您提交的字节字符串abcd'x00efgh
(其中'x00
是一个空字节),DB将存储abcd
。 -
text
要求数据在客户端的文本编码中是有效的。当从客户机发送到服务器时,数据被解释为在client_encoding中,并在需要时转换为服务器的文本编码。如果不需要转换,则仍然有效。
所以,如果你把一堆字节塞进一个文本字符串,你会得到截断的乱码。如果您的客户端使用不同的编码,那么由于编码转换问题,您也可能在获取数据时出现错误。
bytea
不关心数据的编码是什么,因为它对服务器来说只是原始字节。不执行转换。因为它是以转义形式发送的,所以它可以包含空字节。您应该始终将二进制数据存储为bytea
或使用大对象(请参阅lo
扩展)。唯一的另一种选择是将其转换为一些文本安全的表示形式,如base64
,但这很少适用于bytea
字段。
将TEXT字段类型更改为BYTEA类型解决了我的问题。