Documentația Mysql

Comanda LOAD DATA INFILE citește linii dintr-un fișier text și le inserează într-un tabel la o viteză foarte mare. Dacă este specificat cuvântul cheie LOCAL. apoi fișierul este citit de la gazda clientului. Dacă LOCAL nu este specificat, fișierul trebuie să fie pe server. (Opțiunea LOCAL este disponibilă în MySQL versiunea 3.22.6 și mai târziu.)

Dacă fișierele de text pe care trebuie să le citiți sunt pe server, din motive de securitate, aceste fișiere trebuie fie să fie localizate în directorul bazei de date, fie să poată fi citite de toți utilizatorii. În plus, pentru a folosi comanda LOAD DATA INFILE la fișiere de server, trebuie să aveți privilegii FILE pentru gazda serverului. Vezi secțiunea 4.2.7 Privilegiile oferite de MySQL.

În versiunile MySQL 3.23.49 si MySQL 4.0.2 comanda locală nu va funcționa în cazul în care demonul mysqld este pornit cu parametrul --local-infile = 0 sau dacă nu includ abilitatea de a sprijini LOCAL pentru client. Consultați secțiunea 4.2.4 Considerații privind securitatea legate de comanda LOAD DATA LOCAL.

Dacă este specificat cuvântul cheie LOW_PRIORITY. executarea acestei comenzi LOAD DATA va fi întârziată până când alți clienți finalizează citirea acestui tabel.

Dacă specificați cuvântul cheie CONCURRENT atunci când lucrați cu tabelele MyISAM. atunci alte fire pot prelua date din tabel în timpul executării comenzii LOAD DATA. Folosind această caracteristică, desigur, va afecta ușor performanța LOAD DATA. Chiar dacă niciun alt fir nu folosește acest tabel în același timp.

Atunci când se utilizează opțiunea LOCAL, execuția poate fi oarecum mai lentă decât atunci când serverul primește direct accesul la fișiere, deoarece conținutul fișierului trebuie să se deplaseze de la gazda client la server. Pe de altă parte, în acest caz nu este nevoie de privilegii FILE pentru a încărca fișiere locale.

În cazurile în care fișierele se află pe server, acesta din urmă operează în conformitate cu următoarele reguli:

  • Dacă este specificată o cale absolută (completă) la fișier, atunci serverul folosește această cale neschimbată.
  • Dacă specificați o cale relativă la fișier cu unul sau mai multe directoare inițiale, fișierul va fi căutat în raport cu directoarele specificate în directorul de date al serverului (datadir).
  • Dacă calea către fișier este dată fără a specifica directoarele inițiale, serverul caută acest fișier în directorul bazei de date folosite.

Rezultă că fișierul specificat ca "./myfile.txt". citiți din directorul de date al serverului, în timp ce fișierul specificat ca "myfile.txt". este citit din catalogul bazei de date folosite. De exemplu, următoarea comandă LOAD DATA citește fișierul data.txt din directorul bază de date pentru db1. deoarece db1 este baza de date curentă, chiar dacă această comandă instruiește explicit să încarce fișierul în tabela de baze de date db2.

Cuvintele cheie REPLACE și IGNORE controlează procesarea înregistrărilor de intrare care duplică înregistrările existente cu aceleași valori ale cheilor unice. Dacă specificați REPLACE. atunci liniile noi vor înlocui cele existente cu aceeași cheie unică. Dacă specificați IGNORE. apoi liniile de intrare care au aceeași cheie unică ca cele existente vor fi ignorate. Dacă nu este specificat niciunul dintre parametri, atunci dacă se găsește o valoare cheie duplicată, apare o eroare și restul fișierului text este ignorat.

Dacă datele sunt descărcate dintr-un fișier local utilizând cuvântul cheie LOCAL. atunci serverul nu va fi capabil să întrerupă transferul de date în mijlocul acestei operații, prin urmare execuția comenzii este, în mod implicit, aceeași ca în cazul în care este specificat IGNORE.

