SQL查询生成未定义的字符映射

2024-09-27 21:28:52 发布

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

这是我正在运行的代码,firebird数据库中的SELECT命令

我希望将某个表的内容写入.txt文件:

import fdb
con = fdb.connect(dsn=defaultDSN, user=defaultUser, password=defaultPassword)
cur = con.cursor()

cur.execute("SELECT * FROM TableName")

#I'm aware this erases everything in the file, this is intended
file = open(file="FirebirdMirror.txt", mode="w+", encoding='utf-8', errors='ignore')
file.write('')

file = open(file="FirebirdMirror.txt", mode="a+", encoding='utf-8', errors='ignore')

for fieldDesc in cur.description:
    file.write(fieldDesc[fdb.DESCRIPTION_NAME] + ', ')

file.write("\n")

for x in list(list(str(cur.fetchall()))):
    for y in x:
        file.write(str(y) + ', ')
    file.write('\n')


file.close()

我不知道为什么,但是我的cur.fetchall()返回了一些外来的东西

Traceback (most recent call last):
  File "C:/Users/graciele.davince/PycharmProjects/helloworld/venv/firebirdSQL.py", line 205, in <module>
    generate_text_file()
  File "C:/Users/graciele.davince/PycharmProjects/helloworld/venv/firebirdSQL.py", line 166, in generate_text_file
    for x in list(list(str(cur.fetchall()))):
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3807, in fetchall
    return [row for row in self]
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3807, in <listcomp>
    return [row for row in self]
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3542, in next
    row = self.fetchone()
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3759, in fetchone
    return self._ps._fetchone()
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 3412, in _fetchone
    return self.__xsqlda2tuple(self._out_sqlda)
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 2843, in __xsqlda2tuple
    value = b2u(value, self.__python_charset)
  File "C:\Users\graciele.davince\PycharmProjects\helloworld\venv\lib\site-packages\fdb\fbcore.py", line 486, in b2u
    return st.decode(charset)
  File "C:\Users\graciele.davince\AppData\Local\Programs\Python\Python38-32\lib\encodings\cp1252.py", line 15, in decode
    return codecs.charmap_decode(input,errors,decoding_table)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 3234: character maps to <undefined>

我的数据库可能包含来自巴西葡萄牙语的某些字符,即:

ç,ô,ô,õ,ô,ô,ô,ô,ô,ô,ô,ô,ô,ô,ô,ô

从我谷歌搜索的内容来看,它与文本如何以位的形式存储有关,而0x9d位所代表的字符似乎就是问题所在

我正在使用errors='ignore',但错误仍然会出现,使用encoding='utf-8',我还尝试了latin-1、IsonumbersNumber、windows1252和其他一些,但都没有用

  • 约束:我不能使用任何命令来更改表的内容,我必须将其中的所有内容存储在.txt文件中

ps.:同一行中的列必须用逗号分隔,每行必须用分隔符分隔\n


编辑:

Mark的解决方案奏效了——但我想补充一点,检查数据库的方言是个好主意


Tags: inpyvenvlibpackageslinesiteusers
1条回答
网友
1楼 · 发布于 2024-09-27 21:28:52

错误发生在与Firebird通信时,而不是从文本文件读取时,因此errors="ignore"指令未应用

可能需要显式指定连接字符集(例如UTF8),以便FDB不使用连接字符集NONE,这将应用默认编码(在您的示例中为Cp1252)

相关问题 更多 >

    热门问题