Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL - Comment contourner la limite de taille de ligne de 66 Ko

La réponse acceptée est fausse (ou du moins assez opiniâtre) :personnellement, je ne souhaite pas que les données soient stockées en dehors de ma base de données, car cela crée des complications en termes de procédures de sauvegarde et de requêtes transactionnelles.

Comme d'autres l'ont souligné, le manuel indique à plusieurs reprises que les colonnes BLOB et TEXT ne comptent pas dans la taille totale de la ligne, mais malheureusement, avec les paramètres de configuration par défaut, ce n'est pas vrai et vous finissez par recevoir ce message d'erreur. (Le message d'erreur n'a aucun sens, car il vous dit d'utiliser TEXT au lieu de VARCHAR pour résoudre le problème - ce que vous êtes déjà.)

La raison de cette limitation est le mécanisme de stockage par défaut, Antelope , qui stocke les 768 premiers octets de colonnes de longueur variable dans la ligne - et une solution possible consiste à utiliser INNODB et à basculer votre mécanisme de stockage vers l'alternative Barracuda mécanisme de stockage :

SET GLOBAL innodb_file_format=Barracuda;

Cela n'aura pas d'effet immédiat, car ce paramètre est un paramètre par défaut pour les nouveaux fichiers de base de données. Vous devrez donc supprimer et recréer l'intégralité de votre base de données.

Vous pouvez également passer à Barracuda (comme ci-dessus) puis (en plus) passer à la stratégie fichier par table :

SET GLOBAL innodb_file_per_table=ON;

Encore une fois, cela n'aura pas d'effet immédiat, car les deux paramètres sont les valeurs par défaut pour les nouvelles tables - donc encore une fois, vous devrez supprimer et recréer la table.

Si vous regardez dans le dossier de données MySQL après cela, vous pouvez confirmer que des fichiers séparés ont été créés, par ex. pour une base de données nommée "data" et une table nommée "test", vous devriez voir un fichier nommé "data/test/bigtable.ibd".

Si vous n'aimez pas modifier les paramètres globaux dans MySQL, essayez SET SESSION au lieu de SET GLOBAL , par exemple. juste avant d'exécuter votre CREATE TABLE déclarations.