Hi,
With client_encoding=UTF8 and server_encoding=LATIN1, looks like insert into value with chr(codepoint) bypass encoding conversion , is it expected ? test as below ,
jamet=# delete from testutf8;
DELETE 1
jamet=# show client_encoding;
client_encoding
-----------------
UTF8
(1 row)
jamet=# show server_encoding;
server_encoding
-----------------
LATIN1
(1 row)
jamet=# \d testutf8
Table "public.testutf8"
Column | Type | Collation | Nullable | Default
--------+------------------------+-----------+----------+---------
test | character varying(128) | | |
jamet=# insert into testutf8 values('…');
ERROR: character with byte sequence 0xe2 0x80 0xa6 in encoding "UTF8" has no equivalent in encoding "LATIN1" <<< here it’s expected to see encoding conversion error
jamet=# insert into testutf8 values(chr(226)||chr(128)||chr(166)); <<< here, looks like using chr(codepoint) works, it bypass encoding_conversion ?
INSERT 0 1
jamet=# set client_encoding='LATIN1';
SET
jamet=# show client_encoding;
client_encoding
-----------------
LATIN1
(1 row)
jamet=# show server_encoding;
server_encoding
-----------------
LATIN1
(1 row)
jamet=# select * from testutf8;
test
------
…
(1 row)
jamet=# insert into testutf8 values('…'); <<< here, with client and server same LATIN1, no any encoding conversion , and the data got inserted.
INSERT 0 1
jamet=# select * from testutf8;
test
------
…
…
(2 rows)
jamet=# select encode(test::bytea,'hex') from testutf8; <<< both show same value
encode
--------
e280a6
e280a6
(2 rows)