使用Postgres 8.4中的映射表更新同一查询中的多个行

时间:2013-11-02 11:47:18

标签: sql postgresql

问题Update multiple rows in same query using PostgreSQL Roman Peckar给出了类似的答案;为了我的问题,我修改了它:

update test as t set
  column_a = c.column_a,
  column_b = c.column_b
from (values
  ('123', bytea1),   
  ('345', bytea2)  
) as c(column_a, column_b) 
where c.column_a = t.column_a;

在我的情况下,表测试有一个bytea类型的列,比如column_b。但是,这不起作用,因为c.column_b属于文本类型,因此产生错误,表示没有从文本到bytea的转换以及提示使用强制转换。好吧,使用强制转换也没有帮助,因为关于编码引用LATIN编码的另一个错误。我为错误的错误报告道歉,但我目前无法访问执行此项工作的计算机。

似乎c.column_b的默认类型是文本。不能在'as'子句中指定列的类型,'作为c(column_a,column_b type bytea)'或以其他方式?如果不是,我认为我必须使用一些二进制字符串函数,这似乎有点不优,至少可以说。

1 个答案:

答案 0 :(得分:1)

因为text类型用于文本。它需要在您的客户端编码中使用正确编码的文本,并且可以在服务器编码中保存而不会丢失数据(例如,latin1没有,因为这样的字符可以不能使用此编码保存。)

因此,如果您需要保存文本,其中包含latin1以外的字符(就像输入到网络表单中的任何内容一样),您需要将数据库编码更改为utf-8。或者,作为最后的手段,请使用encode(data,'base64')