【问题标题】:inserting into MySQL binary(8) field with Python使用 Python 插入 MySQL 二进制(8)字段
【发布时间】:2017-10-05 20:17:48
【问题描述】:

我正在尝试用 Python 重写以下 PHP 代码,但不知道该怎么做。我对字节、十六进制和二进制的经验几乎没有,我发现这非常令人困惑。

        $code_string = "0000000000000248";     
        $code_array = array();
        $tokens = str_split($code_array, 2);

        foreach ($tokens as $token) {
            $byte = hexdec($token);
            array_push($code_array, $byte);
        }

        $code_blob = pack("C*", 
                $code_array[0], 
                $code_array[1], 
                $code_array[2], 
                $code_array[3],
                $code_array[4], 
                $code_array[5], 
                $code_array[6], 
                $code_array[7]
            );

        $sql = "INSERT INTO some_table (code) VALUES ($code_blob)"

“代码”字段是 MySQL binary(8) 类型。当上面的代码在 PHP 中运行时,代码插入没有问题。在 phpMyAdmin 中,当我查看记录时,它表示为“0000000000000248”。

我不确定这是否是有用的信息,但是当我一一打印令牌时,它们看起来像这样

        foreach ($tokens as $token) {
            $byte = hexdec($token);
            array_push($code_array, $byte);
            echo "$byte ";
        }

        // looks like 0 0 0 0 0 0 2 72

当我打印 SQL 时,它看起来像这样

    INSERT INTO some_table (code) VALUES ('H')

我不知道如何在 Python (3.4) 中执行此操作

感谢 t.m.adam 的正确答案。就像注释一样,要将其插入数据库中,您必须这样做

    sql = "INSERT INTO some_table (code) VALUES (%s)"
    cursor.execute(sql, (code_blob,))
    db.commit()

如果您将 blob 直接放入 Python 中的字符串中,则字符串看起来像 b'...' 并破坏 SQL。

【问题讨论】:

    标签: php python mysql binary hex


    【解决方案1】:

    在您的 PHP 代码中,您使用 hexdec 函数从 $code_string 创建一个小数数组,然后使用该数组使用 pack 函数创建一个字符字符串。
    Python 等价物:

    from struct import pack
    
    code_string = '0000000000000248'
    code_array = [ int(code_string[i:i+2], 16) for i in range(0, len(code_string), 2) ]
    code_blob = pack('B'*len(code_array), *code_array)
    #code_blob = ''.join( chr(i) for i in code_array )  ## pack alternative ##
    

    结果:

    print(code_array)
    print(code_blob)
    
    [0, 0, 0, 0, 0, 0, 2, 72]
    '      ☻H'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-10
      • 2014-04-15
      • 1970-01-01
      • 2015-07-22
      • 2012-04-05
      • 2013-04-23
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多