Я пытаюсь извлечь данные из столбца в таблице 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 таким образом?
Формат, ожидаемый при 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
байтов (например, 0x12345678
упакованное как 78 56 34 12
)
Распаковывается портативным способом с использованием
unpack 'L<'
Упаковано с помощью
CHAR(
( i >> 0 ) & 0xFF,
( i >> 8 ) & 0xFF,
( i >> 16 ) & 0xFF,
( i >> 24 ) & 0xFF
)
select CAST(CHAR( ( foo_val_integer >> 0 ) & 0xFF, ( foo_val_integer >> 8 ) & 0xFF, ( foo_val_integer >> 16 ) & 0xFF, ( foo_val_integer >> 24 ) & 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 ''