pymysql возвращает неправильные значения для типа бита

#python #mysql #type-conversion #pymysql

#python #mysql #преобразование типа #pymysql

Вопрос:

Я использую pymysql==0.10.1 (python3.7) для чтения таблицы с битовым столбцом и получения неправильных значений:

 CREATE TABLE root.numeric
(BIT_COL       BIT(10));
insert into root.numeric
values (b'0010001000');
insert into root.numeric
values (b'0000100000');
  

и затем

         with connection.cursor() as cursor:
                sql = f"select * from `root`.`numeric`;"
                cursor.execute(sql)
                result = cursor.fetchone()
                print("mysql payload", result)
  

получение:

 mysql payload {'BIT_COL': b'x00x88'} # nice
mysql payload {'BIT_COL': b'x00 '}.   # not nice
  

почему это? Я проверил, и похоже, что код pymysql ничего не преобразует для битовых полей.

Ответ №1:

как упоминалось в коде «MySQLdb не обрабатывает биты, поэтому мы тоже не должны», поэтому правильное преобразование:

     def convert_bit(self, b):
        """ bit fields are packed as big-endian unsigned long long,
            we translate them to human-readable int/long"""
        b = b"x00" * (8 - len(b))   b # pad w/ zeroes
        return struct.unpack(">Q", b)[0]