这是我的情况:我有一个用于存储电子邮件地址的 PostgreSQL 表,有时电子邮件地址包含地址扩展名[email protected]
,我想创建一个触发器来将没有扩展名的地址存储在另一列中。
- SQL 列:email、email_raw(不带地址扩展)。
- 我尝试使用这个函数和触发器,但它不起作用:
创建或替换函数 strip_addr_extension() 返回触发器为 $$ 开始 如果(NEW.email LIKE'%+%')则 NEW.email_raw := split_part(NEW.email, '+', 1) || '@' || split_part(NEW.email, '@', -1); 别的 NEW.email_raw := NEW.email; 万一; 返回新品; 结尾; $$ 语言 plpgsql; 创建触发器 maddr_email_raw 在 maddr 上插入之前 对于每一行 执行程序strip_addr_extension();
当我插入新记录时,会出现错误:
SQL> 插入 maddr(电子邮件)值('[电子邮件保护]'); 错误:函数 split_part(bytea,unknown,integer) 不存在 第 1 行:选择 split_part(NEW.email,'+',1) ||'@'|| split_part(NE... ^ 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。 查询:选择 split_part(NEW.email,'+',1) ||'@' || split_part(NEW.email,'@',-1) 上下文:PL/pgSQL 函数 strip_addr_extension() 第 4 行赋值
有什么问题?我该如何解决?谢谢。:)
答案1
错误:函数 split_part(bytea,unknown,integer) 不存在
此错误消息表明该email
列的类型为bytea
,通常用于二进制数据。
文本函数不能使用二进制参数,因为它们不能假设一系列字节背后存在具有有效编码(以及哪一个)的文本。
考虑将数据类型更改为text
或动态转换为具有bytea
text
convert_from(string bytea, src_encoding name)
功能。