Ngarkoni shembuj të skedarëve lokalë të të dhënave. Manuali i referencës MySQL. Sintaksa LOAD DATA INFILE

Unë përshkruaj një situatë mjaft të zakonshme. Gjatë pentestit, u fitua qasja në phpMyAdmin në një host të largët, por skedarët nuk mund të aksesoheshin përmes tij. Famëkeqja FILE_PRIV=asnjë flamur në cilësimet e daemonit të MySQL është fajtor për gjithçka. Shumë në këtë situatë heqin dorë dhe besojnë se skedarët në host nuk mund të lexohen më në këtë mënyrë. Por nuk është gjithmonë kështu.

PARALAJMËRIM

I gjithë informacioni jepet vetëm për qëllime informative. As redaktorët dhe as autori nuk janë përgjegjës për ndonjë dëm të mundshëm të shkaktuar nga materialet e këtij artikulli.

Prelud

Kur bëhet fjalë për ndërveprimin e MySQL DBMS me sistemin e skedarëve, ata zakonisht mbajnë mend:

  • funksioni LOAD_FILE, i cili ju lejon të lexoni skedarë në server;
  • konstrukti SELECT ... INTO OUTFILE, i cili mund të përdoret për të krijuar skedarë të rinj.

Prandaj, nëse keni akses në phpMyAdmin ose ndonjë klient tjetër në një makinë të largët, atëherë me një probabilitet të lartë mund të arrini në MySQL përmes MySQL. sistemi i skedarëve. Por vetëm nëse flamuri FILE_PRIV=po vendoset në cilësimet e demonit, gjë që nuk është gjithmonë kështu. Në këtë rast, duhet të kujtojmë një operator tjetër, shumë më pak të njohur, por në të njëjtën kohë që ka funksionalitet mjaft të fuqishëm. Unë jam duke folur për deklaratën LOAD DATA INFILE, veçoritë e së cilës do të diskutohen në këtë artikull.

Ndërveprimi midis PHP dhe MySQL

PHP është gjuha më e përdorur për ndërtimin e aplikacioneve në ueb, kështu që ia vlen të hedhim një vështrim më të afërt se si ndërvepron me një bazë të dhënash.

Në PHP4, bibliotekat e klientëve MySQL përfshiheshin si parazgjedhje dhe përfshiheshin në shpërndarjen PHP, kështu që gjatë instalimit, mund të tërhiqesh nga përdorimi i MySQL vetëm duke specifikuar opsionin

pa mysql.

PHP5 vjen pa një bibliotekë klienti. Në sistemet *nix, PHP5 zakonisht ndërtohet me bibliotekën libmysqlclient të instaluar tashmë në server, thjesht duke vendosur opsionin

Me-mysql=/usr

gjatë montimit. Në të njëjtën kohë, përpara versionit 5.3, përdoret një bibliotekë e nivelit të ulët MySQL Client Library (libmysql) për të bashkëvepruar me serverin MySQL, një ndërfaqe që nuk është e optimizuar për komunikim me aplikacionet PHP.

Shoferi origjinal i MySQL (mysqlnd) është zhvilluar për PHP 5.3 dhe më të lartë, dhe lëshimi i fundit i PHP 5.4 e përdor këtë drejtues si parazgjedhje. Megjithëse drejtuesi i integruar MySQL është shkruar si një shtesë PHP, është e rëndësishme të kuptohet se ai nuk ofron një API të re për programuesin PHP. API-ja e bazës së të dhënave MySQL për programuesin sigurohet nga shtesat MySQL, mysqli dhe PDO_MYSQL. Këto shtesa mund të përdorin drejtuesin e integruar MySQL për të komunikuar me demonin MySQL.

Përdorimi i drejtuesit të integruar MySQL ka disa avantazhe ndaj bibliotekës së klientit MySQL: për shembull, nuk keni nevojë të instaloni MySQL për të ndërtuar PHP ose të përdorni skriptet që funksionojnë me bazën e të dhënave. Më shumë informacion i detajuar rreth MySQL Native Driver dhe ndryshimet e tij nga libmysql mund të gjenden në dokumentacion.

Shtesat MySQL, mysqli dhe PDO_MYSQL mund të konfigurohen individualisht për të përdorur ose libmysql ose mysqlnd. Për shembull, për të konfiguruar shtesën MySQL për të përdorur Bibliotekën e Klientit MySQL dhe shtesën mysqli për të punuar me Shoferin Native MySQL, duhet të specifikoni opsionet e mëposhtme:

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

Sintaksa LOAD TË DHËNAT

Deklarata LOAD DATA, siç thotë dokumentacioni, lexon rreshta nga një skedar dhe i ngarkon ato në një tabelë me shpejtësi shumë të lartë. Mund të përdoret me fjalë kyçe LOCAL (i disponueshëm në MySQL 3.22.6 dhe më vonë) i cili specifikon se nga do të ngarkohen të dhënat. Nëse fjala LOCAL mungon, atëherë serveri ngarkon skedarin e specifikuar në tabelë me të makinë lokale, jo nga makina e klientit. Kjo do të thotë, skedari nuk do të lexohet nga klienti MySQL, por nga serveri MySQL. Por ky operacion kërkon sërish privilegjin FILE (flamuri FILE_PRIV=po). Ekzekutimi i deklaratës në këtë rast mund të krahasohet me përdorimin e funksionit LOAD_FILE - me ndryshimin e vetëm që të dhënat ngarkohen në tabelë dhe nuk shfaqen. Kështu, përdorimi i LOAD DATA INFILE për të lexuar skedarë ka kuptim vetëm kur funksioni LOAD_FILE nuk është i disponueshëm, domethënë në versionet shumë të vjetra të serverit MySQL.

Por nëse deklarata përdoret në këtë formë: LOAD DATA LOCAL INFILE , pra duke përdorur fjalën LOCAL, atëherë skedari tashmë lexohet nga programi i klientit (në makinën e klientit) dhe dërgohet në serverin ku ndodhet baza e të dhënave. Në të njëjtën kohë, privilegji FILE, natyrisht, nuk është i nevojshëm për të hyrë në skedarë (pasi gjithçka ndodh në makinën e klientit).

Shtesat MySQL/mysqli/PDO_MySQL dhe deklarata LOAD DATA LOCAL

Në shtesën MySQL, aftësia për të përdorur LOCAL kontrollohet nga direktiva PHP_INI_SYSTEM mysql.allow_local_infile. Si parazgjedhje, kjo direktivë ka një vlerë prej 1, dhe për këtë arsye operatori që na nevojitet është zakonisht i disponueshëm. Gjithashtu, funksioni mysql_connect ju lejon të aktivizoni përdorimin e LOAD DATA LOCAL nëse argumenti i pestë është konstantja 128.

Kur shtrirja PDO_MySQL përdoret për t'u lidhur me bazën e të dhënave, ne gjithashtu mund të aktivizojmë mbështetjen LOCAL duke përdorur konstanten PDO::MYSQL_ATTR_LOCAL_INFILE (integer)

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

Por mundësitë më të mëdha për të punuar me deklaratën LOAD DATA ofrohen nga ekstensioni mysqli. Kjo shtesë ofron gjithashtu direktivën PHP_INI_SYSTEM mysqli.allow_local_infile, e cila rregullon përdorimin e LOCAL.

Nëse lidhja bëhet përmes mysqli_real_connect, atëherë me ndihmën e mysqli_options mund të aktivizojmë dhe çaktivizojmë mbështetjen LOCAL. Për më tepër, funksioni mysqli_set_local_infile_handler është i disponueshëm në këtë shtesë, i cili ju lejon të regjistroni një funksion të kthimit të thirrjes për të trajtuar përmbajtjen e skedarëve të lexuar nga deklarata LOAD DATA LOCAL INFILE.

Leximi i skedarëve

Lexuesi i vëmendshëm me siguri e ka hamendësuar tashmë se nëse kemi një llogari në phpMyAdmin, atëherë do të jemi në gjendje të lexojmë skedarë arbitrar pa pasur privilegjin FILE dhe madje të anashkalojmë kufizimet open_basedir. Në fund të fundit, shumë shpesh si klienti (në këtë rast, phpMyAdmin) dhe daemon MySQL janë në të njëjtën makinë. Pavarësisht kufizimeve të politikës së sigurisë serverët MySQL, ne mund të përfitojmë nga fakti që kjo politikë nuk vlen për klientin, dhe gjithsesi të lexojmë skedarët nga sistemi, duke i shtyrë ato në bazën e të dhënave.

Algoritmi është i thjeshtë. Mjafton të ekzekutoni pyetjet e mëposhtme SQL:

  1. Krijoni një tabelë në të cilën do të shkruajmë përmbajtjen e skedarëve: CREATE TABLE temp(content text);
  2. Dërgo përmbajtjen e skedarit në tabelën e krijuar: LOAD DATA INFILE LOCAL "/etc/hosts" NË temp TABLE FUSHAT TË PËRFUNDUARA NGA "eof" TË SHKAKTUARA NGA "" RRESHTA TË PËRFUNDOHEN NGA "eof";

Voila. Përmbajtja e skedarit /etc/hosts është tani në tabelën e tempit. Keni nevojë të lexoni binare? Nuk ka probleme. Nëse në hapin e parë krijojmë një tabelë si kjo:

KRIJO TABELA "bin" ("bin" BLOB JO NULL) MOTORRI = MYISAM ;

atëherë do të jetë e mundur të ngarkohen skedarët binare në të. Vërtetë, pjesë shtesë do të shtohen në fund të skedarëve, por ato mund të hiqen në çdo redaktues hex. Kështu, ju mund të shkarkoni skriptet e mbrojtura nga IonCube/Zend/TrueCrypt/NuSphere nga serveri dhe t'i deshifroni ato.

Një shembull tjetër se si mund të përdorni LOAD DATA LOCAL INFILE është të zbuloni rrugën drejt konfigurimit të Apache. Kjo bëhet si më poshtë:

  1. Së pari, zbulojmë rrugën drejt binarit, për këtë lexojmë /proc/self/cmdline siç përshkruhet më sipër.
  2. Dhe më pas lexojmë drejtpërdrejt binarin, ku kërkojmë HTTPD_ROOT/SERVER_CONFIG_FILE.


Është e qartë se në këtë situatë skriptet phpMyAdmin luajnë rolin e një klienti për t'u lidhur me bazën e të dhënave. Dhe në vend të phpMyAdmin, mund të përdorni çdo ndërfaqe tjetër në internet për të punuar me MySQL.

Për shembull, mund të përdorni skriptet për të kopjuar dhe rivendosur bazën e të dhënave. Në vitin 2007, një haker francez i quajtur acidroot publikoi një shfrytëzim të bazuar në këtë vërejtje dhe duke bërë të mundur leximin e skedarëve nga paneli i administratorit phpBB.<= 2.0.22.

Tuneli është i përshtatshëm. Tuneli i pasigurt

