更新:真正的问题是MySQL utf8不支持四字节UTF-8字符。
关于这个主题有几个问题,但除了这个问题也许没有一个问题与我的问题完全相同,其中被接受的答案对我无效。
我用
数据库修改的Python代码如下:
当我使用非UTF-8四字节UTF-8字符处被截断。
我不关心保留非UTF-8四字节UTF-8字符,所以我想做的就是用其他有效的UTF-8字符替换所有非UTF-8四字节UTF-8字符,这样我就可以将文本放入数据库中。
关于这个主题有几个问题,但除了这个问题也许没有一个问题与我的问题完全相同,其中被接受的答案对我无效。
我用
MySQLdb
模块编写Python代码,并想将一些文本放入MySQL数据库中。该数据库已配置为UTF-8,但文本偶尔包含非UTF-8的四字节UTF-8字符。数据库修改的Python代码如下:
connection = MySQLdb.connect(
'localhost',
'root',
'',
'mydatabase',
charset='utf8',
use_unicode=True)
cursor = connection.cursor()
cursor.execute(
'update mytable set entryContent=%s where entryName=%s',
(entryContent, entryName))
connection.commit()
目前它会产生以下警告:
./myapp.py:233: Warning: Invalid utf8 character string: 'F09286'
(entry, word))
./myapp.py:233: Warning: Incorrect string value: '\xF0\x92\x86\xB7\xF0\x92...' for column 'entry' at row 1
(entryname, entrycontent))
当我使用
mysql
命令行客户端查看实际进入数据库的内容时,我发现内容在第一个我不关心保留
entry.decode().encode('ascii', 'replace')
- Peter Wood'同源词包括赫梯语 (lāman)'。decode().encode('ascii', 'replace')
会产生UnicodeDecodeError: 'ascii' codec can't decode byte 0xf0 in position 25: ordinal not in range(128)
的错误。 - davidrmcharles'Cognates include Hittite (lāman)'.decode('utf-8').encode('ascii', 'replace')
,会得到'Cognates include Hittite ???????? ?(l?man)'
。 - Peter Wood