请看以下场景;
my_db=# select version();
version
------------------------------------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.9 on x86_64-pc-linux-gnu (Debian 9.6.9-2.pgdg90+1), compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit
CREATE TABLE binary_data ("data" BYTEA NOT NULL);
CREATE OR REPLACE FUNCTION random_string(lengh integer)
RETURNS varchar AS $$
SELECT array_to_string(ARRAY(
SELECT substr('abcdefghijklmnopqrstuv',trunc(random()*21+1)::int,1)
FROM generate_series(1,$1)),'')
$$ LANGUAGE sql VOLATILE;
insert into binary_data ("data") select CONVERT_TO(random_string(64), 'utf8') FROM generate_series(1,1000000);
现在,如果我们运行以下查询,它会非常有效;
select CONVERT_FROM(data, 'utf8') from binary_data where "data" like '%me%' limit 10;
如果我们运行以下查询;
select CONVERT_FROM(data, 'utf8') from binary_data where "data" like CONCAT('%', 'me', '%') limit 10;
它失败并出现以下错误
Kernel error: ERROR: operator does not exist: bytea ~~ text
无法理解'%me%'
和之间有什么区别CONCAT('%', 'me', '%')
。
第一个猜测是类型必须不同才能检查我运行的:
SELECT pg_typeof('%me'), pg_typeof(CONCAT('%', 'me', '%'));
是的,我的猜测是正确的;
unknown text
所以 '%me%' 被视为unknown
并被CONCAT('%', 'me', '%')
视为text
. 使用相同的查询CONCAT('%', 'me', '%')::UNKNOWN
结果导致另一个错误。
Kernel error: ERROR: failed to find conversion function from unknown to bytea
任何人都知道上述查询出了什么问题?