Kur instaloni aplikacione komplekse në internet, shpesh kërkohet qasja e drejtpërdrejtë në bazën e të dhënave, për shembull, për konfigurimin fillestar dhe rregullimin e skripteve. Prandaj, në disa raste këshillohet të instaloni një skript të thjeshtë në server - të ashtuquajturin tunel MySQL, i cili ju lejon të kërkoni bazën e të dhënave duke përdorur një klient të përshtatshëm në vend të phpMyAdmin me peshë të rëndë.

Ka mjaft tunele për të punuar me bazën e të dhënave, por të gjithë nuk janë shumë të zakonshëm. Ndoshta një nga më të famshmit është Macromedia Dream Weaver Server Scripts. Ju mund të shihni kodin burimor për këtë skript.

Dallimi kryesor midis MySQL Tunnel dhe phpMyAdmin është nevoja për të futur jo vetëm hyrjen dhe fjalëkalimin nga baza e të dhënave, por edhe hostin me të cilin dëshironi të lidheni. Në të njëjtën kohë, tunelet shpesh lihen aktive, mirë, për çdo rast, nuk e dini se çfarë tjetër duhet të rregullohet. Duket sikur mund t'i përdorni ato vetëm nëse keni një llogari në bazën e të dhënave - atëherë pse të keni frikë? Shkurtimisht, duket se tuneli nuk përbën një kërcënim të veçantë sigurie për serverin në internet. Por në fakt, jo gjithçka është aq e mirë sa duket në shikim të parë.

Merrni parasysh situatën e mëposhtme. Lejo që serveri A të ketë një sajt site.com me një tunel të krijuar http://site.com/_mmServerScripts/MMHTTPDB.php. Le të supozojmë se në serverin A është e mundur të përdoret LOAD DATA LOCAL (siç u diskutua më lart, kjo, për shembull, është e mundur me cilësimet e paracaktuara). Në këtë rast, ne mund të marrim një server të largët MySQL, bazat e të dhënave të të cilit lejohen nga kudo dhe i cili gjithashtu ju lejon të përdorni LOCAL, dhe të lidheni me këtë server duke përdorur një tunel. Të dhënat për t'u lidhur me një server të largët MySQL:

Pritësi i DB: xx.xx.xx.xxx Emri i DB: name_remote_db Përdoruesi i DB: our_user DB Pass: our_pass

Në këtë situatë, serveri A do të luajë rolin e një klienti, dhe për këtë arsye ne mund të dërgojmë skedarë nga hosti i tij në një bazë të dhënash të largët, ose, me fjalë të tjera, të lexojmë skedarë. Me kërkesën e mëposhtme të thjeshtë:

Type=MYSQL&Timeout=100&Host=xx.xx.xx.xxx&Baza e të dhënave=name_remote_db&UserName=our_user&Password=our_pass&opCode=ExecuteSQL&SQL=LOAD DATA LOCAL INFILE.BLOAD DATA LOCAL INFILE. LINJAT E MENDUARA NGA "__eof__"

Në fakt, kjo dobësi është më e rrezikshme se leximi i zakonshëm i skedarëve: lejon leximin e skedarëve të konfigurimit të skripteve të instaluara në serverin A. Nëpërmjet të njëjtit tunel, mund të merrni akses të drejtpërdrejtë në bazën e të dhënave që menaxhon këto skripta. Teknika e përshkruar më sipër për përdorimin e tuneleve muskulore mund të përgjithësohet pak dhe të zbatohet kur shfrytëzohen dobësitë joserializuese.


klient-server

Për të kuptuar më mirë mundësitë e LOAD DATA, është e nevojshme të mbani mend se MySQL DBMS përdor një arkitekturë tradicionale klient-server. Duke punuar me MySQL, ne në fakt punojmë me dy programe:

  • një program serveri të bazës së të dhënave që ndodhet në kompjuterin ku ruhet baza e të dhënave. Daemon mysqld dëgjon kërkesat e klientëve përmes rrjetit dhe akseson përmbajtjen e bazës së të dhënave, duke ofruar informacionin e kërkuar nga klientët. Nëse mysqld niset me --local-infile=0, atëherë LOCAL nuk do të funksionojë;
  • programi i klientit lidhet me serverin dhe dërgon kërkesa në server. Shpërndarja MySQL DBMS përfshin disa programe klientësh: klientin e konsolës MySQL (më i përdoruri), si dhe mysqldump, mysqladmin, mysqlshow, mysqlimport, etj. Dhe nëse është e nevojshme, mund të krijoni edhe programin tuaj të klientit bazuar në bibliotekën standarde të klientit libmysql, e cila vjen me MySQL DBMS.

Nëse përdorimi i klientit standard MySQL dështon të përdorë deklaratën LOAD DATA LOCAL, atëherë duhet të përdorni çelësin --local-infile:

Mysql --local-infile sampdb mysql> NGARKO TË DHËNAT INFILE LOKALE "member.txt" NË TABLE anëtar;

Ose specifikoni një opsion për klientin në skedarin /my.cnf:

local-infile=1

Është e rëndësishme të theksohet se si parazgjedhje të gjithë klientët dhe bibliotekat e MySQL përpilohen me opsionin --enable-local-infile për të siguruar përputhshmëri me MySQL 3.23.48 dhe më të vjetra, kështu që LOAD DATA LOCAL është zakonisht i disponueshëm për klientët standardë. Sidoqoftë, komandat në serverin MySQL dërgohen kryesisht jo nga tastiera, por nga skriptet, kështu që gjuhët e zhvillimit të uebit kanë gjithashtu klientë për të punuar me bazën e të dhënave, të cilat mund të ndryshojnë në funksionalitet nga klienti standard MySQL.

Sigurisht, kjo veçori e deklaratës LOAD DATA mund të jetë një rrezik sigurie për sistemin, dhe kështu duke filluar me MySQL 3.23.49 dhe MySQL 4.0.2 (4.0.13 në Win) opsioni LOCAL do të funksionojë vetëm nëse klienti dhe serveri lejojeni.

Anashkaloni kufizimet open_basedir

Përdorimi i LOAD DATA mjaft shpesh ju lejon të anashkaloni kufizimet e open_basedir. Kjo mund të jetë e dobishme nëse, për shembull, ne kemi akses në drejtorinë e përbashkët të hostimit të një përdoruesi, por duam të lexojmë skriptet nga drejtoria kryesore e një përdoruesi tjetër. Pastaj duke instaluar këtë skript

1)); $e=$pdo->exec("LOAD TË DHËNAT TË DHËNAT INFILE LOCAL "./rruga/to/file" NË FUSHAT E provës së TABELËS TË PËRFUNDOHEN NGA "__eof__" SHKAKTUARA NGA "" LINJAT E PËRFUNDUARA NGA "__eof__""); $pdo = null; ?>

konkluzioni

Është kureshtare që mundësia e përshkruar e operatorit LOAD DATA është e njohur për të paktën dhjetë vjet. Përmendja e tij, për shembull, mund të gjendet në biletën [#15408] (Safe Mode / MySQL Vuln 2002-02-06), dhe më pas pyetje të ngjashme u shfaqën vazhdimisht në bugs.php.net [#21356] [#23779 ] [#28632] [#31261] [#31711]. Për të cilën zhvilluesit iu përgjigjën fjalë për fjalë si më poshtë:

[email i mbrojtur] Nuk është një gabim, është një veçori :)

Ose i është caktuar një biletë "Statusi: Nuk rregullohet". Ose ishin të kufizuara në arna që nuk zgjidhin pothuajse asgjë. Biletat për këtë temë u ngritën përsëri. Prandaj, metoda e specifikuar e anashkalimit të open_basedir ende funksionon në një numër mjaft të madh serverësh. Sidoqoftë, me ardhjen e drejtuesit të ri mysqlnd, duket se u mor vendimi për të bërë ndryshime të rëndësishme: me cilësimet e paracaktuara, kjo deklaratë nuk do të ekzekutohet më fare [#54158] [#55737]. Le të shpresojmë që në të ardhmen e afërt zhvilluesit do t'i vënë gjërat në rregull në këtë çështje.

NGARKONI TË DHËNAT INFILE "file_name.txt" NË TABELA tbl_name [ MBYLLUR NGA ""] ] [(col_name,...)]

Komanda LOAD DATA INFILE lexon rreshta nga një skedar teksti dhe i fut ato në një tabelë me shpejtësi shumë të lartë. Nëse është specifikuar fjala kyçe LOCAL, atëherë skedari lexohet nga hosti i klientit. Nëse LOCAL nuk është specifikuar, atëherë skedari duhet të jetë në server. (Opsioni LOCAL është i disponueshëm në versionin MySQL 3.22.6 dhe më vonë.)

Nëse skedarët e tekstit që do të lexohen janë të vendosura në server, atëherë për arsye sigurie këta skedarë ose duhet të gjenden në drejtorinë e bazës së të dhënave ose të jenë të lexueshëm nga të gjithë përdoruesit. Përveç kësaj, për të përdorur komandën LOAD DATA INFILE në skedarët e serverit, duhet të keni privilegje FILE në hostin e serverit. Shih seksionin 4.2.7 Privilegjet e dhëna nga MySQL.

Në MySQL 3.23.49 dhe MySQL 4.0.2, komanda LOCAL nuk do të funksionojë nëse daemon mysqld fillon me --local-infile=0 ose nëse klienti nuk ka të aktivizuar mbështetjen LOCAL. Shih seksionin 4.2.4 Konsideratat e sigurisë në lidhje me komandën LOAD DATA LOCAL.

Nëse është specifikuar fjala kyçe LOW_PRIORITY, atëherë ekzekutimi i kësaj komande LOAD DATA do të vonohet derisa klientët e tjerë të kenë përfunduar së lexuari këtë tabelë.

Nëse fjala kyçe CONCURRENT është specifikuar kur punoni me tabelat MyISAM, atëherë threads të tjerë mund të marrin të dhëna nga tabela gjatë ekzekutimit të komandës LOAD DATA. Përdorimi i kësaj veçorie, natyrisht, do të ketë një ndikim të vogël në performancën në LOAD DATA, edhe nëse asnjë lidhje tjetër nuk e përdor tabelën në të njëjtën kohë.

Kur përdorni opsionin LOCAL, ekzekutimi mund të jetë pak më i ngadalshëm sesa lejimi i serverit të aksesojë skedarët drejtpërdrejt, sepse përmbajtja e skedarit duhet të zhvendoset nga hosti i klientit në server. Nga ana tjetër, në këtë rast nuk ka nevojë për privilegje FILE për të ngarkuar skedarët lokalë.

Nëse jeni duke përdorur versione të MySQL para 3.23.24, nuk mund të lexoni nga një FIFO duke përdorur komandën LOAD DATA INFILE. Nëse është e nevojshme të lexohet nga një FIFO (për shembull, prodhimi standard i gunzip), duhet të përdoret LOAD DATA LOCAL INFILE.

Ju gjithashtu mund të ngarkoni skedarët e të dhënave duke përdorur programin mysqlimport. Ky mjet kryen ngarkimin e skedarëve duke dërguar komandat LOAD DATA INFILE në server. Opsioni --local bën që mysqlimport të lexojë skedarët e të dhënave nga hosti i klientit. Mund të specifikoni opsionin --compress për të marrë performancë më të mirë në rrjetet e ngadalta nëse si klienti ashtu edhe serveri mbështesin protokollin e kompresimit të të dhënave.

