如何使用ascii字符查询unicode数据库

2024-10-04 07:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在我的postgresql数据库上运行一个查询,它忽略了德语字符-umlauts。但是,我不想丢失这些字符,而是希望在查询的输出中使用德语字符或至少它们的等效字符(例如äae)。运行Python 2.7.12

当我将encode对象更改为replacexmlcharrefreplace时,我得到以下错误:

psycopg2.ProgrammingError: syntax error at or near "?"
LINE 1: ?SELECT

代码段:

^{pr2}$

如何将查询作为带德语字符的unicode对象传递? 我还尝试将查询解码为utf-8,但随后出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

Tags: 对象in数据库postgresql错误error字符psycopg2
2条回答

您只需要conn.set_client_encoding("utf-8"),然后就可以执行unicode字符串-sql,结果将被实时编码和解码:

$ cat psycopg2-unicode.py
import sys
import os
import psycopg2
import csv

with psycopg2.connect("") as conn:
    conn.set_client_encoding("utf-8")
    for filename in sys.argv[1:]:
        file = open(filename, "r", encoding="utf-8")
        sql = file.read()
        with conn.cursor() as cursor:
            cursor.execute(sql)
            try:
                rows = cursor.fetchall()
            except psycopg2.ProgrammingError as err:
                # No results
                continue
            with open(filename+".out", "w", encoding="utf-8", newline="") as outfile:
                csv.writer(outfile, dialect="excel-tab").writerows(rows)

$ cat sql0.sql
create temporary table t(v) as
    select 'The quick brown fox jumps over the lazy dog.'
    union all
    select 'Zwölf große Boxkämpfer jagen Viktor quer über den Sylter Deich.'
    union all
    select 'Любя, съешь щипцы, — вздохнёт мэр, — кайф жгуч.'
    union all
    select 'Mężny bądź, chroń pułk twój i sześć flag.'
;

$ cat sql1.sql
select * from t;

$ python3 psycopg2-unicode.py sql0.sql sql1.sql

$ cat sql1.sql.out 
The quick brown fox jumps over the lazy dog.
Zwölf große Boxkämpfer jagen Viktor quer über den Sylter Deich.
Любя, съешь щипцы, — вздохнёт мэр, — кайф жгуч.
Mężny bądź, chroń pułk twój i sześć flag.

这个程序的Python2版本稍微复杂一些,因为我们需要告诉驱动程序,我们希望返回值作为unicode对象。另外,我用于输出的csv模块不支持unicode,所以需要一个变通方法。这里是:

^{pr2}$

这里有一个解决方案来获得它们的编码等价物。您可以稍后重新编码,查询不会创建错误:

SELECT convert_from(BYTEA 'foo ᚠ bar'::bytea, 'latin-1');
+        +
| convert_from   |
|        |
| foo á<U+009A>  bar                |
+        +
SELECT 1
Time: 0.011s

相关问题 更多 >