Când se utilizează LOAD DATA INFILE pe tabelele MyISAM goale, toți indexurile non-unici sunt creați într-un pachet separat (ca în REPAIR). De obicei, acest lucru accelerează foarte mult activitatea LOAD DATA INFILE în cazul unui număr mare de indici.

Comanda LOAD DATA INFILE este opțională pentru SELECT. IN OUTFILE. Vezi secțiunea 6.4.1 Sintaxă pentru instrucțiunea SELECT. Pentru a scrie date dintr-o bază de date într-un fișier, utilizați SELECT. IN OUTFILE. Pentru a citi datele înapoi în baza de date, utilizați LOAD DATA INFILE. Sintaxa FIELDS și LINES este aceeași în ambele comenzi. Ambele părți sunt opționale, dar dacă ambele sunt specificate, FIELDS trebuie să fie precedate de linii.

Dacă FIELDS este specificat. apoi fiecare dintre subexpressions sale (TERMINATED BY. [OPTIONAL] împrejmuite de. și au scăpat) este, de asemenea, opțional, dar trebuie să specifice cel puțin una dintre ele.

Dacă instrucțiunea FIELDS nu este definită, parametrii săi impliciți vor fi următorii:

Dacă instrucțiunea LINES nu este definită, atunci implicit are următoarea structură:

Cu alte cuvinte, cu setările implicite, comanda LOAD DATA INFILE la citirea datelor de intrare va funcționa după cum urmează:

  • Căutați sfârșitul șirului ca '\ n'
  • Împărțiți linii în câmpuri prin file.
  • Nu vă așteptați ca câmpurile să poată fi închise în simboluri de citare.
  • Interpretați filele întâlnite, linii noi sau '\'. precedat de '\'. ca literali care fac parte din valoarea câmpului.

Dimpotrivă, dacă se aplică setările implicite la scrierea datelor de ieșire, comanda SELECT. IN OUTFILE va funcționa după cum urmează:

  • Introduceți file între câmpuri.
  • Nu introduceți câmpuri în simboluri de citare. Utilizați caracterele '\' pentru a scăpa de instanțele filelor, liniilor noi sau '\'. care apar printre valorile câmpului.
  • Introduceți caractere noi la sfârșitul fiecărei înregistrări.

Opțiunea IGNORE number LINES poate fi utilizată pentru a ignora antetul numelor coloanelor de la începutul fișierului:

Când utilizați SELECT. ÎN outfile coroborat cu sarcina DATA INFILE datelor din baza de date pentru a citi fișierul, și apoi - înapoi dintr-un fișier în baza de date, câmpul de opțiuni și de manipulare linie, pentru ambele echipe trebuie să fie de acord. Altfel, LOAD DATA INFILE nu va putea interpreta corect conținutul acestui fișier. Să presupunem că instrucțiunea SELECT. INTO OUTFILE este folosit pentru a scrie într-un fișier cu câmpuri separate prin virgule:

Pentru a citi acest fișier delimitat prin virgulă înapoi în baza de date, comanda corectă ar trebui să arate ca:

În schimb, dacă ați încercat să citiți în fișierul cu declarația prezentată mai jos, acesta nu va funcționa, deoarece acesta dă instrucțiuni LOAD comanda DATA INFILE pentru a căuta file între domenii:

Un rezultat similar ar rezulta dacă fiecare linie de intrare a fost interpretată ca un singur câmp.

Comanda LOAD DATA INFILE poate fi de asemenea utilizată pentru a citi fișierele primite din surse externe. De exemplu, câmpurile din fișierul format din baza de date dBASE vor fi separate prin virgule și închise în ghilimele duble. Dacă liniile din acest fișier se termină cu caractere noi, puteți utiliza următoarea comandă pentru a scrie fișierul, care ilustrează opțiunile de setare care procesează câmpurile și liniile:

