首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL输出非拉丁unicode为三

MySQL输出非拉丁unicode为三
EN

Stack Overflow用户
提问于 2021-05-02 00:40:55
回答 1查看 67关注 0票数 0

我正在与互联网投机小说数据库下载MySQL数据库。此查询:

代码语言:javascript
运行
复制
SELECT title_title
FROM titles
WHERE title_id = 1779018;

返回三体。它应该返回"三体",汉字为书名,三体问题。对于所有非拉丁unicode文本,输出类似,一些扩展的拉丁字符显示为方形。这既发生在MySQL终端上,也发生在我使用python MySQL连接器时:

代码语言:javascript
运行
复制
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*变量进行更改,但是在这种情况下我找不到一个可以工作的组合。目前的设置是:

代码语言:javascript
运行
复制
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

  • Python 3.8.9

  • Ubuntu16.04.7LTS(异种)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-02 01:24:59

经过更多的研究后,我发现这个数据库实际上并没有用unicode编码来存储这些字符,而是使用拉丁文编码和字符的“数字字符引用”。在Python 3中,可以转换为unicode,如下所示:

代码语言:javascript
运行
复制
from html import unescape

print(unescape(unicode_book_title))

这将返回"三体“。普通拉丁文字符在其他标题中保留不变。在Python2中,可以使用HTMLParser包。请参阅:Convert numeric character reference notation to unicode string

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67352049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档