【问题标题】:Can MySQL output the equivalent of a perl packed integer?MySQL 可以输出相当于 perl 压缩整数吗?
【发布时间】:2019-03-27 00:11:50
【问题描述】:

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

#!/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 可以通过这种方式读取?

【问题讨论】:

    标签: mysql perl


    【解决方案1】:

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

    • 32 位大端无符号整数(例如 0x12345678 打包为 12 34 56 78

      使用便携式方式解压

      unpack 'L>'
      

      包装使用

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

      使用便携式方式解压

      unpack 'L<'
      

      包装使用

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

    【讨论】:

    • 我没有方便测试的 MySQL。确保使用 3,000,000,000 进行测试
    • 谢谢你(再次)@ikegami!这完美无缺! select CAST(CHAR( ( foo_val_integer &gt;&gt; 0 ) &amp; 0xFF, ( foo_val_integer &gt;&gt; 8 ) &amp; 0xFF, ( foo_val_integer &gt;&gt; 16 ) &amp; 0xFF, ( foo_val_integer &gt;&gt; 24 ) &amp; 0xFF ) as binary(4)) from bar_table into outfile 'packed_int_test_file_04' FIELDS TERMINATED BY '' ENCLOSED BY '' ESCAPED BY '' LINES TERMINATED BY '' STARTING BY ''
    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多