Python MySQL соединитель неявно преобразует строку в целые числа - PullRequest
1 голос
/ 03 октября 2019

У меня есть таблица mysql со следующей схемой и таблицей.

CREATE SCHEMA IF NOT EXISTS test DEFAULT CHARACTER SET utf8;
USE test;

CREATE TABLE IF NOT EXISTS test.test_table (
    _id_pn INTEGER NOT NULL AUTO_INCREMENT,
    _element TEXT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci' NOT NULL,
    PRIMARY KEY (_id_pn)) ENGINE = InnoDB;

Я использую python-соединитель mysql для подключения к базе данных и выполнения запросов следующим образом.

import mysql.connector

MYSQL_CONFIG = {
    'autocommit': True,
    'ssl_disabled': True,
    'host': '127.0.0.1',
    'port': 3307,
    'user': 'root',
    'password': 'toor',
    'pool_size': 1,
    'database': 'test'
}

def insert_into_table(cursor, element):
    cursor.execute("INSERT INTO test_table (_element) values (%s)", (element,))

def print_table_values(cursor):
    cursor.execute("SELECT _element from test_table")
    for row in cursor:
        print(row['_element'])
        print(type(row['_element']))

def print_table_values_raw_cursor(cursor):
    cursor.execute("SELECT _element from test_table")
    for (elem,) in cursor:
        decoded_elem = elem.decode('utf-8')
        print(decoded_elem)
        print(type(decoded_elem))

cnx = mysql.connector.connect(**MYSQL_CONFIG)
cursor = cnx.cursor(buffered=True, dictionary=True)
insert_into_table(cursor, "000001")
print_table_values(cursor)

cursor2 = cnx.cursor(buffered=True, raw=True)
print_table_values_raw_cursor(cursor2)

cursor.close()
cursor2.close()
cnx.close()

Результат выполнения этого кода:

1
<type 'int'>
000001
<type 'unicode'>

Кто-нибудь может объяснить причину, по которой код ведет себя так? Кроме того, полезно ли использовать необработанный курсор и вручную декодировать значения?

Версия Python = 2.7.10

Версия Python-коннектора mysql = 8.0.16

Версия сервера Mysql =5.6.44-log MySQL Community Server (GPL)

...