Oricare dintre opțiunile care procesează câmpurile și șirurile pot specifica un șir gol (''). Dacă șirul nu este gol, atunci valoarea opțiunilor DOMENIULUI [OPTIONAL] închisã de CAMPURI și trebuie să conțină scăpat un singur caracter. Valorile opțiunilor FIELDS TERMINATED BY și LINES CIRCUIT de opțiuni pot conține mai mult de un caracter. De exemplu, pentru a scrie linii care sunt terminate perechi „carriage return - linia de alimentare“ (ca în text MS DOS sau fișiere de Windows), trebuie să specificați următoarea expresie: LINII DE TERMINATED „\ r \ n“.

De exemplu, pentru a citi fișierul "glume". în care liniile sunt separate prin %% caractere. în tabela SQL, trebuie să faceți următoarele:

Opțiunea FIELDS [OPTIONALLY] ENCLOSED BY este utilizată pentru a controla câmpurile din caracterele specificate. Dacă parametrul opțional este omis, atunci în ieșire (SELECT IN OUTFILE) toate câmpurile vor fi închise în caracterele specificate în ENCLOSED BY. Un exemplu de astfel de ieșire (în care virgula este folosită ca delimiter de câmp) este prezentată mai jos:

Dacă este specificat opțional. atunci numai câmpurile de tip CHAR și VARCHAR sunt alocate în caracterul ENCLOSED BY.

Rețineți că apariția caracterelor ENCLOSED BY în cadrul unei valori de câmp este evadată prin aplicarea prefixului din ESCAPED BY către ei. De asemenea, rețineți că dacă o valoare goală este specificată în ESCAPED BY, este posibil să creați o ieșire pe care instrucțiunea LOAD DATA INFILE nu poate citi corect. De exemplu, dacă caracterul de scanare este un șir gol, atunci ieșirea afișată mai sus va fi așa cum se arată mai jos. Notă: cel de-al doilea câmp din linia a patra conține o virgulă care urmează indicația de introducere, care (în mod eronat) pare să restricționeze acest câmp:

Pentru a introduce caracterul ENCLOSED BY. dacă există, este eliminat din ambele capete ale valorilor câmpului. (Acest lucru este valabil indiferent dacă parametrul OPTIONAL este specificat sau nu.) Dacă caracterul ENCLOSED BY este întâlnit în timp ce lucrați cu date de intrare, parametrul OPTIONALLY este ignorat. precedat de caracterul ESCAPED BY. atunci acesta este interpretat ca parte a valorii câmpului curent. În plus, caracterele duble ÎNCLINATE de. care apar într-un câmp, sunt interpretate ca caractere unice ENCLOSED BY. dacă acest câmp începe cu acest simbol. De exemplu, dacă specificați ENCLOSED BY '' ', atunci ghilimele sunt prelucrate după cum se arată mai jos:

Opțiunea FIELDS ESCAPED BY este utilizată pentru a controla înregistrarea sau citirea caracterelor speciale. Dacă caracterul FIELDS ESCAPED BY nu este gol, acesta este folosit ca prefix pentru următoarele caractere din ieșire:

  • FIELDS caracter ESCAPED BY
  • Simbol CÂMPURI [OPȚIONAL] ÎNCLINATE DE
  • Primul simbol al valorii câmpurilor terminate și LINIILE terminate de
  • Caracterul ASCII este 0 (de fapt, după ce caracterul de evacuare ASCII este scris "0" mai degrabă decât un octet cu o valoare zero)

Dacă caracterul FIELDS ESCAPED BY este gol, atunci nu se scapă niciun caracter. De fapt, specificarea unui caracter de evacuare gol nu are sens, mai ales dacă valorile câmpului din datele procesate conțin oricare dintre caracterele listate în lista de mai sus.

