plpython3u破坏执行的编码

发布于 2025-01-17 21:32:28 字数 1409 浏览 0 评论 0原文

环境:

  • 具有 pl_PL 语言环境的 Debian 11(ISO-8859-2)
  • 使用 ISO 8859-2 编码创建的 Postgresql 13 数据库
  • Plpython3u(Python 3.9.2)

问题的一个简单示例:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    plpy.execute("UPDATE table SET field='"+tmp+"' WHERE filter_pointing_at_a_single_row;")
$function$;

当内容为“łódź”时,运行一次结果它被改为“ĂłdĹş”。

我们有数十个甚至数百个函数来执行此类操作。最初的解决方案使用python2,默认编码更改为iso8859-2,但现在是时候升级了,这样的技巧在python3中不起作用。

其他观察结果:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    ret = plpy.execute("SELECT '"+tmp+"' AS \"A\" ;")
    return ret[0]['A']
$function$;

在具有正确客户端编码的 psql 以及强制 utf-8 的 DBeaver 中,它返回“Ĺ‚ĂłdĹş”。

同时:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    return tmp 
$function$;

在 DBeaver 和 psql 中都返回“łódź”。

编辑: 我没有提到我需要什么。我们正在寻找最好的解决方案。我们正在考虑将数据库移至 UTF-8,或者如果我们找到其他解决方案,则重写所有需要它的函数。人们还希望存在一些聪明的解决方案,可以最大限度地减少解决此问题所需的工作量。

Environment:

  • Debian 11 with pl_PL locale(ISO-8859-2)
  • Postgresql 13 database created with ISO 8859-2 encoding
  • Plpython3u(Python 3.9.2)

A simple example of the problem:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    plpy.execute("UPDATE table SET field='"+tmp+"' WHERE filter_pointing_at_a_single_row;")
$function$;

When the content is 'łódź', running this once results in it being changed to 'Ĺ‚ĂłdĹş'.

We have tens if not hundreds of functions that perform operations like that. The original solution used python2 with default encoding changed to iso8859-2, but it's time to upgrade and such trick won't work in python3.

Other observations:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    ret = plpy.execute("SELECT '"+tmp+"' AS \"A\" ;")
    return ret[0]['A']
$function$;

In psql with correct client-encoding as well as in DBeaver which forces utf-8 it returns 'Ĺ‚ĂłdĹş'.

Meanwhile:

CREATE OR REPLACE FUNCTION public.test()
 RETURNS TEXT
 LANGUAGE plpython3u
AS $function$
    tmp = plpy.execute("SELECT field FROM table WHERE filter_pointing_at_a_single_row;")[0]['field']
    return tmp 
$function$;

Returns 'łódź' both in DBeaver and psql.

Edit:
I didn't mention what I need. We're looking for the best solution. We're considering moving the database to UTF-8, or rewriting all the functions that need it if we find other solution. There's also hope that some smart fix exists that would minimise the amount of work needed to solve this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文