Në rastet kur skedarët ndodhen në server, ky i fundit vepron sipas rregullave të mëposhtme:

  • Nëse jepet një shteg absolut (i plotë) për një skedar, atëherë serveri e përdor këtë shteg pa modifikim.
  • Nëse specifikohet një shteg relativ i skedarit, duke specifikuar një ose më shumë drejtori, atëherë kërkimi për skedarin do të jetë në lidhje me drejtoritë e specifikuara në drejtorinë e të dhënave të serverit (datadir).
  • Nëse një shteg drejt një skedari jepet pa specifikuar drejtoritë kryesore, atëherë serveri kërkon skedarin në drejtorinë e bazës së të dhënave që përdoret.

Nga kjo rrjedh se skedari i specifikuar si `./myfile.txt" lexohet nga direktoria e të dhënave të serverit, ndërsa skedari i specifikuar si "myfile.txt" lexohet nga direktoria e bazës së të dhënave që përdoret. Për shembull, komanda e mëposhtme LOAD DATA lexon skedarin data.txt në drejtorinë e bazës së të dhënave për db1 sepse db1 është baza aktuale e të dhënave, edhe pse komanda e udhëzon në mënyrë eksplicite që të ngarkojë skedarin në tabelën e bazës së të dhënave db2:

MySQL> PËRDOR db1; mysql> NGARKONI TË DHËNAT INFILE "data.txt" NË TABELA db2.my_table;

Fjalët kyçe REPLACE dhe IGNORE kontrollojnë përpunimin e të dhënave hyrëse që kopjojnë të dhënat ekzistuese me të njëjtat vlera kyçe unike. Nëse specifikohet REPLACE, rreshtat e rinj do të zëvendësojnë rreshtat ekzistues me të njëjtin çelës unik. Nëse specifikoni IGNORE , atëherë rreshtat e hyrjes që kanë të njëjtin çelës unik si ato ekzistuese do të shpërfillen. Nëse asnjë parametër nuk është specifikuar, atëherë ndodh një gabim kur gjendet një vlerë e dyfishtë e çelësit dhe pjesa tjetër e skedarit të tekstit shpërfillet.

Nëse të dhënat po ngarkohen nga një skedar lokal duke përdorur fjalën kyçe LOCAL, atëherë serveri nuk do të jetë në gjendje të ndërpresë transferimin e të dhënave në mes të këtij operacioni, kështu që sjellja e paracaktuar e komandës është e njëjtë me atë kur specifikohet IGNORE.

Kur përdorni LOAD DATA INFILE në tabelat boshe MyISAM, të gjithë indekset jo unike krijohen në një paketë të veçantë (si në RIPAIR). Kjo zakonisht shpejton shumë funksionimin LOAD DATA INFILE në rastin e një numri të madh indeksesh.

Komanda LOAD DATA INFILE është plotësuese e SELECT ... INTO OUTFILE . Shih seksionin 6.4.1 Sintaksa e deklaratës SELECT. Për të shkruar të dhëna nga baza e të dhënave në një skedar, përdorni SELECT ... INTO OUTFILE . Për të lexuar të dhënat përsëri në bazën e të dhënave, përdoret LOAD DATA INFILE. Sintaksa për FIELDS dhe LINES është e njëjtë në të dy komandat. Të dyja pjesët janë opsionale, por nëse të dyja janë të specifikuara, atëherë FIELDS duhet të paraprijë LINES.

Nëse specifikohet FIELDS, atëherë secila prej nënshprehjeve të saj (TEMINATED BY, ENCLOSED BY dhe ESCAPED BY) është gjithashtu opsionale, por të paktën njëra prej tyre duhet të specifikohet.

Nëse pohimi FIELDS nuk është i përcaktuar, atëherë si parazgjedhje parametrat e tij do të marrin vlerat e mëposhtme:

FUSHAT E PËRFUNDUARA NGA "\t" TË MBYLLUR NGA "" TË SHKRUARA NGA "\\"

Nëse klauzola LINES nuk është e përcaktuar, atëherë si parazgjedhje ajo ka strukturën e mëposhtme:

LINJAT E PËRFUNDUARA NGA "\n"

Me fjalë të tjera, me cilësimet e paracaktuara, komanda LOAD DATA INFILE, kur lexoni të dhënat hyrëse, do të funksionojë si më poshtë:

  • Kërkoni për mbaresat e rreshtave si karaktere `\n'
  • Ndani linjat në fusha sipas karaktereve të skedës.
  • Mos prisni që fushat të mbyllen me karaktere thonjëzash.
  • Interpretoni shfaqjen e skedave, vijave të reja ose `\" të paraprira nga `\" si fjalë për fjalë që janë pjesë e vlerës së fushës.

Në të kundërt, nëse janë në fuqi cilësimet e paracaktuara për shkrimin e prodhimit, komanda SELECT ... INTO OUTFILE do të funksionojë si më poshtë:

  • Futni karakteret e skedës midis fushave.
  • Mos i mbyllni fushat në karaktere të cituar. Përdorni karakteret "\" për të shpëtuar nga skeda, rreshti i ri ose "\" që shfaqen midis vlerave të fushës.
  • Futni karaktere të linjës së re në fund të çdo hyrjeje.

Vini re se hyrja FUSHAT E SHKRUARA NGA `\" kërkon dy kthesa të pasme që një vlerë të lexohet si një vijë e prapme e vetme.

Opsioni IGNORE number LINES mund të përdoret për të injoruar titullin e emrave të kolonave në fillim të një skedari:

Mysql> NGARKONI TË DHËNAT INFILE "/tmp/file_name" NË testin e TABELËS INGORO 1 RRESHTA;

Kur përdorni SELECT ... INTO OUTFILE me LOAD DATA INFILE për të lexuar të dhënat nga baza e të dhënave në një skedar dhe më pas nga skedari në bazën e të dhënave, opsionet e përpunimit të fushës dhe rreshtit për të dyja komandat duhet të përputhen. Përndryshe, LOAD DATA INFILE nuk do të jetë në gjendje të interpretojë saktë përmbajtjen e këtij skedari. Supozoni se komanda SELECT ... INTO OUTFILE përdoret për të shkruar në një skedar me fusha të ndara me presje:

Mysql> ZGJIDH * NË FUSHAT E OUTFILE "data.txt" TË PËRFUNDOHEN NGA "," FROM ...;

Mysql> NGARKONI TË DHËNAT INFILE "data.txt" NË TABELA 2 FUSHAT E PËRFUNDUARA NGA ",";

Mysql> NGARKONI INFILET E TË DHËNAVE "data.txt" NË TABELA 2 FUSHAT E PËRFUNDUARA NGA "\t";

Një rezultat i ngjashëm do të fitohej nëse çdo linjë hyrëse do të interpretohej si një fushë e veçantë.

Komanda LOAD DATA INFILE mund të përdoret gjithashtu për të lexuar skedarë nga burime të jashtme. Për shembull, fushat në një skedar të formatit të bazës së të dhënave dBASE do të ndahen me presje dhe do të mbyllen në thonjëza të dyfishta. Nëse rreshtat në këtë skedar përfundojnë me rreshta të rinj, atëherë komanda e mëposhtme mund të përdoret për të shkruar skedarin, i cili ilustron opsionet e cilësimeve që përpunojnë fushat dhe linjat:

Mysql> NGARKONI DOSJEN E TË DHËNAVE "data.txt" NË TABELA tbl_name FUSHAT E PËRFUNDUARA NGA "," TË MBYLLUR NGA RRESHTAT """ TË PËRFUNDOHEN NGA "\n";

Çdo opsion që trajton fushat dhe rreshtat mund të jetë një varg bosh (""). Nëse vargu nuk është bosh, atëherë vlerat e opsioneve FIELDS ENCLOSED BY dhe FIELDS ESCAPED BY duhet të përmbajnë një karakter. Vlerat e opsionit FUSHAT TË PËRFUNDARA NGA dhe LINES TË MUNDERUARA NGA Vlerat e opsionit mund të përmbajnë më shumë se një karakter. Për shembull, për të shkruar rreshta që përfundojnë në çifte ``carriage return - line feed'' (si në skedarët tekst MS DOS ose Windows), duhet të specifikoni shprehjen e mëposhtme: LINES TË PËRFUNDUARA NGA "\r\n" .

CREATE TABLE shakes (një INT NOT NULL AUTO_INCREMENT ÇELËSI PRIMAR, shaka TEXT NOT NULL); NGARKONI TË DHËNAT INFILE "/tmp/jokes.txt" NË shakatë e TABELËS FUSHAT E PËRFUNDUARA NGA ""; RRESHT TË PËRFUNDOHEN NGA "\n%%\n" (shaka);

Opsioni FIELDS ENCLOSED BY kontrollon fushat që janë të mbyllura me karaktere të dhëna. Nëse hiqet parametri OPTIONALLY, atëherë në dalje (SELECT ... INTO OUTFILE) të gjitha fushat do të mbyllen në karakteret e specifikuara në ENCLOSED BY. Një shembull i një prodhimi të tillë (i cili përdor një presje si ndarës i fushës) tregohet më poshtë:

"1","një varg","100.20" "2","një varg që përmban një , presje","102.20" "3","një varg që përmban një \" thonjëza","102.20" "4"," një varg që përmban një \", citat dhe presje", "102.20"

Nëse specifikohet parametri OPTIONALLY, atëherë zgjidhen vetëm fushat e llojeve CHAR dhe VARCHAR me karakterin e specifikuar në ENCLOSED BY:

1"një varg",100.20 2,"një varg që përmban një , presje",102.20 3,"një varg që përmban një "thonjë",102.20 4,"një varg që përmban një "", thonjëza dhe presje",102.20

Ju lutemi vini re se pamja e karaktereve ENCLOSED BY brenda vlerës së fushës shmanget duke aplikuar një parashtesë nga ESCAPED BY përpara tyre. Gjithashtu vini re se nëse ESCAPED BY është null, është e mundur të gjenerohet një dalje që deklarata LOAD DATA INFILE nuk mund ta lexojë saktë. Për shembull, nëse karakteri escape është një varg bosh, atëherë dalja e mësipërme do të jetë siç tregohet më poshtë. Vini re se fusha e dytë në rreshtin e katërt përmban një presje të ndjekur nga një thonjëza, e cila (gabimisht) duket se kufizon fushën e dhënë:

1"një varg",100.20 2,"një varg që përmban një , presje",102.20 3,"një varg që përmban një "thonjë",102.20 4,"një varg që përmban një ", thonjëza dhe presje",102.20

Për hyrje, karakteri ENCLOSED BY, nëse është i pranishëm, hiqet nga të dy skajet e vlerave të fushës. (Kjo është e vërtetë nëse është specifikuar apo jo parametri OPTIONALLY: parametri OPTIONALLY injorohet kur punohet me hyrjen.) Nëse haset një karakter ENCLOSED BY që paraprihet nga një karakter ESCAPED BY, ai interpretohet si pjesë e rrymës së fushës. vlerë. Përveç kësaj, karakteret e dyfishta ENCLOSED BY që ndodhin brenda një fushe interpretohen si karaktere të vetme ENCLOSED BY nëse vetë fusha fillon me atë karakter. Për shembull, nëse specifikohet TË MBYLLUR NGA """, atëherë thonjëzat trajtohen si më poshtë:

Bosi ""BIG"" -> Shefi "I MADH" Shefi "I MADH" -> Shefi "I MADH"

Opsioni FIELDS ESCAPED BY kontrollon shkrimin ose leximin e karaktereve speciale. Nëse karakteri FIELDS ESCAPED BY është jo bosh, ai përdoret si parashtesë për karakteret e mëposhtme në dalje:

  • FUSHAT E SHKRUARA NGA simboli
  • FUSHAT E MBYLLUR ME simbol
  • Karakteri i parë i FUSHAVE TË PËRFUNDUARA NGA dhe LINES TË PËRFUNDUARA NGA
  • Karakteri ASCII 0 (në fakt, ASCII `0" shkruhet pas karakterit të ikjes, jo një bajt me vlerë zero)