Dacă caracterul FIELDS ESCAPED BY nu este gol, atunci în cazul datelor de intrare, sunt șterse astfel de caractere, iar următorul caracter după această intrare este acceptat literalmente ca parte a valorii câmpului. Excepțiile sunt "0" sau "N" (de exemplu, \ 0 sau \ N. dacă caracterul de evacuare este '\'). Aceste secvențe sunt interpretate ca ASCII 0 (byte cu valoare zero) și NULL. Vedeți mai jos regulile pentru procesarea valorii NULL.

Pentru mai multe informații despre sintaxa caracterului escape '\', vedeți secțiunea 6.1.1 Literale: Reprezentarea șirurilor și numerelor.

În unele cazuri, opțiunile de procesare a câmpurilor și liniilor interacționează:

  • Dacă Liniile Terminate BY este un șir gol și FIELDS TERMINATED BY nu este un șir gol, atunci liniile se termină și cu FIELDS TERMINATED BY.
  • Dacă ambele Câmpuri terminate și FIELDELE ÎNCĂRCATE de către sunt goale (''), se folosește formatul de linie fixă ​​(fără delimitatori). În formatul cu linie fixă, nu există delimitatori între câmpuri. În schimb, la citirea și scrierea valorilor coloanelor, se folosește lățimea ieșirii coloanelor. De exemplu, dacă coloana este declarată INT (7). Valorile pentru această coloană sunt scrise cu ajutorul câmpurilor de lățime de 7 caractere. Valorile de intrare pentru această coloană sunt obținute prin citirea a 7 caractere. Formatul cu un șir fix afectează, de asemenea, procesarea valorilor NULL (a se vedea mai jos). Rețineți că un format de dimensiune fixă ​​nu va funcționa atunci când se utilizează un set de caractere multibyte.

Valorile NULL vor fi procesate diferit în funcție de opțiunile FIELDS și LINES folosite:

  • Pentru valorile implicite câmpurilor și LINII NULL este scris ca \ N pentru ieșire și \ N este citit ca NULL pentru intrare (presupunând că simbolul este scăpat „\“).
  • Dacă câmpurile FIELDS ENCLOSED BY nu sunt goale, atunci câmpul a cărui valoare este un cuvânt din literele NULL. se citește ca valoare NULL (spre deosebire de cuvântul NULL, cuprins între caracterele FIELDS ENCLOSED BY. care este citit ca șirul "NULL").
  • Dacă FIELDS ESCAPED BY este gol, NULL este scris ca NULL.
  • Formatul de la o linie fixă ​​(care este cazul dacă ambele specificator - DOMENII DE TERMINATED și câmpuri delimitate de - sunt goale), NULL este scris ca un șir gol. Rețineți că, deoarece această valoare este NULL, și linia goală din tabel pentru a fi imposibil de distins atunci când scrie la dosar, deoarece acestea sunt ambele înregistrate ca șiruri goale. Dacă doriți ca aceste valori să fie diferite atunci când citiți fișierul înapoi, nu trebuie să utilizați un format de linie fixă.

Unele cazuri care nu sunt acceptate de instrucțiunea LOAD DATA INFILE.

  • Șirurile cu o dimensiune fixă ​​(ambele opțiuni FIELDS TERMINATED BY și FIELDS ENCLOSED BY sunt goale) și coloane tip BLOB sau TEXT.
  • Dacă specificați un delimitator care se potrivește cu altul sau este un prefix al altui, atunci LOAD DATA INFILE nu va putea interpreta corect intrarea. De exemplu, următoarea instrucțiune FIELDS va cauza probleme:
  • Dacă opțiunea FIELDS ESCAPED BY este goală, intrarea câmpului FIELDS ENCLOSED BY sau LINES TERMINATED BY în valoarea câmpului. urmată de simbolul FIELDS SUSPENDATE DE. va duce la terminarea prematură a citirii câmpului sau a liniei prin comanda LOAD DATA INFILE. Acest lucru se datorează faptului că LOAD DATA INFILE nu poate determina corect unde se termină câmpul sau șirul.

Următorul exemplu încarcă toate coloanele din tabelul persondata.

Lista câmpurilor nu este specificată, prin urmare, comanda LOAD DATA INFILE așteaptă ca liniile de intrare să umple fiecare coloană a tabelului. Sunt utilizate valorile implicite pentru FIELDS și LINES.

Dacă doriți să încărcați doar câteva din coloanele într-un tabel, trebuie să specificați o listă de coloane:

Lista de câmpuri trebuie să fie specificată și în cazurile în care ordinea câmpurilor din fișierul de intrare diferă de ordinea coloanelor din acest tabel. În caz contrar, MySQL nu va putea să corespundă câmpurilor și coloanelor de intrare din tabel.

Dacă șirul are prea puține câmpuri, atunci coloanele pentru care nu există câmpuri în fișierul de intrare sunt setate la valorile lor implicite. Atributul implicit de valoare este descris în secțiunea 6.5.3 Sintaxă a instrucțiunii CREATE TABLE.

Valoarea unui câmp gol este interpretată diferit de absența unei valori:

  • Pentru tipurile de șir, coloana este setată la un șir gol.
  • Pentru tipurile numerice, coloana este setată la 0.
  • Pentru tipurile de dată și oră, coloana este setată la valoarea corespunzătoare acestui tip, "zero". Vezi secțiunea 6.2.2 Tipurile de date de dată și de timp.

Rețineți că acestea sunt aceleași valori care vor apărea în coloana, ca urmare a atribui explicite un șir șir gol, numeric, sau data sau ora de tip într-un INSERT sau UPDATE.

coloanele TIMESTAMP sunt setate numai la data sau ora curentă în cazurile în care coloana i se atribuie o valoare NULL sau (pentru prima coloana timestamp numai) în cazul în care coloana timestamp este în afara listei de teren, în cazul în care o astfel de listă este specificată.

Dacă șirul de intrare are prea multe câmpuri, câmpurile suplimentare sunt ignorate, iar numărul avertismentelor va crește.

comanda LOAD DATA INFILE interpretează intrare ca un șir de caractere, astfel încât să nu se poate specifica valori numerice pentru ENUM sau un set de coloane precum și pentru comanda INSERT. Toate valorile ENUM și SET trebuie să fie specificate ca siruri de caractere!

Când utilizați API-ul C, puteți obține informații despre cerere apelând funcția mysql_info () API după terminarea interogării LOAD DATA INFILE. Formatul liniei de informații pentru acest caz este prezentat mai jos:

Avertismentele au loc în aceleași condiții ca atunci când valorile INSERT comandă (vezi secțiunea 6.4.3 INSERT Sintaxa), cu excepția faptului că comanda LOAD DATA INFILE generează în continuare un avertisment atunci când șirul de intrare este câmpuri prea puțin sau prea mult. Avertismentele nu sunt stocate nicăieri; Numărul de avertismente poate fi utilizat numai pentru a verifica dacă acțiunile specificate sunt efectuate în mod normal. Dacă trebuie să cunoașteți cauzele exacte ale avertismentelor, ar trebui să executați comanda SELECT. IN OUTFILE la un alt fișier și compararea rezultatului cu fișierul de intrare original este singura modalitate de a obține aceste informații.

Dacă trebuie să efectuați LOAD DATA pentru a citi de pe canal, puteți aplica următorul truc:

Dacă utilizați o versiune de MySQL mai veche decât 3.23.25, cele de mai sus se pot face numai cu LOAD DATA LOCAL INFILE.

Pentru a obține mai multe informații despre eficiența INSERT în comparație cu LOAD DATA INFILE și pentru a crește viteza INFORMAȚIEI DE ÎNCĂRCARE. vezi secțiunea 5.2.9 Viteza executării interogării INSERT.

Articole similare