SQL 查询生成未定义的字符映射
SQL query generates undefined charmap
这是我 运行 的代码,是 firebird 数据库中的 SELECT 命令。
我想把某个table的内容写到.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() returns 一些外星人...
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、ISOnumbersnumbers、windows1252 和其他一些, 但无济于事。
- 约束: 我不能使用任何命令来更改我的 table 的内容,我必须将其中的所有内容存储在一个 .txt 文件中.
ps.: 同一行的列必须用逗号分隔,每行之间必须用\n
分隔
编辑:
Mark 的解决方案有效 - 但我想补充一点,检查您的数据库使用的方言是个好主意。
错误发生在与 Firebird 通信时,而不是从您的文本文件中读取时,因此未应用 errors="ignore"
指令。
可能您需要明确指定连接字符集(例如 UTF8),因此 FDB 不使用连接字符集 NONE,它应用默认编码(在您的情况下为 Cp1252)。
这是我 运行 的代码,是 firebird 数据库中的 SELECT 命令。
我想把某个table的内容写到.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() returns 一些外星人...
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、ISOnumbersnumbers、windows1252 和其他一些, 但无济于事。
- 约束: 我不能使用任何命令来更改我的 table 的内容,我必须将其中的所有内容存储在一个 .txt 文件中.
ps.: 同一行的列必须用逗号分隔,每行之间必须用\n
分隔编辑:
Mark 的解决方案有效 - 但我想补充一点,检查您的数据库使用的方言是个好主意。
错误发生在与 Firebird 通信时,而不是从您的文本文件中读取时,因此未应用 errors="ignore"
指令。
可能您需要明确指定连接字符集(例如 UTF8),因此 FDB 不使用连接字符集 NONE,它应用默认编码(在您的情况下为 Cp1252)。