MySQL 将非拉丁 unicode 输出为三

MySQL outputs non-latin unicode as 三

我正在使用可下载的 Internet 推理小说数据库 MySQL 数据库。此查询:

SELECT title_title
FROM titles
WHERE title_id = 1779018;

returns 三体。应该是return“三体”,书名汉字,三体。所有非拉丁 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-04-24 下载。 设置说明在这里:

http://www.isfdb.org/wiki/index.php/ISFDB:MySQL_Only_Setup

系统信息:

经过更多研究,我发现这个数据库实际上并没有使用 unicode 编码存储这些字符,它使用拉丁编码和字符的“数字字符引用”。在 Python 3 中,您可以像这样转换为 unicode:

from html import unescape

print(unescape(unicode_book_title))

这个returns“三体”。其他标题的常规拉丁字符保持不变。在Python2中,可以使用HTMLParser包。看: Convert numeric character reference notation to unicode string