Python mysqlclient和数据在两个不同的服务器上

标签 python mysql unicode encoding

在我的本地计算机 (MacOS) 上,我有 MariaDB 10.4、Python 3.7.4 和 mysqlclient 1.4.4。 在远程服务器(FreeBSD)上,我有 MySQL 5.2、Python 3.7.2 和 mysqlclient 1.4.4。

数据库位于 utf8在两台机器上进行编码。

我的脚本使用 CONCAT 查询,例如:

SELECT IF(agreements.date <> '0000-00-00', CONCAT(agreements.date, ' 00:00:00 +0300'), '').....

为什么在我的本地计算机上,结果元组中的值类别始终为 STR,但在远程服务器上,类别为 STRBYTES 并且每个我使用 mysql 的 CONCAT 函数的列值以 b'...' 开头,并具有 BYTES 类。 我知道我可以解码字节值 (b.decode()) 并保留其他 str 值不变

data = cursor.fetchall()
l = [list(x) for x in data]
for d in l:
    for idx, vals in enumerate(d):
        if isinstance(vals, bytes):
            d[idx] = vals.decode()

但是为什么会发生这种情况 - MySQL 版本?

我看到两种方法:通过我发布的Python进行解码或使用mysql的CONVERT <column> USING utf8正如@Joe McKenna 所说的那样。但为什么我不应该在本地计算机上执行此操作,我不知道:( MySQL 服务器版本不同,但字符集配置是相同的。

示例脚本:

#!/usr/local/bin/python3
# coding: utf8


import MySQLdb

connection = MySQLdb.Connection(
    user='root',
    passwd='password',
    db='billing',
    host='localhost',
    charset='utf8'
)

cursor = connection.cursor()


cursor.execute("SELECT '', CONCAT(birthdate, ' TEST!!!!!') from accounts")
for d in cursor.fetchall():
    print(d)

cursor.close()
connection.close()

输出:

('', b'1958-11-11 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'0000-00-00 TEST!!!!!')
('', b'1950-10-09 TEST!!!!!')

更新:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';的结果

本地主机:

+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8               |
| character_set_connection | utf8               |
| character_set_database   | utf8               |
| character_set_filesystem | binary             |
| character_set_results    | utf8               |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8_general_ci    |
| collation_database       | utf8_general_ci    |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+

远程服务器:

+--------------------------+-----------------+
| Variable_name            | Value           |
+--------------------------+-----------------+
| character_set_client     | utf8            |
| character_set_connection | utf8            |
| character_set_database   | utf8            |
| character_set_filesystem | binary          |
| character_set_results    | utf8            |
| character_set_server     | utf8            |
| character_set_system     | utf8            |
| collation_connection     | utf8_general_ci |
| collation_database       | utf8_general_ci |
| collation_server         | utf8_general_ci |
+--------------------------+-----------------+

最佳答案

使用“convert”关键字将输出类型嵌入到所有查询中,如本文中所示:

<小时/>

Convert output of MySQL query to utf8

<小时/>

选择列 1,转换(列 2 使用 utf8) 来 self 的表 我的条件在哪里;

<小时/>

或者您可以使用“alter”命令将数据库中的每一列更改为您想要的数据类型:

<小时/>

https://dba.stackexchange.com/questions/33365/tell-mysql-to-start-using-utf-8-encoding-without-convert-toing-it

<小时/>

关于Python mysqlclient和数据在两个不同的服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58219653/

相关文章:

python - 金融传染(疫情蔓延)模型遇到问题

python - 为新数据添加具有唯一标识符的列,但在 python 中维护先前数据的唯一标识符

mysql - 更改表以在 mysql 中按键应用分区

mysql - Magento sql 导入和自动递增重复错误

c# - 带参数而不是 N 前缀的 Unicode SQL 查询

php - php 网络应用程序完全符合 utf-8 标准?

string - Golang 将整数转换为 unicode 字符

函数名称和参数之间的 Python 方括号 : func[. ..](...)

python - 在 anaconda 上安装 cx_freeze 时发生包冲突

php - 将 php 数组转换为 SQL 数组