python - 从 SQL Server 到 Postgres 的 '😕' 上的 SQLAlchemy UnicodeEncodeError

标签 python sql-server postgresql unicode sqlalchemy

正在使用 SQLAlchemy 从 SQL Server 数据库的 nvarchar 列中获取一些文本,然后将其写入列类型为 character varying 的 Postgres 数据库。当源数据包含字符 😕 时,Python 抛出以下异常:

UnicodeEncodeError: 'utf-8' codec can't encode character '\ud83d'
in position 34: surrogates not allowed

SQLAlchemy 列类型设置为 String。我尝试将列类型设置为 Unicode 并将列排序规则分别设置为 SQL_Latin1_General_CP1_CI_AS,但没有成功。使用的驱动程序是 FreeTDS。

为什么 Python 不能对这个字符串进行编码?问题出在我们使用 SQLAlchemy、Python 或 Postgres 上吗?这个错误让我 😕。

最佳答案

代码点\U1f615 (😕) 可以由两个代理项\ud83d 和\ude15 表示。不知何故,您的内部使用 UTF16 的 SQL-Server 被解码为 UCS2,因此代理无法正确解码。所以问题是SQL-Server。 如果无法正确读取数据,则必须手动更正 unicode 字符串,如下所示 (python3):

def surrogate_to_unicode(sur):
    a, b = sur
    return chr(0x10000 + ((ord(a)-0xd800)<<10) + (ord(b)-0xdc00))

text = '\ud83d\ude15'
text = re.sub('[\ud800-\udbff][\udc00-\udfff]', lambda g:surrogate_to_unicode(g.group(0)), text)

关于python - 从 SQL Server 到 Postgres 的 '😕' 上的 SQLAlchemy UnicodeEncodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137411/

相关文章:

sql - 对多行为Document表数据库设计的看法

postgresql - 如何列出表的所有锁定行?

python - 从 raw_input() 读取输入,而不会让 Python 中的其他线程覆盖提示符

python - 如何根据系列值从 DataFrame 中删除行

sql-server - SQL Server Management Studio Pane 设置,始终显示图表 Pane 、条件 Pane 和 SQL Pane

sql-server - 在 SQL Server 中以 XML 数据类型存储存储过程的文本

ruby - 在 Ruby 中创建和访问 Postgres(没有 Rails)

python - 这个 pythonic 技巧是如何工作的:a[::-1]

python - 如何校正和识别图像中的短文本

sql - 使用 SQL Server POWER 函数将负基数提高到十进制幂