web-dev-qa-db-fra.com

com.mysql.jdbc.PacketTooBigException

Je stocke des images dans MYSQL.

J'ai table comme 

CREATE TABLE myTable (id INT, myImage BLOB);

Lorsque j'essaie d'insérer le fichier 4.7MB, j'obtiens une exception en tant que 

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4996552 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

Je crois que cela est lié à la taille de l'image uniquement. Existe-t-il un autre type de variable que je puisse utiliser?


Mise à jour 1

Comme pour la question plus ancienne SO, j'ai également essayé avec MEDIUMBLOB mais je reçois toujours la même erreur.

Ajout d'image à une base de données en Java


Mise à jour 2

Au début du projet, j'exécute la requête ci-dessous et tout fonctionne maintenant

SET GLOBAL max_allowed_packet = 1024*1024*14;
15
Fahim Parkar

Comme le dit l'erreur, cela n'a rien à voir avec le type de variable, mais plutôt avec la variable max_allowed_packet :

Vous devez augmenter cette valeur si vous utilisez de grandes BLOB colonnes ou de longues chaînes. Il devrait être aussi grand que le plus grand BLOB que vous voulez utiliser. La limite de protocole pour max_allowed_packet est de 1 Go. La valeur doit être un multiple de 1024; les non-multiples sont arrondis au multiple le plus proche.

Mais en règle générale, ne stockez pas de fichiers dans votre base de données, stockez-les dans votre système de fichiers et enregistrez le chemin d'accès au fichier dans la base de données.

21
eggyal

Pour les utilisateurs de Windows:

mysql_home pointe vers votre dossier d'installation mysql/mariadb.

ouvrez cmd, cd à% mysql_home%\bin et exécutez mysqladmin > temp.txt Ceci crachant beaucoup d’informations sur l’utilisation de l’outil. Quelque part parmi tous ces résultats, vous trouverez ces informations:

Les options par défaut sont lues dans les fichiers suivants, dans l'ordre donné: C:\windows\my.ini C:\windows\my.cnf C:\my.ini C:\my.cnf c:\mariadb -5.5.29-w Inx64\my.ini c:\mariadb-5.5.29-winx64\my.cnf

Cela montre que vous pourriez avez, si vous ne l’avez pas déjà, un fichier appelé my.ini ou my.conf dans le répertoire% mysql_home%.

créez my.ini et ajoutez les lignes:

[mysqld]
#allow larger BLOBs to be stored
max_allowed_packet = 10M

assurez-vous d'inclure les paramètres groupe qui est [mysqld] sinon le démarrage échouera (et pour moi, il s'est retrouvé suspendu dans les limbes).

Vous devez maintenant redémarrer le démon MySQL. Pour ce faire, vous devez arrêter et lancer le processus mysqld en cours d’exécution ou redémarrer le service MySQL (exécutez services.msc, localisez MySQL, appuyez sur le bouton de redémarrage; ou à partir de cmd, net stop MySQL suivi de net start MySQL).

2
Peter Perháč

Suivre a travaillé pour moi

éditer le fichier my.cnf (le mien était dans/etc/mysql)

Puis modifiez la valeur max_allowed_packet Je la règle à Max_allowed_packet = 200M

Assurez-vous de redémarrer MySQL pour que les modifications prennent effet

1
Farm

Si vous utilisez AWS RDS, max_allowed_packet peut être modifié à l'aide de DB Parameter Groups

0
Dinu Mathai