Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Seulement 64kO stocké dans un BLOB en utilisant DBD::mysql

3 réponses
Avatar
Syn
Bonjour,

J'ai posté un news hier s'intitulant "Longeur maximale d'une variable
scalaire" car je croyais que cela était mon problème mais apparament
non. Je m'explique: ce que je veux faire c'est en PERL lire une fichier
JPEG de taille variable entre 25 kO et 100 kO que je veux ensuite insere
dans une colone BLOB dans une base de donnée MySQL v4.0.13. J'ai
verifier quand je lis le fichier JPEG en utilisant la subroutine
read_file_into_scalar, la taille du fichier est correcte mais c'est
ensuite lors de l'insert dans la DB que la taille ne correspond plus si
je fais un SELECT LENGTH(ma_colone_blob) FROM file_data je vois que les
plus gros fichiers font 65535 octets.

Maintenant ma difficulté et ou j'ai un problème c'est de trouver OU est
cette limitation à 64 kO. Donc en gros ce n'est pas PERL ni MySQL car
MySQL dans un BLOB peut avoir de très grosses données donc il ne reste
plus que les modules DBI et DBD::mysql qui pouraient etre coupable... Le
problème c'est que j'ai rien vu dans les perldoc de ces deux modules.
Quelqu'un aurait-il une idée ?

Pour votre information voici la fonction qui lit le fichier JPEG et le
mets dans une variable scalaire:

sub read_file_into_scalar {

my $filename = shift;

my ($data, $offset);

$offset = 0;

sysopen(FH, $filename, O_RDONLY);
while (my $len = sysread FH, $data, $max_filesize, $offset) {
$offset += $len;
}
close(FH);

return $data;
}


Et ci-dessous se trouve les commandes qui m'insere le contenu du fichier
dans la base MySQL:

$sth = $dbh->prepare( qq { INSERT INTO file_data(data) VALUES (?) } );
$sth->execute($snapshot1_data);
$insert_id = $sth->{'mysql_insertid'};
printf("MySQL insert ID for data: %d\n", $insert_id);
$sth->finish;

Est-ce que je fais quelque chose de faux ? Je vois vraiment pas ou est
le problème...

Merci pour l'aide !

3 réponses

Avatar
jl_morel
Dans l'article , a
dit...

J'ai posté un news hier s'intitulant "Longeur maximale d'une variable
scalaire" car je croyais que cela était mon problème mais apparament
non. Je m'explique: ce que je veux faire c'est en PERL lire une fichier
JPEG de taille variable entre 25 kO et 100 kO que je veux ensuite insere
dans une colone BLOB dans une base de donnée MySQL v4.0.13. J'ai
verifier quand je lis le fichier JPEG en utilisant la subroutine
read_file_into_scalar, la taille du fichier est correcte mais c'est
ensuite lors de l'insert dans la DB que la taille ne correspond plus si
je fais un SELECT LENGTH(ma_colone_blob) FROM file_data je vois que les
plus gros fichiers font 65535 octets.

[couic]


Et ci-dessous se trouve les commandes qui m'insere le contenu du fichier
dans la base MySQL:

$sth = $dbh->prepare( qq { INSERT INTO file_data(data) VALUES (?) } );
$sth->execute($snapshot1_data);
$insert_id = $sth->{'mysql_insertid'};
printf("MySQL insert ID for data: %dn", $insert_id);
$sth->finish;

Est-ce que je fais quelque chose de faux ? Je vois vraiment pas ou est
le problème...




Essayez un truc comme ça (non testé) :

use DBI qw( :sql_types );

$sth = $dbh->prepare( qq { INSERT INTO file_data(data) VALUES (?) } );
$sth->bind_param(1, $snapshot1_data, SQL_LONGVARCHAR);
$sth->execute();

HTH

--
J-L.M.

Avatar
Syn
cyrille wrote:


bonjour,

- vous ne parlez pas de la définition de la table. quelle est la taille de
votre champs BLOB ?


Alors pour mon champ BLOB dans la creation de la table j'ai rien
specifié j'ai juste mis BLOB. Voici un DESCRIBE sur la table en question:

+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| data | blob | | | | |
+-------+---------+------+-----+---------+----------------+

Comment puis-je voire quelle est la taille de mon champ BLOB ?


- et aussi, dans la doc de mysql il est dit que la taille dépend aussi de la
taille des buffers de communication
citation :
* The maximum size of a BLOB or TEXT object is determined by its type, but
the largest value you can actually transmit between the client and server is
determined by the amount of available memory and the size of the
communications buffers. You can change the message buffer size, but you must
do so on both the server and client ends. See section 5.5.2 Tuning Server
Parameters.


Le serveur à 1 GB de mémoire et voici l'output de mysqld --help:

and boolean options {FALSE|TRUE} Value (after reading options)
--------------------------------- -----------------------------
basedir /opt/mysql4/
bind-address (No default value)
console FALSE
chroot (No default value)
character-sets-dir /opt/mysql4/share/mysql/charsets/
datadir /db/mysql/
default-character-set latin1
enable-locking FALSE
enable-pstack FALSE
innodb_data_home_dir (No default value)
innodb_log_group_home_dir (No default value)
innodb_log_arch_dir (No default value)
innodb_flush_log_at_trx_commit 1
innodb_flush_method (No default value)
innodb_fast_shutdown TRUE
innodb_max_dirty_pages_pct 90
init-file (No default value)
log (No default value)
language /opt/mysql4/share/mysql/english/
local-infile TRUE
log-bin (No default value)
log-bin-index (No default value)
log-isam myisam.log
log-update (No default value)
log-slow-queries (No default value)
log-slave-updates FALSE
low-priority-updates FALSE
master-host (No default value)
master-user test
master-port 3306
master-connect-retry 60
master-retry-count 86400
master-info-file master.info
master-ssl FALSE
master-ssl-key (No default value)
master-ssl-cert (No default value)
master-ssl-capath (No default value)
master-ssl-cipher (No default value)
myisam-recover OFF
memlock FALSE
disconnect-slave-event-count 0
abort-slave-event-count 0
max-binlog-dump-events 0
sporadic-binlog-dump-fail FALSE
new FALSE
old-protocol 10
old-rpl-compat FALSE
pid-file /db/mysql/devcore.pid
log-error
port 3306
report-host (No default value)
report-user (No default value)
report-password (No default value)
report-port 3306
rpl-recovery-rank 0
relay-log (No default value)
relay-log-index (No default value)
safe-user-create FALSE
server-id 2
show-slave-auth-info FALSE
concurrent-insert TRUE
skip-grant-tables FALSE
skip-slave-start FALSE
relay-log-info-file relay-log.info
slave-load-tmpdir /var/tmp/
socket /tmp/mysql.sock
sql-bin-update-same FALSE
sql-mode OFF
temp-pool TRUE
tmpdir /var/tmp/
external-locking FALSE
use-symbolic-links TRUE
--symbolic-links TRUE
log-warnings TRUE
warnings TRUE
back_log 50
binlog_cache_size 32768
connect_timeout 5
delayed_insert_timeout 300
delayed_insert_limit 100
delayed_queue_size 1000
flush_time 0
ft_min_word_len 4
ft_max_word_len 254
ft_max_word_len_for_sort 20
ft_stopword_file (No default value)
innodb_mirrored_log_groups 1
innodb_log_files_in_group 2
innodb_log_file_size 5242880
innodb_log_buffer_size 1048576
innodb_buffer_pool_size 8388608
innodb_additional_mem_pool_size 1048576
innodb_file_io_threads 4
innodb_lock_wait_timeout 50
innodb_thread_concurrency 8
innodb_force_recovery 0
interactive_timeout 28800
join_buffer_size 131072
key_buffer_size 16777216
long_query_time 10
lower_case_table_names FALSE
max_allowed_packet 26213376
max_binlog_cache_size 4294967295
max_binlog_size 1073741824
max_connections 100
max_connect_errors 10
max_delayed_threads 20
max_heap_table_size 16777216
max_join_size 4294967295
max_sort_length 1024
max_tmp_tables 32
max_user_connections 0
max_write_lock_count 4294967295
bulk_insert_buffer_size 8388608
myisam_block_size 1024
myisam_max_extra_sort_file_size 268435456
myisam_max_sort_file_size 2147483647
myisam_repair_threads 1
myisam_sort_buffer_size 8388608
net_buffer_length 8192
net_retry_count 10
net_read_timeout 30
net_write_timeout 60
open_files_limit 0
query_cache_limit 1048576
query_cache_size 0
query_cache_type 1
read_buffer_size 131072
read_rnd_buffer_size 262144
record_buffer 131072
relay_log_space_limit 0
slave_compressed_protocol FALSE
slave_net_timeout 3600
slow_launch_time 2
sort_buffer_size 524280
table_cache 64
thread_concurrency 10
thread_cache_size 0
tmp_table_size 33554432
thread_stack 196608
wait_timeout 28800


Je ne vois rien de spécial la dedans qui limiterai les données a 64kO...

Une autre idée peut-etre ?

Merci

Salutations

Avatar
Syn
Syn wrote:
cyrille wrote:


bonjour,

- vous ne parlez pas de la définition de la table. quelle est la
taille de
votre champs BLOB ?



Alors pour mon champ BLOB dans la creation de la table j'ai rien
specifié j'ai juste mis BLOB. Voici un DESCRIBE sur la table en question:

+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | | PRI | NULL | auto_increment |
| data | blob | | | | |
+-------+---------+------+-----+---------+----------------+


Je crois avoir trouvé le problème un BLOB a une taille de 65535 octets
maximum et donc je devrais utiliser un MEDIUMBLOB. C'est surement ça.

Désolé pour ne pas y avoir pensé avant!

Merci encore de l'aide !!

Salutations