Nëse karakteri FIELDS ESCAPED BY është bosh, atëherë asnjë karakter nuk është ikur. Në fakt, nuk ka kuptim të specifikoni një karakter të zbrazët, veçanërisht nëse vlerat e fushës në të dhënat që përpunohen përmbajnë ndonjë nga karakteret në listën e mësipërme.

Nëse karakteri FIELDS ESCAPED BY nuk është bosh, atëherë, në rastin e hyrjes, dukuritë e një karakteri të tillë hiqen dhe karakteri pas një dukurie të tillë merret fjalë për fjalë si pjesë e vlerës së fushës. Përjashtimet janë "0" ose "N" (p.sh. \0 ose \N nëse karakteri i ikjes është `\"). Këto sekuenca interpretohen si ASCII 0 (një bajt me vlerë zero) dhe NULL. Shih rregullat për duke trajtuar një vlerë zero më poshtë. .

Shih seksionin 6.1.1 Literalet: Paraqitja e vargjeve dhe numrave për më shumë informacion mbi sintaksën e karakterit escape `\".

Në disa raste, opsionet e përpunimit të fushës dhe rreshtit ndërveprojnë:

  • Nëse LINES TERMINATED BY është një varg bosh dhe FIELDS TERMINATED BY është një varg jo bosh, atëherë rreshtat gjithashtu përfundojnë me FUSHAT TË PËRFUNDUARA NGA .
  • Nëse të dyja FUSHAT E PËRFUNDARA NGA dhe FUSHAT E MBYLLUR NGA janë bosh (""), atëherë përdoret formati i vargut fiks (pa kufizues). Formati i vargut fiks nuk ofron asnjë ndarës midis fushave. Në vend të kësaj, kur lexoni dhe shkruani vlerat e kolonave, përdoret gjerësia e "daljes"" e kolonave. Për shembull, nëse një kolonë deklarohet si INT(7), vlerat për atë kolonë shkruhen duke përdorur fusha me gjerësi 7 karaktere. Vlerat e hyrjes për këtë kolonë merren duke lexuar 7 karaktere. Formati i vargut fiks ndikon gjithashtu në trajtimin e vlerave NULL (shih më poshtë). Vini re se formati i madhësisë fikse nuk do të funksionojë kur përdorni një grup karakteresh me shumë bajtë.

Vlerat NULL do të trajtohen ndryshe në varësi të opsioneve FIELDS dhe LINES të përdorura:

  • Për vlerat e paracaktuara FIELDS dhe LINES, NULL shkruhet si \N në dalje dhe \N lexohet si NULL në hyrje (duke supozuar se karakteri ESCAPED BY është `\").
  • Nëse FIELDS ENCLOSED BY nuk është bosh, atëherë një fushë vlera e së cilës është një fjalë me shkronja NULL lexohet si një vlerë NULL (në krahasim me një fjalë NULL midis FIELDS ENCLOSED BY karaktere, e cila lexohet si varg "NULL").
  • Nëse FIELDS ESCAPED BY është bosh, NULL shkruhet si fjala NULL.
  • Në formatin e vargut fiks (i cili ndodh nëse të dy specifikuesit FIELDS TERMINATED BY dhe FIELDS ENCLOSED BY janë bosh), NULL shkruhet si varg bosh. Vini re se, si rezultat, vlera NULL dhe vargu bosh në këtë tabelë do të jenë të padallueshme kur shkruhen në skedar, pasi që të dy shkruhen si vargje boshe. Nëse dëshironi që këto vlera të jenë të ndryshme kur skedari lexohet, atëherë nuk duhet të përdorni formatin fiks të vargut.

Disa raste nuk mbështeten nga deklarata LOAD DATA INFILE:

  • Rreshtat me madhësi fikse (FUSHAT E PËRFUNDURA NGA dhe FUSHAT E MBYLLUR NGA janë të dyja boshe) dhe kolonat BLOB ose TEXT.
  • Nëse një kufizues është specifikuar që përputhet ose është një parashtesë e një tjetri, atëherë LOAD DATA INFILE nuk do të jetë në gjendje të interpretojë saktë hyrjen. Për shembull, deklarata e mëposhtme FIELDS do të shkaktojë probleme: FUSHAT E PËRFUNDURA NGA """ TË MBYLLUR NGA """
  • Nëse opsioni FIELDS ESCAPED BY është bosh, atëherë shfaqja e një FUSHA TË MBYLLUR NGA ose LINES TË PËRFUNDARA NGA karakter në një vlerë të fushës, e ndjekur nga një karakter FIELDS TERMINATED BY do të bëjë që komanda LOAD DATA INFILE të përfundojë leximin e fushës ose rreshtit para kohe. Kjo ndodh sepse LOAD DATA INFILE nuk mund të përcaktojë saktë se ku përfundon një fushë ose rresht.

Shembulli i mëposhtëm ngarkon të gjitha kolonat e tabelës së të dhënave të personit:

Mysql> NGARKONI DOSJEN E TË DHËNAVE "persondata.txt" NË të dhënat e personit TABELE;

Lista e fushave nuk është e specifikuar, kështu që komanda LOAD DATA INFILE pret që rreshtat e hyrjes të plotësojnë secilën kolonë të tabelës. Kjo përdor vlerat e paracaktuara FIELDS dhe LINES.

Nëse dëshironi të ngarkoni vetëm disa nga kolonat e tabelës, duhet të specifikoni një listë kolonash:

Mysql> NGARKONI DOSJEN E TË DHËNAVE "persondata.txt" NË të dhënat e personit TABELA (col1,col2,...);

Lista e fushave duhet të specifikohet edhe në rastet kur rendi i fushave në skedarin hyrës ndryshon nga rendi i kolonave në tabelën e dhënë. Përndryshe, MySQL nuk do të jetë në gjendje të hartojë fushat e hyrjes në kolonat e tabelës.

Nëse një rresht ka shumë pak fusha, atëherë kolonat për të cilat nuk ka fusha në skedarin hyrës vendosen në vlerat e tyre të paracaktuara. Caktimi i vlerave të paracaktuara përshkruhet në seksionin 6.5.3 Sintaksa e deklaratës CREATE TABLE.

Vlera e një fushe boshe interpretohet ndryshe nga mungesa e një vlere:

  • Për llojet e vargjeve, kolona vendoset në vargun bosh.
  • Për llojet numerike, kolona vendoset në 0.
  • Për llojet e datës dhe kohës, kolona vendoset në vlerën e duhur "zero" për atë lloj. Shih seksionin 6.2.2 Llojet e të dhënave të datës dhe kohës.

Vini re se këto janë të njëjtat vlera që do të përfundonin në një kolonë duke caktuar në mënyrë eksplicite një varg bosh kolonave të vargut, numrave ose llojeve të datës ose kohës në një deklaratë INSERT ose UPDATE.

Kolonat TIMESTAMP vendosen në datën ose kohën aktuale vetëm nëse kolona është caktuar në NULL ose (vetëm për kolonën e parë TIMESTAMP) nëse kolona TIMESTAMP është jashtë listës së fushës, nëse një listë e tillë është specifikuar.

Nëse vargu i hyrjes ka shumë fusha, atëherë fushat shtesë shpërfillen dhe numri i paralajmërimeve do të rritet.

Komanda LOAD DATA INFILE interpreton të gjitha të dhënat hyrëse si vargje, kështu që nuk mund të specifikoni vlerat numerike për kolonat ENUM ose SET në të njëjtën mënyrë si për komandat INSERT. Të gjitha vlerat ENUM dhe SET duhet të specifikohen si vargje!

Kur përdorni API-në C, mund të merrni informacion rreth një pyetjeje duke thirrur funksionin mysql_info() API në fund të një pyetjeje LOAD DATA INFILE. Më poshtë tregon formatin e linjës së informacionit për këtë rast:

Regjistrime: 1 Fshirë: 0 Kapërcyer: 0 Paralajmërime: 0

Paralajmërimet lëshohen në të njëjtat rrethana si kur shkruani vlera me një komandë INSERT (shih seksionin 6.4.3 Sintaksa e deklaratës INSERT), përveç që komanda LOAD DATA INFILE gjeneron gjithashtu paralajmërime kur ka shumë pak ose shumë fusha në hyrje varg. Paralajmërimet nuk ruhen askund; numri i paralajmërimeve mund të përdoret vetëm për të kontrolluar nëse veprimet e specifikuara janë kryer normalisht. Nëse doni të dini saktësisht se çfarë i shkakton paralajmërimet, atëherë duhet të ZGJIDHNI ... INTO OUTFILE në një skedar tjetër dhe të krahasoni rezultatin me skedarin origjinal të hyrjes - kjo është mënyra e vetme për të marrë këtë informacion.

Nëse ju duhet të NGARKONI TË DHËNAT për të lexuar nga një tub, mund të përdorni trukun e mëposhtëm:

Mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat /nt/mysql/db/x/x mysql -e "LOAD DATA INFILE "x" INTO TABLE x" x

Kur përdorni një version të MySQL më të vjetër se 3.23.25, sa më sipër mund të bëhet vetëm me LOAD DATA LOCAL INFILE .

Për më shumë informacion mbi efikasitetin e INSERT kundrejt LOAD DATA INFILE dhe rritjen e shpejtësisë së LOAD DATA INFILE, shihni seksionin 5.2.9 Shpejtësia e ekzekutimit të pyetjes INSERT.

Komentet e përdoruesve

Postuar nga Jason Titus[Fshi] [Redakto]

"Varlajmërimet nuk ruhen askund; numri i paralajmërimeve mund të përdoret vetëm si një
tregues nëse gjithçka shkoi mirë"

Duhet të bësh shaka me mua. A bëhet kjo si një lloj ndëshkimi i DBA? d.m.th. - Ne
DINI cilat ishin problemet, por do t'ju duhet vetëm të krijoni një skedar dalës dhe të shikoni
miliona të dhënat tuaja për t'i gjetur ato". A nuk MySQL përdori për t'i vendosur këto në regjistrin e gabimeve,
ku bëjnë pjesë? Vazhdo dhe bëje një opsion, por kjo është mjaft problem për ta bërë
kthehem përsëri në Oracle (dhe kjo kërkon shumë).

Postuar nga campbell të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

E dyta që. (!) Unë nuk e kuptoj se si ju
shkruani atë fjali me fytyrë të drejtë.

Postuar nga Jonathon Padfield të premten, 17 maj 2002, @ 6:24 të mëngjesit[Fshi] [Redakto]

Gjithashtu, nuk ka informacion se cilat rreshta janë anashkaluar
jepet.

Postuar nga të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

Kjo veçori është shumë e dobishme kur dërgoni një
INSERT nga një faqe interneti. Nëse përdoruesi godet
rifreskoni dhe ripostoni të dhënat e formës që rezulton në a
INSERT pasues i të njëjtit të dhëna kyçe parësore,
bum, aplikacioni prishet. Në këtë mënyrë, përdoruesi mund
goditi F5 derisa fytyra e tyre të bëhet blu, dhe ata
nuk do të thyejë deklaratën REPLACE.

[Fshi] [Redakto]

Unë kam një dosje MyDB në c:\mysql\data
Vendos atje Data.txt dhe kur ekzekutoj
NGARKONI TË DHËNAT NË TABELA INFILE LOKALE "Data.txt".
MyTable thotë: Komanda është ekzekutuar me sukses
por NUK shtohen vlera në MyTable.
Unë jam nën W2K

Postuar nga van hoof philip të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

Unë dua të sinkronizoj bazën time të të dhënave me një tjetër
databaza herë pas here. Kjo do të thotë se unë
do të duhet të përdorë gjënë REPLACE. Por çfarë lidhje me
regjistrime që nuk ekzistojnë më në të rejat
bazën e të dhënave. A do të fshihen në MySQL?
A ka ndonjë mënyrë për t'i fshirë ato automatikisht? Apo është
zgjidhja e vetme për të hequr tabelën time MySQL dhe për të rikrijuar
para se të filloj LOAD"in e tij. Unë jam duke përdorur crontab
skriptet për këtë operacion, kështu që nuk ka ndërveprim njerëzor
është e mundur gjatë këtyre operacioneve.

Postuar nga të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

Dokumentacioni është i paqartë se çfarë
përbën një çelës/indeks "unik" në këtë fushë. Ajo
referenca prapa për "insert", por insert jo
kanë një kufizim të tillë. E kam gjetur atë parësore
çelësat janë mjaft unikë, por më është dashur të shtoj
primare aty ku nuk i doja.Ndoshta jam
dicka mungon....

Postuar nga të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

Është shumë zhgënjyese të marrësh paralajmërime kur është
importimi i të dhënave në një bazë të dhënash MySQL
në gjendje të aksesojë çdo informacion në lidhje me paralajmërimet.
MySQL me të vërtetë duhet të shtojë një veçori që do
raportoni se për çfarë është një paralajmërim dhe jo vetëm
raportoni një paralajmërim. Idealisht informacioni rreth
paralajmërimi duhet të jepet menjëherë. Në
duhet të jetë së paku një lloj regjistri i gabimeve
krijuar që një përdorues mund të aksesojë.

Postuar nga të premten, 17 maj 2002, @ 6:24[Fshi] [Redakto]

Në temën "F5 derisa fytyra e tyre të bëhet blu" ...

Kjo duhet të trajtohet në aplikacion. Ajo
sigurisht nuk është e dëmshme t'i thuash përdoruesit, "Ti" ke
tashmë ka hyrë në këtë. Ju lutemi ndaloni freskimin."

Në fakt, për shkak të numrit të fund hiperaktiv
humbës atje, kjo duket si një veçanërisht
ide e mirë.

Postuar nga Larry Irwin të martën, 20 gusht 2002, @11:50[Fshi] [Redakto]

Do të ishte shumë e dobishme të kishim një opsion shtesë
te "INGJORONI KUFIZIMET" gjatë ngarkimit
procesi.

Postuar nga e enjtja, 5 shtator 2002, @ 01:34[Fshi] [Redakto]

Ka një kapje me "në një tryezë të zbrazët MyISAM, të gjitha
indekset jo unike krijohen në një grup të veçantë"
meqenëse mekanizmi i përdorur është një "riparim me
keycache" e cila mund të jetë shumë e ngadaltë nëse keni shumë
indekset. Njeriu me të vërtetë duhet të përdorë mekanizmin për të
ndaloni krijimin e çelësave dhe më pas bëni riparimin me të
myisamchk duke përdorur "riparimin me renditje" siç përshkruhet në
seksioni 5.2.9 (nëse mund ta bëni të funksionojë:-()

Postuar nga e mërkurë, 9 tetor 2002, @ 12:43[

Sintaksa LOAD DATA INFILE

NGARKO INFILET E TË DHËNAVE" Emri i skedarit. txt" NË TABELA emri_tabele
[MBYLLUR NGA"]
]
]
[(emri_kolona,...)]
Deklarata LOAD DATA INFILE lexon rreshta nga një skedar teksti dhe i ngarkon ato në një tabelë me shpejtësi shumë të lartë.
Ju gjithashtu mund të ngarkoni skedarët e të dhënave duke përdorur mjetin e importit mysql. Ai funksionon duke dërguar një deklaratë të të dhënave LOAD INFILE në server. Opsioni --local bën që mjeti mysqlimport të lexojë skedarin e të dhënave nga hosti i klientit. Mund të specifikoni opsionin -compress për të përmirësuar performancën në rrjetet e ngadalta nëse klienti dhe serveri mbështesin protokollin e ngjeshur.
Nëse është specifikuar fjala kyçe LOW_PRIORITY, ekzekutimi i deklaratës LOAD DATA vonohet derisa të gjithë klientët e tjerë të kenë përfunduar leximin.
Nëse fjala kyçe CONCURRENT specifikohet me një tabelë MyISAM që plotëson kushtin e futjeve paralele (d.m.th., nuk ka blloqe të lira në mes të skedarit), atëherë thread-et e tjera do të jenë në gjendje të marrin të dhëna nga tabela në të njëjtën kohë që LOAD DATA është ekzekutuar. Përdorimi i këtij opsioni ka një ndikim të vogël të performancës në LOAD DATA, edhe nëse asnjë lidhje tjetër nuk punon me këtë tabelë.
Nëse është specifikuar fjala kyçe LOCAL, ajo i referohet anës së klientit të lidhjes.

  1. Nëse është specifikuar fjala LOCAL, skedari lexohet nga programi i klientit në hostin e klientit dhe dërgohet në server.
  2. Nëse fjala LOCAL nuk është specifikuar, skedari i ngarkuar duhet të qëndrojë në hostin e serverit dhe të lexohet drejtpërdrejt nga serveri.

LOCAL është i disponueshëm në MySQL 3.22.6 dhe më vonë.
Për arsye sigurie, kur lexoni skedarë teksti të vendosur në server, skedarët ose duhet të jenë në drejtorinë e të dhënave ose të jenë të lexueshëm nga të gjithë. Gjithashtu, për të përdorur LOAD DATA me skedarët e serverit, duhet të keni privilegjin FILE.
Shkarkimi me opsionin LOCAL është disi më i ngadalshëm sesa kur i jepni serverit mundësinë për të hyrë drejtpërdrejt në skedarët e shkarkuar, sepse në këtë rast përmbajtja e skedarëve transferohet në rrjet përmes serverit klient-ser në lidhjen e duhur. Nga ana tjetër, nuk keni nevojë për privilegje FILE në këtë rast.
Duke filluar me MySQL 3.23.49 dhe MySQL 4.0.2 (4.0.13 në Windows), LOCAL funksionon vetëm nëse klienti dhe serveri e lejojnë atë. Për shembull, nëse mysqld niset me opsionin -local-inf ile=0, atëherë LOCAL nuk do të funksionojë.

Nëse keni nevojë të përdorni LOAD DATA për të lexuar nga një tub programi, mund të përdorni teknikën e mëposhtme:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
Mace< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "NGARKONI DOSJEN E TË DHËNAVE "x1 NË TABELA x" x
Nëse po ekzekutoni një version të MySQL para 3.23.25, kjo teknikë mund të përdoret vetëm me LOAD DATA LOCAL INFILE.
Nëse keni një version të MySQL më herët se 3.23.24, nuk do të jeni në gjendje të lexoni duke përdorur deklaratën LOAD DATA INFILE nga një FIFO. Nëse keni nevojë të lexoni nga një FIFO (p.sh. dalje gunzip), përdorni në vend të kësaj LOAD DATA LOCAL INFILE.
Kur kërkoni për një skedar në sistemin e tij të skedarëve, serveri udhëhiqet nga rregullat e mëposhtme:

  1. Nëse specifikohet një shteg absolut, serveri e përdor atë ashtu siç është.
  2. Nëse jepet një shteg relativ me një ose më shumë komponentë kryesorë, serveri kërkon skedarë në lidhje me direktorinë e tij të të dhënave.
  3. Nëse jepet një emër skedari pa komponentë të shtegut kryesor, serveri e kërkon skedarin në direktorinë e të dhënave të paracaktuar të bazës së të dhënave.

Vini re se këto rregulla nënkuptojnë se një skedar me emrin ./myfile.txt lexohet nga direktoria e të dhënave të serverit, ndërsa një skedar me emrin myfile,txt lexohet nga direktoria e paracaktuar e të dhënave të bazës së të dhënave. Për shembull, deklarata e mëposhtme LOAD DATA INFILE lexon skedarin data.txt nga drejtoria e të dhënave të bazës së të dhënave dbl sepse dbl është baza aktuale e të dhënave, edhe pse deklarata po ngarkon të dhënat në bazën e të dhënave db2:
mysql> PËRDORIMI dbl;
mysql> NGARKONI TË DHËNAT INFILE "data.txt" NË TABELA db2.my_table;
Fjalët kyçe REPLACE dhe IGNORE kontrollojnë trajtimin e vargjeve hyrëse që dublojnë çelësat unikë ekzistues sipas vlerës.
Nëse specifikohet REPLACE, rreshtat e hyrjes zëvendësojnë rreshtat ekzistues (me fjalë të tjera, rreshtat që kanë të njëjtat vlera kryesore ose unike si rreshtat ekzistues në tabelë). Shihni Sintaksën REPLACE
Nëse specifikohet IGNORE, atëherë rreshtat e hyrjes që kopjojnë rreshtat ekzistues me të njëjtat vlera kryesore ose unike nuk merren parasysh. Nëse asnjë opsion nuk është specifikuar, atëherë sjellja varet nëse është specifikuar fjala kyçe lokale. Në mungesë të LOCAL, gjenerohet një gabim nëse gjendet një çelës i kopjuar dhe pjesa e mbetur e skedarit të tekstit shpërfillet. Nëse LOCAL është i pranishëm, sjellja e paracaktuar është e njëjtë sikur të ishte specifikuar IGNORE. Kjo është për shkak se serveri nuk është në gjendje të ndalojë transferimin e skedarëve ndërsa ky operacion është në proces.
Nëse dëshironi të injoroni kufizimet e çelësit të huaj gjatë një operacioni të ngarkimit të të dhënave, mund të lëshoni një deklaratë SET FOREIGN_KEY_CHECKS=0 përpara se të ekzekutoni LOAD DATA.
Nëse ekzekutoni LOAD DATA në një tabelë të zbrazët MyISAM, të gjithë indekset jo unike krijohen në një punë të veçantë (si për TABELA RIPARIMI). Kjo zakonisht rezulton që LOAD DATA të jetë shumë më i shpejtë kur ka shumë indekse. Kjo është përgjithësisht shumë e shpejtë, por në disa raste të veçanta mund të krijoni indekse edhe më shpejt duke i fikur me ALTER TABLE.

skedari në tabelë, duke rikrijuar indekset dhe duke i mundësuar ato me ALTER TABLE.. . ENABLE KEYS pasi ngarkimi të ketë përfunduar.
LOAD DATA INFILE është një shtesë për SELECT.. .INTO OUTFILE. Shihni SELECT Sintaksë Për të shkruar të dhëna nga një tabelë në një skedar, përdorni SELECT... INTO OUTFILE. Për të lexuar të dhënat nga një skedar në një tabelë, përdorni LOAD DATA INFILE. Sintaksa e konstruksioneve FIELDS dhe LINES është e njëjtë për të dy deklaratat. Të dyja këto konstruksione janë opsionale, por fushat duhet t'i paraprijnë LINES nëse të dyja janë të specifikuara.
Nëse konstrukti FIELDS është specifikuar, atëherë të gjithë parametrat e tij (TERMINATED BY, ENCLOSED BY dhe ESCAPED BY) janë gjithashtu opsionale, me përjashtim të kërkesës që të paktën një parametër duhet të jetë i pranishëm.
Nëse konstrukti FIELDS nuk është i specifikuar, ai paracaktohet në:
FUSHAT E PËRFUNDUARA NGA "tf MBYLLUR NGA "Escaped BY"
Nëse LINES nuk është specifikuar, parazgjedhja është:
LINJAT E PËRFUNDUARA NGA "n! DUKE FILLUAR NGA"
Me fjalë të tjera, sjellja e paracaktuar e LOAD DATA INFILE gjatë leximit të hyrjes është:

  1. Kërkoni ndarësit e vijave në fillim të rreshtave.
  2. Mos anashkaloni asnjë parashtesë vargu.
  3. Ndani një rresht në fusha sipas karaktereve të skedës.
  4. Mos prisni që fushat të kuotohen.
  5. Interpretoni shfaqjen e një skede, rreshti të ri ose "\" të paraprirë nga një \ si karaktere fjalë për fjalë që janë pjesë e vlerës së fushës.

Anasjelltas, SELECT ... INTO OUTFILE sillet si kjo si parazgjedhje:

  1. Shkruan skedat midis fushave.
  2. Nuk i rrethon vlerat e fushës me thonjëza.
  • Përdor *" për të theksuar skedat, linjat e reja ose "\" që ndodhin brenda vlerave të fushës.
  • Shkruan një karakter të vijës së re në fund të rreshtave.
Vini re se shkrimi FIELDS ESCAPED BY "W do të kërkonte dy kthesa të pasme për vlerat që duhet të lexojnë një vijë të prapme të vetme.
Në një shënim!
Nëse keni krijuar një skedar teksti në një sistem Windows, mund t'ju duhet të specifikoni LINES NDËRFAQUR NGA "rn për të lexuar saktë skedarin, pasi programet e Windows zakonisht përdorin këto dy karaktere si ndarës rreshtash. Disa programe, si WordPad, mund të përdorin karakterin "r " si ndarës rreshtash Për të lexuar skedarë të tillë, përdorni LINES TË PËRFUNDURA NGA "r".
Nëse të gjitha rreshtat e skedarit që lexohet kanë një parashtesë të përbashkët që dëshironi ta shpërfillni, përdorni RRESHTAT QË FILLON NGA " string_prefiksat për të kapërcyer këtë parashtesë. Nëse vargu nuk përmban një parashtesë, ai anashkalohet në tërësi.

Opsioni IGNORE numri LINES përdoret për të injoruar një numër të caktuar rreshtash në fillim të një skedari. Për shembull, mund të përdorni IGNORE I LINES për të kapërcyer rreshtin kryesor që përmban emrat e kolonave:
mysql> LOAD DATA INFILE "/tmp/test.txt" -> NË TABELA testimi INGO 1 RRESHT;
Kur përdorni SELECT... INTO OUTFILE në lidhje me LOAD DATA INFILE për të shkruar të dhëna nga baza e të dhënave në një skedar dhe më pas lexoni dhe ngarkoni përsëri në bazën e të dhënave, opsionet e kontrollit të rreshtit dhe fushës për të dy deklaratat duhet të përputhen. Përndryshe, LOAD DATA INFILE nuk do të jetë në gjendje të interpretojë saktë përmbajtjen e skedarit të tekstit. Le të supozojmë se ju nxirrni të dhëna në një skedar teksti duke përdorur SELECT.. .INTO OUTFILE, duke i ndarë fushat me presje:
mysql> ZGJIDH* INTO OUTFILE "data.txt" -> FUSHAT E PËRFUNDUARA NGA"," -> NGA tabela2;
Për të lexuar përsëri një skedar të ndarë me presje, gjëja e duhur që duhet të bëni është:
mysql> LOAD INFILE TË TË DHËNAVE "data.txt1 NË TABELA 2 -> FUSHAT E PËRFUNDUARA NGA
Nëse në vend të kësaj provoni ta lexoni me deklaratën më poshtë, nuk do të funksionojë sepse LOAD DATA INFILE do të kërkojë skeda midis vlerave të fushës:
mysql> NGARKONI INFILE TË TË DHËNAVE "data.txt" NË TABELA 2 -> FUSHAT E PËRFUNDUARA ME "t";
Rezultati më i mundshëm do të ishte interpretimi i vargut të hyrjes si një fushë e vetme.
LOAD DATA INFILE mund të përdoret gjithashtu për të lexuar skedarë nga burime të jashtme. Për shembull, një skedar mund të ketë fusha të ndara me presje dhe të mbyllura në thonjëza të dyfishta. Nëse linjat në një skedar ndahen nga një karakter i linjës së re, shembulli i mëposhtëm ilustron se cilat opsione të ndarjes së rreshtave dhe kolonave duhet të vendosen për të ngarkuar një skedar:
mysql> NGARKONI INFILET E TË DHËNAVE "data.txt" NË TABELEemri_tabele-> FUSHAT E PËRFUNDUARA NGA 1,1 TË MBYLLUR NGA "" -> LINJAT E PËRFUNDUARA NGA"n";
Çdo opsion që specifikon përcaktuesit e rreshtave dhe kolonave mund t'i jepet vargje boshe ("") si argumente. Nëse argumentet nuk janë vargje boshe, atëherë vlerat PËR FUSHAT E MBYLLUR DHE FUSHAT E SHKRUARA NGA DUHET të jenë OPCIONE ME NJË KARAKTER. FUSHAT E PËRFUNDUARA OPCIONE Argumentet BY, RREZAT QË FILLOHEN NGA dhe RRESHTAT E PËRFUNDURA ME mund të jenë më shumë se një karakter.
Për të lexuar një skedar të ndarë me rreshta me %% karaktere, mund të bëni sa më poshtë:
mysql> KRIJON shaka në TABELË
-> (një ÇELËS KRYESOR INT NOT NULL AUTO_INCREMENT, -> TEKSTI i shakasë NUK NULL);

mysql> LOAD INFILE TË TË DHËNAVE "/tmp/shaka,txf NË TABELA -> FUSHAT E PËRFUNDUARA NGA "" -> RRESHT TË PËRFUNDOHEN NGA "\n%%\n" (shaka);
FUSHAT E MBYLLUR NGA kontrollon përcaktuesit e fushave (thonjëza). Në dalje (ZGJEDHJE ... INTO OUTFILE), nëse e lini fjalën OPTIONALY, të gjitha fushat do të rrethohen nga karakteri i specifikuar në ENCLOSED BY. Një shembull i një prodhimi të tillë (duke përdorur një presje si ndarës i fushës) tregohet më poshtë:
"1", "një varg", "100.20"
"2", "një varg që përmban një presje", "102.20"
"3", "një varg që përmban një \" citat","102.20"
"4", "një varg që përmban një \", thonjëza dhe presje","102.20"
Nëse specifikoni OPTIONALLY, atëherë karakteri ENCLOSED BY zbatohet vetëm për citimin e fushave CHAR dhe VARCHAR:
1 "një varg", 100.20
3,"një varg që përmban një "citate",102.20
4 "një varg që përmban një \", thonjëza dhe presje",102.20
Vini re se dukuritë e karakterit të specifikuar në ENCLOSED BY brenda vlerës së fushës paraprihen nga karakteri i specifikuar në ESCAPED BY. Gjithashtu, nëse specifikoni një vlerë boshe për ESCAPED BY, është e mundur që të krijohet një skedar që LOAD DATA INFILE nuk arrin të ngarkojë saktë.
Për shembull, nëse karakteri i anulimit lihet bosh, dalja e mësipërme do të duket si ajo më poshtë. Është e lehtë të shihet se fusha e dytë në rreshtin e katërt përmban një presje të ndjekur nga një thonjëza, e cila (gabimisht) do të dukej si një ndarës fushash.
1 "një varg", 100.20
2"një varg që përmban një presje",102.20
3,"një varg që përmban një "citate",102.20
4,"një varg që përmban një ", thonjëza dhe presje",102.20
Në hyrje, karakteri ENCLOSED BY, nëse është i pranishëm, hiqet nga fundi i vlerës së fushës. (Kjo është e vërtetë pavarësisht nëse është specifikuar apo jo fjala OPTIONALY. Kjo fjalë nuk ka asnjë efekt në interpretimin e hyrjes.) Ndodhja e karaktereve ENCLOSED BY të paraprira nga një karakter ESCAPED BY interpretohet si pjesë e vlerës aktuale të fushës.
Nëse një fushë fillon me një karakter ENCLOSED BY, shembujt e atij karakteri interpretohen si përfundime të vlerës së fushës vetëm nëse ato pasohen nga një fushë ose sekuencë TERMINATED BY. Për të shmangur paqartësinë kur një karakter ENCLOSED BY shfaqet brenda një vlere fushe, ai karakter mund të dyfishohet dhe do të interpretohet si një shembull i vetëm i karakterit. Për shembull, nëse specifikohet TË MBYLLUR NGA "", thonjëzat trajtohen si më poshtë:
Bosi ""BIG"" -> Shefi "I MADH" Shefi "I MADH" -> Shefi "I MADH"
FUSHAT E SHKRUARA NGA kontrollon leximin ose shkrimin e karaktereve speciale. Nëse argumenti FIELDS ESCAPED BY nuk është bosh, ai përdoret si parashtesë për karakteret e mëposhtme në dalje:

  1. FUSHAT E SHKRUARA NGA karakteri.
  2. FUSHAT E MBYLLUR NGA karakteri.
  3. Karakteri i parë i FUSHAVE TË PËRFUNDUARA NGA DHE LINES TË PËRFUNDUARA NGA sekuencat.
  4. ASCII 0 (i cili shkruhet pas karakterit anulues si një ASCII "0", jo një bajt null).

Nëse karakteri FIELDS ESCAPED BY është bosh, asnjë karakter nuk paraprihet nga karakteret e ikjes dhe NULL del si NULL, jo \N. Ndoshta nuk është një ide e mirë të lini bosh argumentin FIELDS ESCAPED BY, veçanërisht nëse vlerat e fushës tuaj të të dhënave përmbajnë ndonjë nga karakteret e përmendura.
Në hyrje, nëse FIELDS ESCAPED BY nuk është bosh, atëherë kur ai karakter shfaqet në vargun e vlerave, ai hiqet dhe karakteri pas tij lexohet fjalë për fjalë si pjesë e vlerës së fushës. Përjashtimet janë "0" ose "N" (SYS-PAGE-CONTENT ose \N nëse "\" është karakteri i ikjes). Këto sekuenca interpretohen si ASCII NUL (zero bajt) dhe NULL, përkatësisht. Rregullat për trajtimin e NULL përshkruhen më vonë në këtë seksion.
Më shumë informacion mbi sintaksën e anulimit "\" mund të gjeni në seksionin Vlerat Literale
Në disa raste, opsionet që kontrollojnë fushat dhe rreshtat ndërveprojnë me njëra-tjetrën:

  1. Nëse një varg bosh është specifikuar për LINES TERMINATED BY dhe FIELDS TERMINATED BY është jo bosh, atëherë LINES TERMINATED BY shërben gjithashtu si ndarës i rreshtave.
  2. NËSE FUSHAT E PËRFUNDUARA NGA DHE FUSHAT E MBYLLUR NGA janë të dyja bosh, përdoret formati i vargut fiks (pa kufizues). Ky format nuk përdor asnjë ndarës midis fushave (por mund të keni një ndarës rreshtash). Në vend të kësaj, vlerat e kolonës shkruhen dhe lexohen duke përdorur gjerësinë e shfaqjes së kolonës. Për shembull, nëse një kolonë deklarohet si INT(7), vlerat e kolonës shkruhen në një fushë me shtatë karaktere. Ndërsa shkruani, vlerat e kolonës merren duke lexuar shtatë karaktere.

LINES TERMINATED BY përdoret ende për të ndarë linjat. Nëse një rresht nuk i përmban të gjitha fushat, pjesa tjetër e kolonave vendosen në vlerat e tyre të paracaktuara. Nëse nuk keni një terminator të linjës, vlera e tij duhet të vendoset në 1". Në këtë rast, skedari i tekstit duhet të përmbajë të gjitha fushat në secilën rresht. Formati me gjatësi fikse të linjës trajton gjithashtu vlerat NULL, siç përshkruhet më poshtë. Vini re se gjatësia e formatit të linjës fikse nuk funksionon nëse përdoret një grup karakteresh me shumë bajtë (për shembull, Unicode).
Trajtimi i vlerave NULL ndryshon në varësi të opsioneve FIELDS dhe LINES të përdorura:

  1. Me vlerat e paracaktuara FIELDS dhe LINES, NULL shkruhet si një vlerë e fushës si \N në dalje, dhe e njëjta vlerë \N lexohet si NULL në hyrje (duke supozuar se karakteri ESCAPED BY është vendosur në "\")-
  2. Nëse FIELDS ENCLOSED BY nuk është bosh, atëherë fusha që përmban fjalën fjalë për fjalë NULL lexohet si vlerë NULL. Kjo është e ndryshme nga rasti kur fjala NULL është e kufizuar në FUSHAT E MBYLLUR NGA karaktere, ku vlera lexohet si varg "NULL".
  3. Nëse FIELDS ESCAPED BY është bosh, NULL shkruhet si fjala NULL.
  • Me një format fiks të vargut (që ndodh kur të dyja FUSHAT E PËRFUNDARA NGA dhe FUSHAT E MBYLLUR NGA janë bosh), NULL shkruhet si një varg bosh. Vini re se kjo bën që vlerat NULL dhe rreshtat bosh në tabelë të bëhen të padallueshme kur shkruhen në skedar, pasi që të dy shkruajnë rreshta null. Nëse keni nevojë të bëni dallimin midis të dyjave, shmangni përdorimin e formatit të gjatësisë së linjës fikse.
    Më poshtë janë disa raste që nuk mbështeten nga LOAD DATA INFILE:
    1. Vargjet me gjatësi fikse (FUSHAT E PËRFUNDUARA NGA DHE FUSHAT E MBYLLURA NGA janë nyc) kur ka kolona të tipit TEXT ose BLOB.
    2. Nëse specifikoni një ndarës që përputhet me prefiksin e një tjetri, LOAD DATA INFILE nuk mund të interpretojë saktë rrjedhën hyrëse. Për shembull, opsioni i mëposhtëm do të çojë në probleme:

    FUSHAT E PËRFUNDUARA NGA ""E MBYLLUR NGA""

    • Nëse FIELDS ESCAPED BY është bosh, vlerat e fushës që përfshijnë karakteret FUSHAT E MBYLLUR NGA OSE LINJAT E PËRFUNDARA NGA të ndjekura nga LINES TË PËRFUNDUARA NGA do të bëjnë që LOAD DATA INFILE të ndalojë së lexuari skedarin ose rreshtin shumë shpejt. Kjo do të ndodhë sepse LOAD DATA INFILE nuk mund të përcaktojë saktë se ku përfundon vlera e fushës ose e rreshtit. Shembulli i mëposhtëm ngarkon të gjitha kolonat e tabelës së të dhënave të personit: mysql> NGARKONI DOSJEN E TË DHËNAVE "persondata.txt" NË të dhënat e personit TABELE;
      Si parazgjedhje, nëse nuk ofrohet asnjë listë kolonash në fund të deklaratës LOAD DATA INFILE, rreshti i hyrjes pritet të përmbajë fusha për secilën kolonë të tabelës. Nëse dëshironi të ngarkoni vetëm disa nga kolonat e tabelës, specifikoni një listë kolonash:
      mysql> NGARKO INFILE TË TË DHËNAVE "persondata.txt1
      -> INTO TABLE të dhënat e personit(coll,col2,...);
      Duhet të specifikoni gjithashtu një listë kolonash nëse rendi i fushave në skedarin hyrës është i ndryshëm nga rendi i kolonave në tabelë. Përndryshe, MySQL nuk do të jetë në gjendje të hartojë fushat e hyrjes në kolonat e tabelës.
      Nëse skedari i hyrjes ka shumë pak fusha për rresht, atëherë kolonave që mungojnë do t'u caktohen vlerat e paracaktuara. Caktimi i vlerave të paracaktuara përshkruhet në seksionin CREATE TABLE Sintaksa.
      Vlerat e fushave boshe interpretohen ndryshe nga ato që mungojnë:
      1. Për llojet e vargjeve, një varg bosh i caktohet kolonës.
      2. Për llojet numerike, kolonës i caktohet 0.
      3. Për llojet e datës dhe kohës - kolona vendoset në llojin e duhur
        vlerë "nul". Shih Llojet e datës dhe kohës

      Këto janë të njëjtat vlera që rezultojnë nga caktimi i qartë i një vargu bosh në kolonat e këtyre llojeve në një deklaratë INSERT ose UPDATE.
      Vlerat e kolonës TIMESTAMP vendosen në datën dhe kohën aktuale vetëm nëse janë vendosur në NULL (d.m.th., \N), ose nëse një kolonë e atij lloji hiqet nga lista e fushave, nëse lista e fushave është dhënë.

      LOAD DATA INFILE trajton të gjitha hyrjet si një varg, kështu që nuk mund të përdorni vlera numerike për kolonat ENUM ose SET, siç lejohet në deklaratat INSERT. Të gjitha vlerat ENUM ose SET duhet të specifikohen si vargje!
      Kur deklarata LOAD DATA INFILE përfundon, ajo kthen një varg informacioni në formatin e mëposhtëm:
      Regjistrime: I Fshirë: 0 Kapërceu: 0 Paralajmërime: O
      Nëse jeni duke punuar me C API, mund të merrni informacion në lidhje me këtë deklaratë duke thirrur funksionin mysql_info().
      Paralajmërimet që shfaqen në kushte të caktuara janë të njëjta si kur futni vlera me deklaratën INSERT (shih seksionin 6.1.4), përveç se LOAD DATA INFILE gjeneron gjithashtu paralajmërime se ka shumë pak ose shumë pak në skedarin hyrës. shumë fusha. Paralajmërimet nuk ruhen askund, numri i paralajmërimeve mund të përdoret vetëm si një tregues se gjithçka shkoi mirë.
      Duke filluar me MySQL 4.1.1, mund të përdorni SHOW WARNINGS për të renditur paralajmërimet e para max_error_count si informacion rreth çfarë ngarkimi shkoi keq. Shih sintaksën SHPALL PARALAJMËRIME
      Përpara MySQL 4.1.1, vetëm numri i paralajmërimeve ishte një tregues se ngarkesa nuk po funksiononte pa probleme. Nëse merrni një paralajmërim dhe dëshironi të dini saktësisht pse ndodhi, mënyra e vetme për ta bërë këtë është të përdorni SELECT.. .INTO OUTFILE për të hedhur skedarin e tabelës në një skedar tjetër dhe për ta krahasuar atë me skedarin hyrës origjinal.

Lundrimi në tutorial: 1.1 Çfarë është MySQL? 1.2 Pse të përdorni MySQL? 1.3 Sa e qëndrueshme është MySQL? 1.4 Sa të mëdha mund të jenë tabelat MySQL? 1.5 MySQL, MySQL AB, MySQL-MAX: çfarë është? 1.6 Në cilat sisteme operative funksionon MySQL? 1.7 Shpërndarjet MySQL 1.8 Kërkesat e linjës së komandës MySQL 2.1 Hyrje në MySQL 2.2 Lidhja me serverin MySQL 2.3 Futja e pyetjeve në MySQL 2.4 Krijimi dhe përdorimi i bazave të të dhënave 2.5 Krijimi i një baze të dhënash MySQL 2.6 Krijimi i një tabele MySQL 2. Zgjidhja e të dhënave në një tabelë MySQL2. Tabela MySQL 2.9 Zgjedhja e rreshtave specifike nga një tabelë MySQL 2.10 Përzgjedhja e kolonave arbitrare nga një tabelë MySQL 2.11 Renditja e rreshtave nga një tabelë MySQL 2.12 Llogaritja e datave në një tabelë MySQL 2.13 Puna me vlera NULL në një tabelë MySQL2. Modelet SQL. 2.15 Numërimi i rreshtave në shabllonet SQL. Funksioni COUNT() 2.16 Përdorimi i tabelave të shumta në një pyetje SQL 2.17 Marrja e informacionit rreth bazave të të dhënave dhe tabelave MySQL 2.18 Shembuj të pyetjeve të zakonshme në MySQL 2.19 Vlera maksimale për një kolonë MySQL 2.20 Cili rresht ruan maksimumin e një kolone të caktuar MySQL Maximum 2. në një grup MySQL 2.22 B cili rresht MySQL është vlera maksimale sipas grupit? 2.23 Përdorimi i variablave të përdoruesit në MySQL 2.24 Përdorimi i klientit MySQL në modalitetin e grupit 3.1 Vargjet në MySQL 3.2 Numrat në MySQL. Si të shkruani numra në MySQL? 3.3 Vlerat heksadecimal në MySQL 3.4 Vlerat NULL në MySQL 3.5 Emrat e bazës së të dhënave, tabelave, indekseve, kolonave dhe pseudonimeve në MySQL 3.6 Ndjeshmëria e rasteve në emrat e MySQL 3.7 Variablat e përdoruesit në MySQL 3.8 Komentet në MySQL .SQL39SQL . redundancy 4.2 MySQL BACKUP TABLE syntax 4.3 MySQL RESTORE TABLE syntax 4.4 MySQL CHECK TABLE syntax 4.5 MySQL REPAIR TABLE syntax 4.6 MySQL OPTIMIZE TABLE syntax 4.7 MySQL ANALYZE TABLE syntax 4.8 MySQL FLUSH syntax 4.9 MySQL KILL syntax 4.10 MySQL SHOW syntax MySQL 4.11 Синтаксис SHOW TABLE STATUS в MySQL 4.12 Синтаксис SHOW STATUS в MySQL 4.13 Синтаксис SHOW VARIABLES в MySQL 4.14 back_log 4.15 character_set, character_sets, concurrent_inserts 4.16 connect_timeout, delay_key_write, delayed_insert_limit 4.17 delayed_insert_timeout, delayed_queue_size, flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_time jashtë, 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 Llojet e kolonave në MySQL 5.2 Llojet numerike në MySQL 5.3 Llojet e datës dhe kohës në MySQL 5.4 Y2K (2000) Llojet e botimit dhe datave në MySQL 5.5 MySQL Llojet DATETIME, DATE dhe TIMESTAMP 5.6 MySQL TIME Lloji 5.7 MySQL Lloji YEAR 5.8 MySQL CHAR dhe lloje vargjesh VARCHAR 5.9 MySQL BLOB dhe Llojet e vargjeve TEXT 5.10 MySQL Lloji i vargut MySQL ENUM 1111 për llojin tim të drejtë5. kolona 5.13 Përdorimi i llojeve të kolonave nga DBMS-të e tjera për MySQL 5.14 Kërkesat e memories për kolonat MySQL 6.1 Funksionet për përdorimin e MySQL në SELECT dhe WHERE 6.2 Operatori i kllapave të pashtypura në MySQL 6.3 Operatori i krahasimit të pashtypshëm në MySQL Funksioni në MySQL Funnctions64. MySQL

Pas krijimit të një tabele, duhet ta plotësoni atë me të dhëna. Udhëzimet dhe INSERT të dobishme për këtë. Se si funksionojnë, do të flasim pak më vonë, por tani për tani le të mendojmë për të dhënat që duhet të futen në tabelë. Si duken saktësisht?

Le të supozojmë se të dhënat tuaja të kafshëve mund të përshkruhen siç tregohet më poshtë. Vini re se MySQL pret data në formatin vit-muaj-ditë, kjo mund të jetë e ndryshme nga ajo me të cilën jeni mësuar. Viti futet më së miri me 4 shifra. MySQL ka një algoritëm mjaft kompleks për të trajtuar saktë vlerat dyshifrore të vitit, por ju nuk keni nevojë ta kuptoni këtë ende, kështu që le t'i fusim të dhënat pa mëdyshje. Të gjitha të dhënat e kafshëve për shembullin tonë janë paraqitur në Tabelën 2.2:

Tabela 2.2. Të dhënat e kafshëve

emri pronar specie seksi lindjen vdekjen
Me gëzof Harold Mace f 1993-02-04
Me gëzof Harold Mace f 1993-02-04
Kthetrat Gwen Mace m 1994-03-17
Buffy Harold qeni f 1989-05-13
Fang Beni qeni m 1990-08-27
bouer Diane qeni m 1989-08-31 1995-07-29
Cicërimë Gwen zog zogu f 1998-09-11
Bilbili Gwen zog zogu 1997-12-09
I hollë Beni gjarpër m 1996-04-29

Meqenëse po filloni me një tabelë të zbrazët, mënyra më e lehtë për ta mbushur atë është të krijoni një skedar teksti që përmban një rresht për secilën nga kafshët tuaja dhe më pas të ngarkoni përmbajtjen e skedarit në tabelë me vetëm një udhëzim.

Ju mund të krijoni një skedar teksti pet.txt që përmban një hyrje për rresht, me vlera të ndara nga pikat e skedave në rendin në të cilin kolonat janë renditur në deklaratën CREATE TABLE. Për vlerat që mungojnë (të tilla si seksi i panjohur ose datat e vdekjes për kafshët që janë ende gjallë), mund të përdorni vlera NULL. Për t'i paraqitur ato në një skedar teksti, përdorni një etiketë. Për shembull, një hyrje në lidhje me një zog Whistler duket diçka si kjo (kam shënuar një skedë me një hapësirë):

Zogu Whistler Gwen 1997-12-09

Për të ngarkuar të dhënat nga një skedar teksti pet.txt i vendosur në kompjuterin lokal (klientin) dhe jo në server në tabelën e kafshëve, përdorni komandën LOAD DATA:

Mysql> NGARKONI TË DHËNAT INFILE LOKALE "pet.txt" NË TABELA pet;

Fjalët kyçe kanë kuptimin e mëposhtëm. INFILE specifikon një varg që është emri i skedarit për të lexuar të dhënat. Për shkak se emri është një varg, ai është i mbyllur në thonjëza, përndryshe MySQL do të përpiqet ta vlerësojë atë si një shprehje numerike. LOKAL specifikon që skedari duhet të kërkohet në sistemin e klientit, jo në server. NË TABELA udhëzon që të ngarkohen të dhënat në tabelë, emri i së cilës është specifikuar menjëherë pas fjalës TABLE (të ndara me një hapësirë).

Mund të specifikoni në mënyrë eksplicite ndarësin e vlerës së kolonës dhe shënuesin e fundit të rreshtit në deklaratë nëse dëshironi, por vlerat e paracaktuara janë vetëm skedat dhe vijat e reja. Ato janë të mjaftueshme për të lexuar saktë skedarin pet.txt dhe nuk keni nevojë për më shumë tani.

Kur dëshironi të shtoni rekorde të reja një nga një, udhëzimi është i dobishëm INSERT. Në formën e saj më të thjeshtë, ju jepni vlerat për secilën kolonë në rendin në të cilin kolonat janë renditur në deklaratën CREATE TABLE. Supozoni se Diane mori një lloj brejtësi të ri Puffball si dhuratë. Ju mund të shtoni një hyrje të re duke përdorur deklaratën INSERT, diçka si kjo:

MySQL> INSERT INTO pet
-> VLERAT ("Puffball","Diane","brejtësi","f","1999-03-30","NULL");

Fjalët kyçe këtu nuk janë gjithashtu veçanërisht të vështira. INTO pet përcakton se në cilën tabelë të futet. VLERAT specifikon një listë vlerash për të futur për një hyrje të re në tabelë. Vlerat renditen të ndara me presje dhe të gjitha së bashku merren në kllapa.

Vini re se vargjet dhe vlera e datës përcaktohen si vargje. Ju mund të futni NULL drejtpërdrejt (jo si varg) për të përfaqësuar mungesën e një vlere.

Ju mund të shihni nga ky shembull se do të duhej shumë shtypje për t'u ngarkuar drejtpërdrejt në një tabelë. Udhëzimet kursejnë shumë kohë.

A ju është dashur ndonjëherë të ngarkoni të dhëna nga një skedar në një tabelë nga një skedar? Nëse jo, atëherë do të përpiqem t'ju tregoj shkurtimisht për një mënyrë për ta bërë këtë.

Ngarkoni të dhënat në tabelë nga skedari

NGARKONI TË DHËNAT INFILE "data.csv" NË TABELA my_table Ky konstrukt do t'ju ndihmojë të ngarkoni të dhënat nga një skedar në tabelën tuaj.

Nëse dëshironi të ngarkoni të dhëna të formatuara, thoni të ndara me presje, atëherë ndërtimi i mëposhtëm do t'ju ndihmojë:

NGARKONI TË DHËNAT INFILE "data.csv" NË TABELE my_tabela FUSHAT TË PËRFUNDUARA NGA "," MBYLLUR NGA """ I IKUR NGA "\\" LINJAT E PËRFUNDUARA NGA "\r\n"
Çfarë do të thotë kjo?

  • Kërkoni mbaresat e rreshtave si karaktere "\r\n"
  • Ndani rreshtat në fusha me karaktere me presje (,).
  • Prisni që fushat të mbyllen me karaktere thonjëzash.
  • Interpretoni shfaqjen e skedave, linjave të reja ose "\" të paraprira nga "\" si fjalë për fjalë që janë pjesë e vlerës së fushës.

LOAD DATA INFILE Building

Gjithçka që kemi përshkruar më sipër është konstruksioni i famshëm LOAD DATA INFILE.

Qasja u refuzua për gabimin e përdoruesit

Nëse papritmas hasni një gabim Qasja e mohuar për përdoruesin, atëherë ju vetëm duhet të shtoni atributin LOKAL përpara INFILE. Për shembull:

NGARKONI TË TË DHËNAT INFILEN LOKALE "data.csv" NË TABELA my_table

Ngarkoni të dhënat në tabelë nga skedari për fusha specifike

NGARKONI TË DHËNAT INFILE LOKALE "data.csv" NË TABELA t1 FUSHAT E PËRFUNDUARA NGA "," LINJAT E PËRFUNDUARA NGA "\n" (@ col1 ,@ col2 ,@ col3 ,@ col4 ) emri i grupit [email i mbrojtur] col4, id [email i mbrojtur] col2;

Këtu specifikojmë emrin e skedarit (data.csv) nga i cili do të ngarkohen të dhënat. Në konstruksion (@col1,@col2,@col3,@col4) numërojmë të gjitha kolonat e skedarit për përdorimin e tyre të mëtejshëm. Dhe më pas, duke përdorur metodën e njohur të grupit, ne vendosim vlerat e këtyre kolonave për fusha specifike të tabelës.

NGARKONI INFILE TË TË DHËNAVE me JOIN

Nëse ju duhet të plotësoni një tabelë nga një skedar duke përdorur një ekzistues, ndoshta keni menduar menjëherë ta përdorni bashkohen. Kodi për një futje të tillë të të dhënave duket diçka si ky:

NGARKONI TË DHËNAT INFILE LOKALE "data.csv" NË TABELA TABELA_1 FUSHAT E PËRFUNDARA NGA "\t" LINJAT E PËRFUNDURA NGA "\r\n" (@col1,@col2,@col3,@col4) vendosur [email i mbrojtur], emri i përdoruesit=(zgjidhni emrin e përdoruesit nga përdoruesit ku user_id = @col1);