Python SQL 包含希腊字母和 UTF-8 的语句
Python SQL Statements with Greek Letters and UTF-8
版本:
Postgresql = 11.3
Python = 3.7.3
我有一个 python 脚本,它从 Web 收集数据并将其存储在数据库中以供进一步分析。
下面的 sql 语句在尝试比较从 Web 上获取的变量与数据库中已有的变量时总是 return 为假。我认为发生这种情况是因为变量编码不匹配。
例如,变量 = Σ1,而 Σ1 已经存在于数据库中,因此下面的 sql 语句应该 return TRUE 而不是 returns 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。如果我 运行 上面的 sql 查询直接在 pgadmin4 中使用“Σ1”,它 return 是预期的。
但是,当我从 python 脚本查询以检查该变量是否已存在于数据库中时,它 return 是错误的,因为它正在将数据库中的“Σ1”与数据库中的“\xce\xa31”进行比较sql查询。
当我在 pgadmin4 中 运行 "show CLIENT_ENCODING;" 它显示 "UTF8" 并且当我在我的脚本中的 sql 语句之前打印 "print(conn.encoding)" 它也显示"UTF8".
我哪里错了?
如果我这样做:
>>> 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.
版本: Postgresql = 11.3 Python = 3.7.3
我有一个 python 脚本,它从 Web 收集数据并将其存储在数据库中以供进一步分析。
下面的 sql 语句在尝试比较从 Web 上获取的变量与数据库中已有的变量时总是 return 为假。我认为发生这种情况是因为变量编码不匹配。
例如,变量 = Σ1,而 Σ1 已经存在于数据库中,因此下面的 sql 语句应该 return TRUE 而不是 returns 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。如果我 运行 上面的 sql 查询直接在 pgadmin4 中使用“Σ1”,它 return 是预期的。 但是,当我从 python 脚本查询以检查该变量是否已存在于数据库中时,它 return 是错误的,因为它正在将数据库中的“Σ1”与数据库中的“\xce\xa31”进行比较sql查询。
当我在 pgadmin4 中 运行 "show CLIENT_ENCODING;" 它显示 "UTF8" 并且当我在我的脚本中的 sql 语句之前打印 "print(conn.encoding)" 它也显示"UTF8".
我哪里错了?
如果我这样做:
>>> 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.