我正在与互联网投机小说数据库下载MySQL数据库。此查询:
SELECT title_title
FROM titles
WHERE title_id = 1779018;
返回三体
。它应该返回"三体",汉字为书名,三体问题。对于所有非拉丁unicode文本,输出类似,一些扩展的拉丁字符显示为方形。这既发生在MySQL终端上,也发生在我使用python MySQL连接器时:
import mysql.connector
db_params = dict(
host="localhost",
user="root",
password="",
database="isfdb"
)
conn = mysql.connector.connect(**db_params)
cur = conn.cursor()
cur.execute("""
SELECT title_title
FROM titles
WHERE title_id = 1779018;
"""
)
unicode_book_title = cur.fetchone()[0]
conn.close()
print(unicode_book_title)
我尝试过对终端中的character_set*
变量进行更改,但是在这种情况下我找不到一个可以工作的组合。目前的设置是:
mysql> show variables like '%character_set%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
我的最终目标是为此使用python连接器,因此一个显式地设置脚本中的字符集并且不依赖于系统设置的解决方案是可取的。
此记录的ISFDB页面正确显示字符,这使我认为数据被正确存储,但检索出现了问题:
http://www.isfdb.org/cgi-bin/title.cgi?1779018
这可以通过从以下网站下载数据库来复制:
http://www.isfdb.org/wiki/index.php/ISFDB_Downloads
我使用的是与5.5兼容的2021-0424下载。安装说明如下:
http://www.isfdb.org/wiki/index.php/ISFDB:MySQL_Only_Setup
系统信息:
使用wrapper
mysql.connector.__version__
的Linux (x86_64)是2.2.2b1
发布于 2021-05-02 01:24:59
经过更多的研究后,我发现这个数据库实际上并没有用unicode编码来存储这些字符,而是使用拉丁文编码和字符的“数字字符引用”。在Python 3中,可以转换为unicode,如下所示:
from html import unescape
print(unescape(unicode_book_title))
这将返回"三体“。普通拉丁文字符在其他标题中保留不变。在Python2中,可以使用HTMLParser包。请参阅:Convert numeric character reference notation to unicode string
https://stackoverflow.com/questions/67352049
复制相似问题