MariaDB / pymysql:数据在列中显示为十六进制值(0x5761746572 而不是“水”)

Posted

技术标签:

【中文标题】MariaDB / pymysql:数据在列中显示为十六进制值(0x5761746572 而不是“水”)【英文标题】:MariaDB / pymysql: Data shows up in columns as hex values (0x5761746572 instead of "Water") 【发布时间】:2020-06-17 16:43:47 【问题描述】:

我正在尝试创建一个本地 Docker 映像,该映像代表我的生产数据库的开发版本。我已经启动了一个与生产 (10.1) 版本相同的 MariaDB 容器,并基于生产的 mysqldump 加载了一个架构。

但是,当我开始插入数据时,每列中都会出现奇怪的十六进制值。

生产数据如下:

select * from projects where p_project = 'Water';
+-----------+----------------+------------+----------+-------------+---------+----------+----------+---------+--------------------+
| p_project | p_timestamp    | p_wikipage | p_parent | p_shortname | p_count | p_qcount | p_icount | p_scope | p_upload_timestamp |
+-----------+----------------+------------+----------+-------------+---------+----------+----------+---------+--------------------+
| Water     | 20200305045828 | NULL       | NULL     | NULL        |     841 |      644 |      554 |       0 | 20190813001026     |
+-----------+----------------+------------+----------+-------------+---------+----------+----------+---------+--------------------+

虽然开发数据库看起来像:

select * from projects where p_project = 'Water';
+----------------------+--------------------------------+------------------------+--------------------+--------------------------+---------+----------+----------+---------+----------------------------------------+
| p_project            | p_timestamp                    | p_wikipage             | p_parent           | p_shortname              | p_count | p_qcount | p_icount | p_scope | p_upload_timestamp                     |
+----------------------+--------------------------------+------------------------+--------------------+--------------------------+---------+----------+----------+---------+----------------------------------------+
| 0x5761746572         | 0x3230323030333035303532333538 | 0x                     | 0x                 | 0x                       |    NULL |     NULL |     NULL |       0 | 0x                                     |
+----------------------+--------------------------------+------------------------+--------------------+--------------------------+---------+----------+----------+---------+----------------------------------------+

生产数据库是这样定义的:

show create database enwp10;
enwp10 | CREATE DATABASE `enwp10` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |

而开发者是:

show create database enwp10_dev;
| enwp10_dev | CREATE DATABASE `enwp10_dev` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ |

这是表定义:

show create table projects;
----------------------------------------------------------------------+
| projects | CREATE TABLE `projects` (
  `p_project` varbinary(63) NOT NULL,
  `p_timestamp` binary(14) NOT NULL,
  `p_wikipage` varbinary(255) DEFAULT NULL,
  `p_parent` varbinary(63) DEFAULT NULL,
  `p_shortname` varbinary(255) DEFAULT NULL,
  `p_count` int(10) unsigned DEFAULT '0',
  `p_qcount` int(10) unsigned DEFAULT '0',
  `p_icount` int(10) unsigned DEFAULT '0',
  `p_scope` int(10) unsigned NOT NULL DEFAULT '0',
  `p_upload_timestamp` binary(14) DEFAULT NULL,
  PRIMARY KEY (`p_project`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+----------

有趣的是选择在这两种情况下都有效,所以可能是我的 mysql 客户端显示设置关闭了?

我对我的 pymysql 连接调用的 kwargs 包括:

      'charset': None,
      'use_unicode': False,

这在生产中一直运行良好。此外,我已将开发数据库的全局服务器字符集设置为“utf8mb4”,将服务器排序规则设置为“utf8mb4_unicode_ci”。

开发数据库中的所有表都使用CHARSET=latin1 定义,但生产表也是如此。

有什么想法吗?谢谢!

【问题讨论】:

这可能是因为在我的开发机器上我使用的是:$ mysql --version mysql Ver 8.0.19 for osx10.14 on x86_64 (Homebrew),而在生产中我使用的是$ mysql --version mysql Ver 15.1 Distrib 10.1.44-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2。所以客户端二进制文件是不同的。 【参考方案1】:

问题是我使用的是由 mysql 安装的mysql 客户端二进制文件,并且协议必须与这个旧(10.1)版本的 MariaDB 略有不同。请参阅对问题的评论。

解决方案是安装适用于 MacOS 的 MariaDB,以正确的版本,并使用 /usr/local/mariadb/server/bin/mariadb 连接到我的 docker 数据库。

【讨论】:

以上是关于MariaDB / pymysql:数据在列中显示为十六进制值(0x5761746572 而不是“水”)的主要内容,如果未能解决你的问题,请参考以下文章

使用 json 数据并将其显示在列中

mariadb教程[78] mariadb数据类型

识别包含单词的句子,并使用 str.contains 在列中显示该单词

SQL:您如何在列中显示占总数的百分比?

在列中插入条件行

PHP在列中显示数组