【问题标题】:Python SQL Statements with Greek Letters and UTF-8带有希腊字母和 UTF-8 的 Python SQL 语句
【发布时间】:2019-05-26 15:41:17
【问题描述】:

版本: PostgreSQL = 11.3 Python = 3.7.3

我有一个 python 脚本,它从网络收集数据并将其存储在数据库中以供进一步分析。

下面的 sql 语句在尝试比较从 Web 获取的变量与数据库中已经存在的变量时总是返回 false。我认为这是因为变量的编码不匹配而发生的。

例如,变量 = Σ1,而 Σ1 已经存在于数据库中,所以下面的 sql 语句应该返回 TRUE 而不是返回 FALSE。

cur.execute("SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = %s)", (variable,))

当我运行“cur.query”时,它显示正在执行以下查询:

b"SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = '\xce\xa31')"

在 pgadmin4 中,变量正确存储为 Σ1。如果我直接在 pgadmin4 中使用“Σ1”运行上面的 sql 查询,它会按预期返回 true。 但是,当我从 python 脚本查询该变量是否已存在于数据库中时,它会返回 false,因为它将数据库中的“Σ1”与 sql 查询中的“\xce\xa31”进行比较。

当我运行“show CLIENT_ENCODING;”时在 pgadmin4 中显示“UTF8”,当我在脚本中的 sql 语句之前立即打印“print(conn.encoding)”时,它也显示“UTF8”。

我哪里出错了?

【问题讨论】:

    标签: python sql postgresql pgadmin-4


    【解决方案1】:

    如果我这样做:

    >>> b"SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = '\xce\xa31')".decode("utf-8")
    "SELECT EXISTS(SELECT 1 FROM table_name WHERE column_name = 'Σ1')"
    

    这表明你没有做错任何事。您看到的查询显示为 UTF-8 字节,但它与您想要的 Unicode 查询完全相同。我怀疑数据库中的希腊符号不是完全您的select 期望找到的。这可能是因为实际上有几个 Unicode sigma 符号:U+03A3、U+2211 和一些others besides

    【讨论】:

    • 正如您正确指出的那样,查询是正确的,并且问题原来是代码不同部分中的逻辑相关问题。感谢您花时间回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2013-08-14
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2017-10-06
    相关资源
    最近更新 更多