MySQL可以输出与perl打包整数等效的内容吗?

时间:2018-10-22 20:41:02

标签: mysql perl

我正在尝试将数据从MySQL表中的列直接提取到一个二进制文件中,该文件是一系列打包的无符号整数(每个4字节),可以使用perl unpack函数读取。我可能会如何读取这些数据的一个愚蠢的例子是

#!/usr/bin/env perl
my $input_file = 'packed_int_test_file_04';
open my $fh, '<:raw', $input_file
  or die "Couldn't open $input_file for binary read: $!";

my $position = 0;
my $four_byte_buffer;
while ( read($fh, $four_byte_buffer, 4) ) {
    my $foo_val  = unpack("I", $four_byte_buffer);
    print("Foo val at position $position is $foo_val \n");
    $position++;
}

# OUTPUT:
# Foo val at position 0 is 1 
# Foo val at position 1 is 2 
# Foo val at position 2 is 3 
# Foo val at position 3 is 4 
# Foo val at position 4 is 5 
# Foo val at position 5 is 6 

我希望可以直接从MySQL生成数据文件,如下所示(但我没有运气)

select (cast foo_val_integer as binary(4)) 
from bar_table
into outfile 'packed_int_test_file_04'
FIELDS terminated by ''
LINES terminated by '';

有没有办法让MySQL直接将4字节打包的无符号整数序列输出到二进制文件中,而perl可以通过这种方式读取它?

1 个答案:

答案 0 :(得分:2)

unpack 'I'期望的格式因版本而异。我相信您正在尝试获取以下格式之一:

  • 32位big-endian无符号整数(例如,0x12345678打包为12 34 56 78

    使用以下方式以便携方式打开包装

    unpack 'L>'
    

    包装为

    CHAR(
        ( i >> 24 ) & 0xFF,
        ( i >> 16 ) & 0xFF,
        ( i >>  8 ) & 0xFF,
        ( i >>  0 ) & 0xFF
    ) 
    
  • 32位Little-Endian无符号整数(例如,0x12345678打包为78 56 34 12

    使用以下方式以便携方式打开包装

    unpack 'L<'
    

    包装为

    CHAR(
        ( i >>  0 ) & 0xFF,
        ( i >>  8 ) & 0xFF,
        ( i >> 16 ) & 0xFF,
        ( i >> 24 ) & 0xFF
    )