This does work for strings that don't contain consecutive zeroes. I'm not really passing the string to PostgreSQL, but to Net::LDAP, but it must hit PostgreSQL anyway? Active Directory requires this encoding, so I'm not sure what to do here.
I had some issues, when I used some Perl libraries with UTF strings - some requires, some not UTF flag in string. And Postgres didn't well set thist UTF flag well.
> # select * from doublezero(); > INFO: double00 > CONTEXT: PL/Perl function "doublezero" > ERROR: invalid byte sequence for encoding "UTF8": 0x00 at line 8, <DATA> > line 558. > CONTEXT: PL/Perl function "doublezero" > > I don't understand this. I need to pass $mspass to Active Directory, and it > the encoding is exactly as it should be, which is to say, it works for > strings that don't include two consecutive zeros. Is this a bug?
When replacing the literal "double00" with "foobar" in your function, the same error occurs for me:
test=# select doublezero(); INFO: foobar CONTEXT: PL/Perl function "doublezero" ERROR: invalid byte sequence for encoding "UTF8": 0x00 at line 6. CONTEXT: fonction PL/Perl « doublezero »
Anyway it's not clear what you expect. PG doesn't support UTF-16, and even if it did, it wouldn't accept such strings when the current encoding is UTF-8. If Active Directory wants UTF-16LE, you have to do that conversion, but don't pass the result back to postgres in this format.