Memuat contoh file data lokal. Manual Referensi MySQL. Sintaks LOAD DATA INFILE

Saya menggambarkan situasi yang cukup umum. Selama pentest, akses diperoleh ke phpMyAdmin di host jarak jauh, tetapi file tidak dapat diakses melaluinya. FILE_PRIV=no flag yang terkenal buruk dalam pengaturan daemon MySQL adalah penyebab semuanya. Banyak yang menyerah dalam situasi ini dan percaya bahwa file di host tidak dapat lagi dibaca dengan cara ini. Tapi itu tidak selalu terjadi.

PERINGATAN

Semua informasi disediakan untuk tujuan informasional saja. Baik editor maupun penulis tidak bertanggung jawab atas kemungkinan kerugian yang disebabkan oleh materi artikel ini.

Pendahuluan

Ketika berbicara tentang interaksi DBMS MySQL dengan sistem file, mereka biasanya ingat:

  • fungsi LOAD_FILE, yang memungkinkan Anda membaca file di server;
  • konstruk SELECT ... INTO OUTFILE, yang dapat digunakan untuk membuat file baru.

Oleh karena itu, jika Anda mendapatkan akses ke phpMyAdmin atau klien lain di mesin jarak jauh, kemungkinan besar Anda dapat mengakses MySQL melalui MySQL. berkas sistem. Tetapi hanya jika bendera FILE_PRIV=yes diatur dalam pengaturan daemon, yang tidak selalu demikian. Dalam hal ini, kita perlu mengingat operator lain, apalagi yang terkenal, tetapi pada saat yang sama memiliki fungsi yang cukup kuat. Saya berbicara tentang pernyataan LOAD DATA INFILE, yang fitur-fiturnya akan dibahas dalam artikel ini.

Interaksi antara PHP dan MySQL

PHP adalah bahasa yang paling banyak digunakan untuk membangun aplikasi web, jadi ada baiknya melihat lebih dekat bagaimana interaksinya dengan database.

Di PHP4, pustaka klien MySQL disertakan secara default dan disertakan dalam distribusi PHP, jadi selama penginstalan, Anda hanya dapat memilih untuk tidak menggunakan MySQL dengan menentukan opsi

tanpa mysql.

PHP5 hadir tanpa pustaka klien. Pada sistem *nix, PHP5 biasanya dibangun dengan pustaka libmysqlclient yang sudah terpasang di server, cukup dengan mengatur opsi

Dengan-mysql=/usr

selama perakitan. Pada saat yang sama, sebelum versi 5.3, MySQL Client Library (libmysql) tingkat rendah digunakan untuk berinteraksi dengan server MySQL, antarmuka yang tidak dioptimalkan untuk komunikasi dengan aplikasi PHP.

MySQL Native Driver (mysqlnd) telah dikembangkan untuk PHP 5.3 dan lebih tinggi, dan rilis terbaru PHP 5.4 menggunakan driver ini secara default. Meskipun driver MySQL bawaan ditulis sebagai ekstensi PHP, penting untuk dipahami bahwa itu tidak menyediakan API baru untuk pemrogram PHP. API database MySQL untuk pemrogram disediakan oleh ekstensi MySQL, mysqli, dan PDO_MYSQL. Ekstensi ini dapat menggunakan driver MySQL bawaan untuk berkomunikasi dengan daemon MySQL.

Menggunakan driver MySQL bawaan memiliki beberapa keunggulan dibandingkan pustaka klien MySQL: misalnya, Anda tidak perlu menginstal MySQL untuk membangun PHP atau menggunakan skrip yang bekerja dengan database. Lagi Informasi rinci tentang MySQL Native Driver dan perbedaannya dari libmysql dapat ditemukan di dokumentasi.

Ekstensi MySQL, mysqli dan PDO_MYSQL dapat dikonfigurasi secara individual untuk menggunakan libmysql atau mysqlnd. Misalnya, untuk mengonfigurasi ekstensi MySQL agar menggunakan Perpustakaan Klien MySQL dan ekstensi mysqli agar berfungsi dengan Driver Asli MySQL, Anda harus menentukan opsi berikut:

`./konfigurasi --dengan-mysql=/usr/bin/mysql_config --dengan-mysqli=mysqlnd`

Sintaks LOAD DATA

Pernyataan LOAD DATA, seperti yang dikatakan dalam dokumentasi, membaca baris dari file dan memuatnya ke dalam tabel dengan kecepatan sangat tinggi. Itu bisa digunakan dengan kata kunci LOCAL (tersedia di MySQL 3.22.6 dan yang lebih baru) yang menentukan dari mana data akan dimuat. Jika kata LOCAL tidak ada, maka server memuat file yang ditentukan ke dalam tabel dengan miliknya mesin lokal, bukan dari mesin klien. Artinya, file tersebut tidak akan dibaca oleh klien MySQL, melainkan oleh server MySQL. Tetapi operasi ini sekali lagi membutuhkan hak istimewa FILE (flag FILE_PRIV=yes). Eksekusi pernyataan dalam kasus ini dapat dibandingkan dengan menggunakan fungsi LOAD_FILE - dengan satu-satunya perbedaan bahwa data dimuat ke dalam tabel, dan tidak ditampilkan. Jadi, menggunakan LOAD DATA INFILE untuk membaca file masuk akal hanya jika fungsi LOAD_FILE tidak tersedia, yaitu pada versi server MySQL yang sangat lama.

Tetapi jika pernyataan yang digunakan dalam bentuk ini: LOAD DATA LOCAL INFILE , yaitu menggunakan kata LOCAL, maka file tersebut sudah dibaca oleh program klien (di mesin klien) dan dikirim ke server tempat database berada. Pada saat yang sama, hak istimewa FILE, tentu saja, tidak diperlukan untuk mengakses file (karena semuanya terjadi di mesin klien).

Ekstensi MySQL/mysqli/PDO_MySQL dan pernyataan LOAD DATA LOCAL

Dalam ekstensi MySQL, kemampuan untuk menggunakan LOCAL dikendalikan oleh direktif PHP_INI_SYSTEM mysql.allow_local_infile. Secara default, arahan ini memiliki nilai 1, dan oleh karena itu operator yang kita butuhkan biasanya tersedia. Selain itu, fungsi mysql_connect memungkinkan Anda mengaktifkan penggunaan LOAD DATA LOCAL jika argumen kelima adalah konstanta 128.

Ketika ekstensi PDO_MySQL digunakan untuk terhubung ke database, kami juga dapat mengaktifkan dukungan LOCAL menggunakan konstanta PDO::MYSQL_ATTR_LOCAL_INFILE (bilangan bulat)

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

Tetapi kemungkinan terbesar untuk bekerja dengan pernyataan LOAD DATA disediakan oleh ekstensi mysqli. Ekstensi ini juga menyediakan direktif PHP_INI_SYSTEM mysqli.allow_local_infile, yang mengatur penggunaan LOCAL.

Jika koneksi dilakukan melalui mysqli_real_connect, maka dengan bantuan mysqli_options kita dapat mengaktifkan dan menonaktifkan dukungan LOKAL. Selain itu, fungsi mysqli_set_local_infile_handler tersedia dalam ekstensi ini, yang memungkinkan Anda mendaftarkan fungsi panggilan balik untuk menangani konten file yang dibaca oleh pernyataan LOAD DATA LOCAL INFILE.

Membaca file

Pembaca yang penuh perhatian mungkin sudah menebak bahwa jika kita memiliki akun di phpMyAdmin, maka kita akan dapat membaca file arbitrer tanpa memiliki hak istimewa FILE, dan bahkan melewati batasan open_basedir. Lagi pula, seringkali klien (dalam hal ini, phpMyAdmin) dan daemon MySQL berada di mesin yang sama. Meskipun pembatasan kebijakan keamanan Server MySQL, kita dapat memanfaatkan fakta bahwa kebijakan ini tidak berlaku untuk klien, dan masih membaca file dari sistem, memasukkannya ke dalam database.

Algoritmanya sederhana. Cukup dengan menjalankan kueri SQL berikut:

  1. Buat tabel di mana kita akan menulis konten file: CREATE TABLE temp(content text);
  2. Kirim isi file ke tabel yang dibuat: LOAD DATA LOCAL INFILE "/etc/hosts" INTO TABLE temp FIELDS DIHENTIKAN OLEH "eof" DIHAPUS OLEH "" LINES DIHENTIKAN OLEH "eof";

Voila. Isi file /etc/hosts sekarang ada di tabel temp. Perlu membaca binari? Tidak ada masalah. Jika pada langkah pertama kita membuat tabel seperti ini:

BUAT TABEL "bin" ("bin" BLOB NOT NULL) ENGINE = MYISAM ;

maka dimungkinkan untuk memuat file biner ke dalamnya. Benar, bit tambahan akan ditambahkan ke akhir file, tetapi bit tersebut dapat dihapus di editor hex apa pun. Dengan demikian, Anda dapat mengunduh skrip yang dilindungi oleh IonCube/Zend/TrueCrypt/NuSphere dari server dan mendekodekannya.

Contoh lain bagaimana Anda dapat menggunakan LOAD DATA LOCAL INFILE adalah untuk mengetahui jalur ke konfigurasi Apache. Ini dilakukan sebagai berikut:

  1. Pertama, kami menemukan jalur ke biner, untuk ini kami membaca /proc/self/cmdline seperti dijelaskan di atas.
  2. Dan kemudian kita langsung membaca binernya, dimana kita mencari HTTPD_ROOT/SERVER_CONFIG_FILE.


Jelas bahwa dalam situasi ini skrip phpMyAdmin berperan sebagai klien untuk terhubung ke database. Dan alih-alih phpMyAdmin, Anda dapat menggunakan antarmuka web lain untuk bekerja dengan MySQL.

Misalnya, Anda dapat menggunakan skrip untuk mencadangkan dan memulihkan database. Kembali pada tahun 2007, seorang hacker Prancis bernama acidroot menerbitkan eksploit berdasarkan komentar ini dan memungkinkan untuk membaca file dari panel admin phpBB.<= 2.0.22.

Terowongan itu nyaman. Terowongan tidak aman

Saat menginstal aplikasi web yang kompleks, akses langsung ke database seringkali diperlukan, misalnya untuk konfigurasi awal dan penyesuaian skrip. Oleh karena itu, dalam beberapa kasus, disarankan untuk menginstal skrip sederhana di server - yang disebut MySQL Tunnel, yang memungkinkan Anda untuk menanyakan basis data menggunakan klien yang nyaman alih-alih phpMyAdmin kelas berat.

Ada beberapa terowongan untuk bekerja dengan database, tetapi semuanya tidak terlalu umum. Mungkin salah satu yang paling terkenal adalah Macromedia Dream Weaver Server Scripts. Anda dapat melihat kode sumber untuk skrip ini.

Perbedaan utama antara MySQL Tunnel dan phpMyAdmin adalah kebutuhan untuk memasukkan tidak hanya login dan kata sandi dari database, tetapi juga host yang ingin Anda sambungkan. Pada saat yang sama, terowongan sering dibiarkan aktif, untuk berjaga-jaga, Anda tidak pernah tahu apa lagi yang perlu disesuaikan. Sepertinya Anda hanya dapat menggunakannya jika Anda memiliki akun di database - lalu mengapa takut? Singkatnya, tampaknya terowongan tersebut tidak menimbulkan ancaman keamanan tertentu ke server web. Namun nyatanya, tidak semuanya sebagus kelihatannya pada pandangan pertama.

Pertimbangkan situasi berikut. Biarkan server A memiliki situs site.com dengan terowongan yang dibuat http://site.com/_mmServerScripts/MMHTTPDB.php. Mari kita asumsikan bahwa di server A dimungkinkan untuk menggunakan LOAD DATA LOCAL (seperti yang dibahas di atas, ini, misalnya, dimungkinkan dengan pengaturan default). Dalam hal ini, kita dapat mengambil server MySQL jarak jauh, yang databasenya diizinkan dari mana saja dan yang juga memungkinkan Anda untuk menggunakan LOKAL, dan terhubung ke server ini menggunakan terowongan. Data untuk menghubungkan ke server MySQL jarak jauh:

DB Host: xx.xx.xx.xxx Nama DB: name_remote_db Pengguna DB: our_user DB Pass: our_pass

Dalam situasi ini, server A akan berperan sebagai klien, dan oleh karena itu kami dapat mengirim file dari host-nya ke basis data jarak jauh, atau dengan kata lain, membaca file. Dengan permintaan sederhana berikut:

Type=MYSQL&Timeout=100&Host=xx.xx.xx.xxx&Database=name_remote_db&UserName=our_user&Password=our_pass&opCode=ExecuteSQL&SQL=LOAD DATA LOCAL INFILE /path/to/script/setup_options.php" INTO TABLE tmp_tbl FIELDS DIHENTIKAN OLEH "__eof__" DILUloskan OLEH "" GARIS DIHENTIKAN OLEH "__eof__"

Faktanya, kerentanan ini lebih berbahaya daripada membaca file biasa: ini memungkinkan membaca file konfigurasi skrip yang diinstal di server A. Melalui terowongan yang sama, Anda bisa mendapatkan akses langsung ke database yang mengelola skrip ini. Teknik yang dijelaskan di atas untuk menggunakan terowongan otot dapat sedikit digeneralisasikan dan diterapkan saat mengeksploitasi kerentanan unserialize.


server klien

Untuk lebih memahami kemungkinan LOAD DATA, perlu diingat bahwa DBMS MySQL menggunakan arsitektur client-server tradisional. Bekerja dengan MySQL, kami sebenarnya bekerja dengan dua program:

  • program server basis data yang terletak di komputer tempat basis data disimpan. Daemon mysqld mendengarkan permintaan klien melalui jaringan dan mengakses konten database, memberikan informasi yang diminta oleh klien. Jika mysqld dimulai dengan --local-infile=0, maka LOCAL tidak akan berfungsi;
  • program klien terhubung ke server dan mengirimkan permintaan ke server. Distribusi DBMS MySQL mencakup beberapa program klien: klien konsol MySQL (yang paling umum digunakan), serta mysqldump, mysqladmin, mysqlshow, mysqlimport, dan sebagainya. Dan jika perlu, Anda bahkan dapat membuat program klien Anda sendiri berdasarkan pustaka klien libmysql standar, yang disertakan dengan DBMS MySQL.

Jika menggunakan klien MySQL standar gagal menggunakan pernyataan LOAD DATA LOCAL, maka Anda harus menggunakan sakelar --local-infile :

Mysql --local-infile sampdb mysql> LOAD DATA LOCAL INFILE "member.txt" KE TABEL anggota;

Atau tentukan opsi untuk klien di file /my.cnf:

local-infile=1

Penting untuk dicatat bahwa secara default semua klien dan pustaka MySQL dikompilasi dengan opsi --enable-local-infile untuk memastikan kompatibilitas dengan MySQL 3.23.48 dan yang lebih lama, sehingga LOAD DATA LOCAL biasanya tersedia untuk klien standar. Namun, perintah ke server MySQL dikirim terutama bukan dari konsol, tetapi dari skrip, jadi bahasa pengembangan web juga memiliki klien untuk bekerja dengan database, yang mungkin berbeda fungsinya dari klien MySQL standar.

Tentu saja, fitur pernyataan LOAD DATA ini dapat menjadi risiko keamanan bagi sistem, dan dimulai dengan MySQL 3.23.49 dan MySQL 4.0.2 (4.0.13 saat Win) opsi LOCAL hanya akan berfungsi jika klien dan server izinkan itu.

Lewati batasan open_basedir

Menggunakan LOAD DATA cukup sering memungkinkan Anda melewati batasan open_basedir. Ini dapat berguna jika, misalnya, kami memiliki akses ke direktori hosting bersama satu pengguna, tetapi ingin membaca skrip dari direktori home pengguna lain. Kemudian dengan menginstal skrip ini

1)); $e=$pdo->exec("LOAD DATA LOCAL INFILE "./path/to/file" INTO TABLE test FIELDS DIHENTIKAN OLEH "__eof__" DILUARKAN OLEH "" LINES DIHENTIKAN OLEH "__eof__""); $pdo = null; ?>

Kesimpulan

Sangat mengherankan bahwa kemungkinan yang dijelaskan dari operator LOAD DATA telah dikenal setidaknya selama sepuluh tahun. Penyebutannya dapat, misalnya, ditemukan di tiket [#15408] (Safe Mode / MySQL Vuln 2002-02-06), dan kemudian pertanyaan serupa berulang kali muncul di bugs.php.net [#21356] [#23779 ] [#28632 ] [#31261] [#31711]. Yang ditanggapi oleh pengembang secara verbatim sebagai berikut:

[email dilindungi] Ini bukan bug, ini fitur :)

Atau diberi tiket "Status: Won't fix". Atau mereka terbatas pada tambalan yang hampir tidak menyelesaikan apa pun. Tiket tentang topik ini muncul lagi. Oleh karena itu, metode melewati open_basedir yang ditentukan masih berfungsi pada sejumlah besar server. Namun, dengan munculnya driver mysqlnd yang baru, tampaknya keputusan dibuat untuk membuat perubahan yang signifikan: dengan pengaturan default, pernyataan ini tidak akan lagi dijalankan sama sekali [#54158] [#55737]. Mari berharap dalam waktu dekat para pengembang akan membereskan masalah ini.

LOAD DATA INFILE "file_name.txt" KE TABEL tbl_name [ TERLAMPIR OLEH ""] ] [(col_name,...)]

Perintah LOAD DATA INFILE membaca baris dari file teks dan memasukkannya ke dalam tabel dengan kecepatan sangat tinggi. Jika kata kunci LOKAL ditentukan, maka file dibaca dari host klien. Jika LOKAL tidak ditentukan, maka file tersebut harus ada di server. (Opsi LOKAL tersedia di MySQL versi 3.22.6 dan yang lebih baru.)

Jika file teks yang akan dibaca berada di server, maka untuk alasan keamanan file ini harus berada di direktori database atau dapat dibaca oleh semua pengguna. Selain itu, untuk menggunakan perintah LOAD DATA INFILE pada file server, Anda harus memiliki hak istimewa FILE pada host server. Lihat bagian 4.2.7 Keistimewaan yang Diberikan oleh MySQL .

Di MySQL 3.23.49 dan MySQL 4.0.2, perintah LOCAL tidak akan berfungsi jika daemon mysqld dimulai dengan --local-infile=0 atau jika klien tidak mengaktifkan dukungan LOCAL. Lihat bagian 4.2.4 Pertimbangan Keamanan Terkait Perintah LOAD DATA LOCAL.

Jika kata kunci LOW_PRIORITY ditentukan, maka eksekusi perintah LOAD DATA ini akan ditunda hingga klien lain selesai membaca tabel ini.

Jika kata kunci CONCURRENT ditentukan saat bekerja dengan tabel MyISAM, maka utas lainnya dapat mengambil data dari tabel selama eksekusi perintah LOAD DATA. Menggunakan fitur ini, tentu saja, akan memiliki sedikit dampak kinerja pada LOAD DATA , meskipun tidak ada utas lain yang menggunakan tabel pada saat yang sama.

Saat menggunakan opsi LOKAL, eksekusi mungkin sedikit lebih lambat daripada membiarkan server mengakses file secara langsung, karena konten file harus dipindahkan dari host klien ke server. Di sisi lain, dalam hal ini tidak diperlukan hak istimewa FILE untuk memuat file lokal.

Jika Anda menggunakan versi MySQL sebelum 3.23.24, Anda tidak dapat membaca dari FIFO menggunakan perintah LOAD DATA INFILE. Jika perlu membaca dari FIFO (misalnya, keluaran standar gunzip), LOAD DATA LOCAL INFILE harus digunakan.

Anda juga dapat memuat file data menggunakan utilitas mysqlimport. Utilitas ini melakukan pemuatan file dengan mengirimkan perintah LOAD DATA INFILE ke server. Opsi --local menyebabkan mysqlimport membaca file data dari host klien. Anda dapat menentukan opsi --compress untuk mendapatkan kinerja yang lebih baik melalui jaringan yang lambat jika klien dan server mendukung protokol kompresi data.

Dalam kasus di mana file berada di server, yang terakhir bertindak sesuai dengan aturan berikut:

  • Jika jalur absolut (lengkap) ke file diberikan, maka server menggunakan jalur ini tanpa modifikasi.
  • Jika jalur relatif ke file ditentukan, dengan menentukan satu atau lebih direktori home, maka pencarian file akan relatif terhadap direktori yang ditentukan di direktori data server (datadir).
  • Jika jalur ke file diberikan tanpa menentukan direktori home, maka server mencari file tersebut di direktori database yang digunakan.

Oleh karena itu file yang ditentukan sebagai `./myfile.txt" dibaca dari direktori data server, sedangkan file yang ditentukan sebagai `myfile.txt" dibaca dari direktori database yang digunakan. Misalnya, perintah LOAD DATA berikut membaca file data.txt di direktori database untuk db1 karena db1 adalah database saat ini, meskipun perintah tersebut secara eksplisit menginstruksikan untuk memuat file ke dalam tabel database db2:

MySQL> GUNAKAN db1; mysql> LOAD DATA INFILE "data.txt" KE TABEL db2.my_table;

Kata kunci REPLACE dan IGNORE mengontrol pemrosesan rekaman input yang menggandakan rekaman yang ada dengan nilai kunci unik yang sama. Jika REPLACE ditentukan, baris baru akan menggantikan baris yang ada dengan kunci unik yang sama. Jika Anda menetapkan IGNORE , baris masukan yang memiliki kunci unik yang sama dengan yang sudah ada akan diabaikan. Jika tidak ada parameter yang ditentukan, kesalahan akan terjadi saat nilai kunci duplikat ditemukan dan sisa file teks diabaikan.

Jika data sedang dimuat dari file lokal menggunakan kata kunci LOCAL, maka server tidak akan dapat membatalkan transfer data di tengah operasi ini, sehingga perilaku default dari perintah tersebut sama seperti saat IGNORE ditentukan.

Saat menggunakan LOAD DATA INFILE pada tabel MyISAM kosong, semua indeks non-unik dibuat dalam paket terpisah (seperti pada PERBAIKAN). Ini biasanya sangat mempercepat operasi LOAD DATA INFILE dalam kasus sejumlah besar indeks.

Perintah LOAD DATA INFILE melengkapi SELECT ... INTO OUTFILE . Lihat bagian 6.4.1 Sintaks pernyataan SELECT. Untuk menulis data dari database ke file, gunakan SELECT ... INTO OUTFILE . Untuk membaca data kembali ke database, digunakan LOAD DATA INFILE. Sintaks untuk FIELDS dan LINES sama di kedua perintah. Kedua bagian bersifat opsional, tetapi jika keduanya ditentukan, maka FIELDS harus mendahului LINES .

Jika FIELDS ditentukan, maka masing-masing subekspresinya (TERMINATED BY , ENCLOSED BY , dan ESCAPED BY ) juga opsional, tetapi setidaknya salah satunya harus ditentukan.

Jika pernyataan FIELDS tidak ditentukan, maka secara default parameternya akan mengambil nilai berikut:

BIDANG DIHENTIKAN OLEH "\t" DITUTUP OLEH "" DIHAPUS OLEH "\\"

Jika klausa LINES tidak ditentukan, maka secara default strukturnya adalah sebagai berikut:

GARIS DIHENTIKAN OLEH "\n"

Dengan kata lain, dengan pengaturan default, perintah LOAD DATA INFILE, saat membaca data input, akan berfungsi sebagai berikut:

  • Telusuri akhir baris sebagai karakter `\n'
  • Pisahkan garis menjadi bidang menurut karakter tab.
  • Jangan berharap bidang dilampirkan dalam karakter kutipan.
  • Tafsirkan kemunculan tab, baris baru, atau `\" yang didahului oleh `\" sebagai literal yang merupakan bagian dari nilai bidang.

Sebaliknya, jika pengaturan default untuk menulis keluaran berlaku, perintah SELECT ... INTO OUTFILE akan berfungsi sebagai berikut:

  • Sisipkan karakter tab di antara bidang.
  • Jangan sertakan bidang dalam karakter kutipan. Gunakan karakter `\" untuk keluar dari contoh tab, baris baru, atau `\" yang muncul di antara nilai bidang.
  • Sisipkan karakter baris baru di akhir setiap entri.

Perhatikan bahwa entri FIELDS ESCAPED BY `\" memerlukan dua garis miring terbalik agar sebuah nilai dibaca sebagai satu garis miring terbalik.

Opsi IGNORE number LINES dapat digunakan untuk mengabaikan tajuk nama kolom di awal file:

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

Saat menggunakan SELECT ... INTO OUTFILE dengan LOAD DATA INFILE untuk membaca data dari database ke file lalu kembali dari file ke database, opsi pemrosesan bidang dan baris untuk kedua perintah harus cocok. Jika tidak, LOAD DATA INFILE tidak akan dapat menginterpretasikan isi file ini dengan benar. Misalkan perintah SELECT ... INTO OUTFILE digunakan untuk menulis ke file dengan bidang yang dipisahkan dengan koma:

Mysql> SELECT * INTO OUTFILE "data.txt" FIELDS DIHENTIKAN OLEH "," FROM ...;

Mysql> LOAD DATA INFILE "data.txt" KE TABEL table2 BIDANG DIHENTIKAN OLEH ",";

Mysql> LOAD DATA INFILE "data.txt" KE TABEL table2 BIDANG DIHENTIKAN OLEH "\t";

Hasil yang serupa akan diperoleh jika setiap jalur input diinterpretasikan sebagai bidang yang terpisah.

Perintah LOAD DATA INFILE juga dapat digunakan untuk membaca file dari sumber eksternal. Misalnya, bidang dalam file format basis data dBASE akan dipisahkan dengan koma dan dilampirkan dalam tanda kutip ganda. Jika baris dalam file ini diakhiri dengan baris baru, maka perintah berikut dapat digunakan untuk menulis file, yang mengilustrasikan opsi pengaturan yang memproses bidang dan baris:

Mysql> LOAD DATA INFILE "data.txt" KE TABLE tbl_name BIDANG DIHENTIKAN OLEH "," DITUTUP OLEH """ BARIS DIHENTIKAN OLEH "\n";

Salah satu opsi yang menangani bidang dan garis dapat berupa string kosong (""). Jika string tidak kosong, maka nilai opsi FIELDS ENCLOSED BY dan FIELDS ESCAPED BY harus berisi satu karakter. BIDANG DIHENTIKAN OLEH dan BARIS DIHENTIKAN OLEH nilai opsi dapat berisi lebih dari satu karakter. Misalnya, untuk menulis baris yang diakhiri dengan pasangan ``carriage return - line feed'' (seperti dalam file teks MS DOS atau Windows), Anda harus menentukan ekspresi berikut: LINES TERMINATED BY "\r\n" .

CREATE TABLE jokes (KUNCI UTAMA INT NOT NULL AUTO_INCREMENT, TEXT joke NOT NULL); LOAD DATA INFILE "/tmp/jokes.txt" KE BIDANG lelucon TABEL DIHENTIKAN OLEH ""; GARIS DIHENTIKAN OLEH "\n%%\n" (lelucon);

Opsi FIELDS ENCLOSED BY mengontrol bidang yang terlampir dalam karakter yang diberikan. Jika parameter OPSIONAL dihilangkan, maka dalam keluaran (SELECT ... INTO OUTFILE) semua bidang akan diapit dalam karakter yang ditentukan dalam ENCLOSED BY . Contoh keluaran tersebut (yang menggunakan koma sebagai pemisah bidang) ditunjukkan di bawah ini:

"1", "sebuah string", "100.20" "2", "string yang berisi , koma", "102.20" "3", "string yang berisi \" kutipan ","102.20" "4"," sebuah string yang berisi \", kutipan dan koma","102.20"

Jika parameter OPSIONAL ditentukan, maka hanya kolom tipe CHAR dan VARCHAR yang dipilih dengan karakter yang ditentukan di ENCLOSED BY:

1,"string",100.20 2,"string berisi , koma",102.20 3,"string berisi \"kutipan",102.20 4,"string berisi \", kutipan dan koma",102.20

Perhatikan bahwa kemunculan karakter ENCLOSED BY di dalam nilai bidang diloloskan dengan menerapkan awalan dari ESCAPED BY sebelum mereka. Perhatikan juga bahwa jika ESCAPED BY adalah null, dimungkinkan untuk menghasilkan keluaran yang tidak dapat dibaca dengan benar oleh pernyataan LOAD DATA INFILE. Misalnya, jika karakter escape berupa string kosong, maka keluaran di atas akan seperti gambar di bawah ini. Perhatikan bahwa bidang kedua pada baris keempat berisi koma diikuti dengan tanda kutip, yang (secara keliru) tampaknya membatasi bidang yang diberikan:

1,"string",100.20 2,"string berisi , koma",102.20 3,"string berisi " kutipan",102.20 4,"string berisi ", kutipan dan koma",102.20

Untuk input, karakter ENCLOSED BY, jika ada, dihapus dari kedua ujung nilai bidang. (Benar apakah parameter OPTIONALLY ditentukan atau tidak: parameter OPTIONALLY diabaikan saat bekerja dengan input.) Jika ditemukan karakter ENCLOSED BY yang didahului oleh karakter ESCAPED BY, ini ditafsirkan sebagai bagian dari arus bidang nilai. Selain itu, karakter ENCLOSED BY ganda yang muncul dalam bidang ditafsirkan sebagai karakter ENCLOSED BY tunggal jika bidang itu sendiri dimulai dengan karakter tersebut. Misalnya, jika ENCLOSED BY """ ditentukan, maka tanda kutip ditangani sebagai berikut:

"Bos" "BESAR"" -> Bos "BESAR" Bos "BESAR" -> Bos "BESAR" Bos "BESAR" -> Bos "BESAR"

Opsi FIELDS ESCAPED BY mengontrol penulisan atau pembacaan karakter khusus. Jika karakter FIELDS ESCAPED BY tidak kosong, karakter ini digunakan sebagai awalan untuk karakter berikut dalam output:

  • BIDANG DILUARKAN OLEH simbol
  • BIDANG YANG DITUTUP OLEH simbol
  • Karakter pertama FIELDS DIHENTIKAN OLEH dan BARIS DIHENTIKAN OLEH
  • Karakter ASCII 0 (sebenarnya, ASCII `0" ditulis setelah karakter escape, bukan byte bernilai nol)

Jika karakter FIELDS ESCAPED BY kosong, maka tidak ada karakter yang lolos. Nyatanya, tidak ada gunanya menentukan karakter escape kosong, terutama jika nilai field dalam data yang sedang diproses berisi salah satu karakter dari daftar di atas.

Jika FIELDS ESCAPED BY karakter tidak kosong, maka, dalam kasus input, kemunculan karakter tersebut dihapus dan karakter yang mengikuti kemunculan tersebut dianggap secara harfiah sebagai bagian dari nilai bidang. Pengecualian di-escape `0" atau `N" (mis. \0 atau \N jika karakter escape adalah `\"). Urutan ini ditafsirkan sebagai ASCII 0 (byte dengan nilai nol) dan NULL . Lihat aturan untuk menangani nilai nol di bawah ini. .

Lihat bagian 6.1.1 Literal: Mewakili String dan Angka untuk informasi lebih lanjut tentang sintaks karakter escape `\".

Dalam beberapa kasus, opsi pemrosesan bidang dan baris berinteraksi:

  • Jika LINES TERMINATED BY adalah string kosong dan FIELDS TERMINATED BY adalah string tidak kosong, maka baris juga diakhiri dengan FIELDS TERMINATED BY .
  • Jika FIELDS TERMINATED BY dan FIELDS ENCLOSED BY kosong (""), maka format string tetap (tanpa pembatas) digunakan. Format string tetap tidak menyediakan pemisah antar bidang. Sebagai gantinya, saat membaca dan menulis nilai kolom, lebar kolom ``output"" digunakan. Misalnya, jika sebuah kolom dideklarasikan sebagai INT(7) , nilai untuk kolom tersebut ditulis menggunakan kolom dengan lebar 7 karakter. Nilai input untuk kolom ini diperoleh dengan membaca 7 karakter. Format string tetap juga memengaruhi penanganan nilai NULL (lihat di bawah). Perhatikan bahwa format ukuran tetap tidak akan berfungsi saat menggunakan rangkaian karakter multibita.

Nilai NULL akan ditangani secara berbeda tergantung pada opsi FIELDS dan LINES yang digunakan:

  • Untuk nilai default FIELDS dan LINES, NULL ditulis sebagai \N ​​pada output dan \N dibaca sebagai NULL pada input (dengan asumsi karakter ESCAPED BY adalah `\").
  • Jika FIELDS ENCLOSED BY tidak kosong, maka field yang nilainya berupa kata dengan huruf NULL dibaca sebagai nilai NULL (berlawanan dengan kata NULL di antara karakter FIELDS ENCLOSED BY, yang dibaca sebagai string " NULL ").
  • Jika FIELDS ESCAPED BY kosong, NULL ditulis sebagai kata NULL.
  • Dalam format string tetap (yang terjadi jika penentu FIELDS TERMINATED BY dan FIELDS ENCLOSED BY kosong), NULL ditulis sebagai string kosong. Perhatikan bahwa, akibatnya, nilai NULL dan string kosong dalam tabel ini tidak dapat dibedakan saat ditulis ke file, karena keduanya ditulis sebagai string kosong. Jika Anda ingin nilai ini berbeda saat file dibaca kembali, maka Anda sebaiknya tidak menggunakan format string tetap.

Beberapa kasus tidak didukung oleh pernyataan LOAD DATA INFILE:

  • Baris berukuran tetap (FIELDS TERMINATED BY dan FIELDS ENCLOSED BY keduanya kosong) dan kolom BLOB atau TEXT.
  • Jika pembatas ditentukan yang cocok atau merupakan awalan dari yang lain, maka LOAD DATA INFILE tidak akan dapat menginterpretasikan input dengan benar. Misalnya, pernyataan FIELDS berikut ini akan menyebabkan masalah: FIELDS TERMINATED BY """ ENCLOSED BY """
  • Jika opsi FIELDS ESCAPED BY kosong, maka kemunculan karakter FIELDS ENCLOSED BY atau LINES TERMINATED BY dalam nilai field diikuti dengan karakter FIELDS TERMINATED BY akan menyebabkan perintah LOAD DATA INFILE untuk mengakhiri pembacaan field atau baris sebelum waktunya. Ini karena LOAD DATA INFILE tidak dapat menentukan dengan benar di mana bidang atau garis berakhir.

Contoh berikut memuat semua kolom tabel persondata:

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

Daftar bidang tidak ditentukan, jadi perintah LOAD DATA INFILE mengharapkan baris input untuk mengisi setiap kolom tabel. Ini menggunakan nilai default FIELDS dan LINES.

Jika Anda ingin memuat hanya beberapa kolom tabel, Anda harus menentukan daftar kolom:

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

Daftar bidang juga harus ditentukan dalam kasus di mana urutan bidang dalam file masukan berbeda dari urutan kolom dalam tabel yang diberikan. Jika tidak, MySQL tidak akan dapat memetakan kolom input ke kolom tabel.

Jika sebuah baris memiliki terlalu sedikit bidang, maka kolom yang tidak memiliki bidang dalam file masukan akan disetel ke nilai defaultnya. Penetapan nilai default dijelaskan di bagian 6.5.3 Sintaks pernyataan CREATE TABLE.

Nilai bidang kosong ditafsirkan berbeda dari tidak adanya nilai:

  • Untuk tipe string, kolom disetel ke string kosong.
  • Untuk tipe numerik, kolom disetel ke 0 .
  • Untuk jenis tanggal dan waktu, kolom disetel ke nilai yang sesuai ``nol"' untuk jenis itu. Lihat bagian 6.2.2 Tipe Data Tanggal dan Waktu.

Perhatikan bahwa ini adalah nilai yang sama yang akan berakhir di kolom dengan secara eksplisit menetapkan string kosong ke kolom tipe string, numerik, atau tanggal atau waktu dalam pernyataan INSERT atau UPDATE.

Kolom TIMESTAMP hanya disetel ke tanggal atau waktu saat ini jika kolom disetel ke NULL atau (hanya untuk kolom TIMESTAMP pertama) jika kolom TIMESTAMP berada di luar daftar bidang, jika daftar tersebut ditentukan.

Jika string input memiliki terlalu banyak kolom, kolom tambahan akan diabaikan dan jumlah peringatan akan bertambah.

Perintah LOAD DATA INFILE menginterpretasikan semua data input sebagai string, jadi Anda tidak dapat menentukan nilai numerik untuk kolom ENUM atau SET dengan cara yang sama seperti untuk perintah INSERT. Semua nilai ENUM dan SET harus ditentukan sebagai string!

Saat menggunakan C API, Anda bisa mendapatkan informasi tentang kueri dengan memanggil fungsi mysql_info() API di akhir kueri LOAD DATA INFILE. Berikut ini menunjukkan format baris informasi untuk kasus ini:

Catatan: 1 Dihapus: 0 Dilewati: 0 Peringatan: 0

Peringatan dikeluarkan dalam keadaan yang sama seperti ketika menulis nilai dengan perintah INSERT (lihat bagian 6.4.3 Sintaks Pernyataan INSERT), kecuali bahwa perintah LOAD DATA INFILE juga menghasilkan peringatan ketika terlalu sedikit atau terlalu banyak bidang dalam input rangkaian. Peringatan tidak disimpan di mana pun; jumlah peringatan hanya dapat digunakan untuk memeriksa apakah tindakan yang ditentukan dilakukan secara normal. Jika Anda ingin tahu persis apa yang menyebabkan peringatan, maka Anda harus PILIH ... INTO OUTFILE ke file lain dan bandingkan hasilnya dengan file masukan asli - ini adalah satu-satunya cara untuk mendapatkan informasi ini.

Jika Anda perlu LOAD DATA untuk membaca dari sebuah pipa, Anda dapat menggunakan trik berikut:

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

Saat menggunakan versi MySQL yang lebih lama dari 3.23.25, hal di atas hanya dapat dilakukan dengan LOAD DATA LOCAL INFILE .

Untuk informasi lebih lanjut tentang efisiensi INSERT versus LOAD DATA INFILE dan peningkatan kecepatan LOAD DATA INFILE , lihat bagian 5.2.9 Kecepatan Eksekusi Query INSERT.

Komentar Pengguna

Dikirim oleh Jason Titus[Hapus][Sunting]

"Peringatan tidak disimpan di mana pun; jumlah peringatan hanya dapat digunakan sebagai
indikasi jika semuanya berjalan dengan baik"

Kamu pasti sudah bercanda. Apakah ini dilakukan sebagai semacam hukuman DBA? yaitu - Kita
TAHU apa masalahnya, tetapi Anda hanya perlu membuat file keluaran dan memeriksanya
jutaan catatan Anda untuk menemukannya". Bukankah MySQL biasa memasukkan ini ke dalam log kesalahan,
di mana mereka berada? Silakan dan jadikan itu pilihan, tetapi ini cukup merepotkan
saya beralih kembali ke Oracle (dan itu membutuhkan banyak waktu).

Diposting oleh campbell pada Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Kedua itu. (!) Saya tidak mengerti bagaimana Anda
tulis kalimat itu dengan wajah lurus.

Diposting oleh Jonathon Padfield pada hari Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Juga, tidak ada informasi tentang baris mana yang dilewati
diberikan.

Diposting oleh pada hari Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Fitur ini sangat berguna ketika mengirimkan sebuah
MASUKKAN dari halaman web. Jika pengguna menekan
menyegarkan, dan memposting ulang data formulir yang menghasilkan a
INSERT berikutnya dari data kunci utama yang sama,
boom, aplikasi rusak. Dengan cara ini, pengguna bisa
tekan F5 sampai wajah mereka membiru, dan mereka
tidak akan merusak pernyataan REPLACE.

[Hapus][Sunting]

Saya memiliki folder MyDB di c:\mysql\data
Saya menempatkan Data.txt di sana dan ketika saya mengeksekusi
LOAD DATA LOKAL INFILE "Data.txt" KE TABEL
MyTable mengatakan: Perintah telah berhasil dijalankan
tetapi TIDAK ADA nilai yang ditambahkan ke MyTable.
Saya di bawah W2K

Diposting oleh van hoof philip pada Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Saya ingin menyinkronkan database saya dengan yang lain
basis data dari waktu ke waktu. Ini berarti bahwa saya
harus menggunakan hal REPLACE. Tapi bagaimana dengan
catatan yang tidak ada lagi di yang lebih baru
basis data. Apakah mereka akan dihapus di MySQL?
Apakah ada cara untuk menghapus ini secara otomatis? Atau apakah
satu-satunya solusi untuk menjatuhkan tabel MySQL saya dan membuat ulang
sebelum saya mulai memuatnya. Saya menggunakan crontab
skrip untuk operasi ini sehingga tidak ada interaksi manusia
mungkin selama operasi ini.

Diposting oleh pada hari Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Dokumentasi tidak jelas tentang apa
merupakan kunci/indeks "unik" di area ini. Dia
referensi balik untuk "menyisipkan", tetapi menyisipkan tidak
memiliki kendala seperti itu. Saya telah menemukan yang utama
kuncinya cukup unik, tetapi saya harus menambahkan
pendahuluan di mana saya tidak menginginkannya. Mungkin memang begitu
sesuatu yang hilang....

Diposting oleh pada hari Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Sangat frustasi untuk mendapatkan peringatan ketika ada
mengimpor data ke database MySQL
dapat mengakses informasi apa pun tentang peringatan tersebut.
MySQL benar-benar perlu menambahkan fitur yang akan
laporkan apa itu TENTANG peringatan, bukan hanya
melaporkan peringatan. Idealnya informasi tentang
peringatan harus segera diberikan. Pada
setidaknya semacam error-log seharusnya
dibuat yang dapat diakses oleh pengguna.

Diposting oleh pada hari Jumat 17 Mei 2002, @6:24 pagi[Hapus][Sunting]

Pada subjek "F5 sampai wajah mereka membiru"...

Ini harus ditangani dalam aplikasi. Dia
tentu tidak ada salahnya untuk memberi tahu pengguna, "Kamu".
sudah masuk ini. Tolong berhenti menyegarkan."

Sebenarnya karena banyaknya hyperimpatient end
pecundang di luar sana, ini terlihat seperti khususnya
ide bagus.

Diposting oleh Larry Irwin pada Selasa 20 Agustus 2002, @11:50[Hapus][Sunting]

Akan sangat membantu untuk memiliki opsi tambahan
ke "IGNORE CONSTRAINTS" selama pemuatan
proses.

Dikirim pada Kamis, 5 September 2002, @1:34 pagi[Hapus][Sunting]

Ada tangkapan dengan "di meja MyISAM kosong, semuanya
indeks non-unik dibuat dalam batch terpisah"
karena mekanisme yang digunakan adalah "perbaikan dengan
keycache" yang bisa sangat lambat jika Anda memiliki banyak
indeks. Seseorang benar-benar perlu menggunakan mekanisme untuk
hentikan kunci yang dibuat dan kemudian lakukan perbaikan dengan
myisamchk menggunakan "perbaikan dengan sortir" seperti yang dijelaskan di
bagian 5.2.9 (jika Anda bisa membuatnya berfungsi :-()

Dikirim pada hari Rabu 9 Oktober 2002, @12:43 siang[

Sintaks LOAD DATA INFILE

MUAT DATA INFILE" Nama file. txt" KE TABEL table_name
[DILENGKAPI OLEH"]
]
]
[(nama kolom,...)]
Pernyataan LOAD DATA INFILE membaca baris dari file teks dan memuatnya ke dalam tabel dengan kecepatan sangat tinggi.
Anda juga dapat memuat file data menggunakan utilitas impor mysql. Ia bekerja dengan mengirimkan pernyataan LOAD data INFILE ke server. Opsi --local menyebabkan utilitas mysqlimport membaca file data dari host klien. Anda dapat menentukan opsi -compress untuk meningkatkan kinerja pada jaringan lambat jika klien dan server mendukung protokol terkompresi.
Jika kata kunci LOW_PRIORITY ditentukan, eksekusi pernyataan LOAD DATA ditunda hingga semua klien lain selesai membaca.
Jika kata kunci CONCURRENT ditentukan dengan tabel MyISAM yang memenuhi kondisi penyisipan paralel (yaitu, tidak ada blok kosong di tengah file), maka utas lainnya akan dapat mengambil data dari tabel pada saat yang sama. LOAD DATA dijalankan. Menggunakan opsi ini memiliki sedikit dampak kinerja pada LOAD DATA, meskipun tidak ada utas lain yang bekerja dengan tabel ini.
Jika kata kunci LOKAL ditentukan, itu merujuk ke sisi klien dari koneksi.

  1. Jika kata LOKAL ditentukan, file dibaca oleh program klien di host klien dan dikirim ke server.
  2. Jika kata LOKAL tidak ditentukan, file yang diunggah harus berada di host server, dan dibaca langsung oleh server.

LOCAL tersedia di MySQL 3.22.6 dan yang lebih baru.
Untuk alasan keamanan, saat membaca file teks yang terletak di server, file tersebut harus berada di direktori data atau dapat dibaca oleh semua orang. Selain itu, untuk menggunakan LOAD DATA dengan file server, Anda harus memiliki hak istimewa FILE.
Mengunduh dengan opsi LOKAL agak lebih lambat daripada saat Anda memberi server kemampuan untuk mengakses file yang diunduh secara langsung, karena dalam hal ini konten file ditransfer melalui jaringan melalui server klien-ser pada koneksi yang benar. Di sisi lain, Anda tidak memerlukan hak istimewa FILE dalam kasus ini.
Dimulai dengan MySQL 3.23.49 dan MySQL 4.0.2 (4.0.13 di Windows), LOCAL hanya berfungsi jika klien dan server mengizinkannya. Misalnya, jika mysqld dimulai dengan opsi -local-inf ile=0, maka LOCAL tidak akan berfungsi.

Jika Anda perlu menggunakan LOAD DATA untuk membaca dari pipa program, Anda dapat menggunakan teknik berikut:
mkfifo /mysql/db/x/x
chmod 666 /mysql/db/x/x
kucing< /dev/tcp/10.1.1.12/4711 >/mysql/db/x/x
mysql -e "LOAD DATA INFILE "x1 KE TABEL x" x
Jika Anda menjalankan versi MySQL sebelum 3.23.25, teknik ini hanya dapat digunakan dengan LOAD DATA LOCAL INFILE.
Jika Anda memiliki versi MySQL lebih lama dari 3.23.24, Anda tidak akan dapat membaca menggunakan pernyataan LOAD DATA INFILE dari FIFO. Jika Anda perlu membaca dari FIFO (misalnya keluaran gunzip), gunakan LOAD DATA LOCAL INFILE sebagai gantinya.
Saat mencari file dalam sistem filenya, server dipandu oleh aturan berikut:

  1. Jika jalur absolut ditentukan, server menggunakannya sebagaimana adanya.
  2. Jika jalur relatif dengan satu atau lebih komponen utama diberikan, server mencari file yang relatif terhadap direktori datanya.
  3. Jika nama file tanpa komponen jalur utama diberikan, server mencari file di direktori data database default.

Perhatikan bahwa aturan ini menyiratkan bahwa file bernama ./myfile.txt dibaca dari direktori data server, sedangkan file bernama myfile,txt dibaca dari direktori data default database. Misalnya, pernyataan LOAD DATA INFILE berikut membaca file data.txt dari direktori data database dbl karena dbl adalah database saat ini, meskipun pernyataan tersebut memuat data ke dalam database db2:
mysql> GUNAKAN dbl;
mysql> LOAD DATA INFILE "data.txt" KE TABEL db2.my_table;
Kata kunci REPLACE dan IGNORE mengontrol penanganan input string yang menggandakan kunci unik yang ada berdasarkan nilai.
Jika REPLACE ditentukan, baris input menggantikan baris yang ada (dengan kata lain, baris yang memiliki nilai kunci utama atau unik yang sama dengan baris yang ada dalam tabel). Lihat GANTI Sintaks
Jika IGNORE ditentukan, maka baris masukan yang menggandakan baris yang ada dengan nilai kunci utama atau unik yang sama akan diabaikan. Jika tidak ada opsi yang ditentukan, maka perilaku bergantung pada apakah kata kunci lokal ditentukan. Dengan tidak adanya LOKAL, kesalahan dihasilkan jika kunci duplikat ditemukan, dan sisa file teks diabaikan. Jika LOKAL ada, perilaku default sama seperti jika IGNORE ditentukan. Ini karena server tidak dapat menghentikan transfer file saat operasi ini sedang berlangsung.
Jika Anda ingin mengabaikan batasan kunci asing selama operasi pemuatan data, Anda dapat mengeluarkan pernyataan SET FOREIGN_KEY_CHECKS=0 sebelum menjalankan LOAD DATA.
Jika Anda menjalankan LOAD DATA pada tabel MyISAM kosong, semua indeks non-unik dibuat dalam tugas terpisah (seperti untuk REPAIR TABLE). Ini biasanya mengakibatkan LOAD DATA menjadi lebih cepat ketika ada banyak indeks. Ini umumnya sangat cepat, tetapi dalam beberapa kasus khusus Anda dapat membuat indeks lebih cepat dengan mematikannya dengan ALTER TABLE.. .DISABLE KEYS sebelum memuat

file ke tabel, membuat ulang indeks dan mengaktifkannya dengan ALTER TABLE.. .ENABLE KEYS setelah pemuatan selesai.
LOAD DATA INFILE merupakan tambahan untuk SELECT.. .INTO OUTFILE. Lihat Sintaks SELECT Untuk menulis data dari tabel ke file, gunakan SELECT... INTO OUTFILE. Untuk membaca kembali data dari file ke dalam tabel, gunakan LOAD DATA INFILE. Sintaks konstruksi FIELDS dan LINES sama untuk kedua pernyataan. Kedua konstruksi ini bersifat opsional, tetapi kolom harus mendahului LINES jika keduanya ditentukan.
Jika konstruk FIELDS ditentukan, maka semua parameternya (TERMINATED BY, ENCLOSED BY, dan ESCAPED BY) juga opsional, kecuali untuk persyaratan bahwa setidaknya satu parameter harus ada.
Jika konstruk FIELDS tidak ditentukan, defaultnya adalah:
BIDANG DIHENTIKAN OLEH "tf DITUTUP OLEH" DIHAPUS OLEH "
Jika LINES tidak ditentukan, defaultnya adalah:
BARIS DIHENTIKAN OLEH "n! MULAI OLEH"
Dengan kata lain, perilaku default LOAD DATA INFILE saat membaca input adalah:

  1. Cari pemisah garis di awal baris.
  2. Jangan lewatkan awalan string apa pun.
  3. Pisahkan garis menjadi bidang dengan karakter tab.
  4. Jangan berharap bidang dikutip.
  5. Menafsirkan kemunculan tab, baris baru, atau "\" yang diawali dengan \ sebagai karakter literal yang merupakan bagian dari nilai bidang.

Sebaliknya, SELECT ... INTO OUTFILE berperilaku seperti ini secara default:

  1. Menulis tab di antara bidang.
  2. Tidak mengelilingi nilai bidang dengan tanda kutip.
  • Gunakan *" untuk menyorot tab, baris baru, atau "\" yang terjadi di dalam nilai bidang.
  • Menulis karakter baris baru di akhir baris.
Perhatikan bahwa menulis FIELDS ESCAPED BY "W akan membutuhkan dua garis miring terbalik untuk nilai yang perlu dibaca satu garis miring terbalik.
Catatan!
Jika Anda membuat file teks di sistem Windows, Anda mungkin perlu menentukan LINES TERMINATED BY "rn untuk membaca file dengan benar, karena program Windows biasanya menggunakan dua karakter ini sebagai pemisah baris. Beberapa program, seperti WordPad, mungkin menggunakan karakter "r " sebagai pemisah baris Untuk membaca file tersebut, gunakan LINES TERMINATED OLEH "r".
Jika semua baris file yang sedang dibaca memiliki awalan umum yang ingin Anda abaikan, gunakan LINES STARTING BY " string_prefixes untuk melewati awalan ini. Jika string tidak berisi awalan, maka akan dilewati seluruhnya.

opsi ABAIKAN nomor LINES digunakan untuk mengabaikan sejumlah baris tertentu di awal file. Misalnya, Anda dapat menggunakan IGNORE I LINES untuk melewati baris terdepan yang berisi nama kolom:
mysql> LOAD DATA INFILE "/tmp/test.txt" -> INTO TABLE test IGNORE 1 LINES;
Saat Anda menggunakan SELECT... INTO OUTFILE bersamaan dengan LOAD DATA INFILE untuk menulis data dari database ke file lalu membacanya dan memuatnya kembali ke database, opsi kontrol baris dan bidang untuk kedua pernyataan harus cocok. Jika tidak, LOAD DATA INFILE tidak akan dapat menginterpretasikan isi file teks dengan benar. Mari kita asumsikan bahwa Anda mengeluarkan data ke file teks menggunakan SELECT.. .INTO OUTFILE, memisahkan bidang dengan koma:
mysql> PILIH* INTO OUTFILE "data.txt" -> BIDANG DIHENTIKAN OLEH"," -> DARI table2;
Untuk membaca kembali file yang dipisahkan koma, hal yang benar untuk dilakukan adalah:
mysql> LOAD DATA INFILE "data.txt1 INTO TABLE table2 -> FIELDS DIHENTIKAN OLEH
Jika sebaliknya Anda mencoba membacanya dengan pernyataan di bawah ini, itu tidak akan berhasil karena LOAD DATA INFILE akan mencari tab di antara nilai bidang:
mysql> LOAD DATA INFILE "data.txt" KE TABEL table2 -> BIDANG DIHENTIKAN OLEH "t";
Hasil yang paling mungkin adalah menginterpretasikan string input sebagai bidang tunggal.
LOAD DATA INFILE juga dapat digunakan untuk membaca file dari sumber eksternal. Misalnya, file mungkin memiliki bidang yang dipisahkan dengan koma dan dilampirkan dalam tanda kutip ganda. Jika baris dalam file dipisahkan oleh karakter baris baru, contoh berikut mengilustrasikan opsi pemisah baris dan kolom yang harus disetel untuk memuat file:
mysql> LOAD DATA INFILE "data.txt" KE TABELtable_name-> BIDANG DIHENTIKAN OLEH 1,1 DITUTUP OLEH "" -> GARIS DIHENTIKAN OLEH"n";
Opsi apa pun yang menentukan pembatas baris dan kolom dapat diberikan string kosong ("") sebagai argumen. Jika argumen bukan string kosong, maka nilai UNTUK FIELDS ENCLOSED BY DAN FIELDS ESCAPED BY HARUS PILIHAN SINGLE-CHARACTER. FIELDS TERMINATED OPTIONS Arguments BY, LINES STARTING BY, dan LINES TERMINATED BY bisa lebih dari satu karakter. Misalnya, untuk menulis baris yang dipisahkan oleh carriage return/line feeds, atau untuk membaca file yang berisi baris tersebut, gunakan LINES TERMINATED BY "rn".
Untuk membaca file yang dipisahkan oleh baris dengan karakter %%, Anda dapat melakukan hal berikut:
mysql> BUAT TABEL lelucon
-> (KUNCI UTAMA INT BUKAN NULL AUTO_INCREMENT, -> lelucon TEKS BUKAN NULL);

mysql> LOAD DATA INFILE "/tmp/jokes,txf KE TABEL lelucon -> BIDANG DIHENTIKAN OLEH "" -> BARIS DIHENTIKAN OLEH "\n%%\n" (lelucon);
BIDANG YANG DITUTUP OLEH mengontrol pembatas bidang (tanda petik). Di output (SELECT ... INTO OUTFILE), jika Anda menghilangkan kata OPSIONAL, semua bidang akan dikelilingi oleh karakter yang ditentukan di ENCLOSED BY. Contoh keluaran tersebut (menggunakan koma sebagai pemisah bidang) ditunjukkan di bawah ini:
"1", "sebuah string", "100,20"
"2", "string yang berisi , koma", "102.20"
"3", "string yang berisi \" kutipan ","102.20"
"4", "string yang berisi \", kutipan dan koma", "102.20"
Jika Anda menentukan SECARA OPSIONAL, maka karakter ENCLOSED BY hanya berlaku untuk mengutip kolom CHAR dan VARCHAR:
1,"sebuah string",100.20
3,"sebuah string yang berisi \"kutipan",102.20
4,"sebuah string yang berisi \", kutipan dan koma",102.20
Perhatikan bahwa kemunculan karakter yang ditentukan dalam ENCLOSED BY dalam nilai bidang didahului oleh karakter yang ditentukan dalam ESCAPED BY. Selain itu, jika Anda menentukan nilai kosong untuk ESCAPED BY, ada kemungkinan file akan dihasilkan yang LOAD DATA INFILE gagal dimuat dengan benar.
Misalnya, jika karakter batal dibiarkan kosong, keluaran di atas akan terlihat seperti di bawah ini. Sangat mudah untuk melihat bahwa bidang kedua pada baris keempat berisi koma diikuti dengan tanda kutip, yang akan (secara keliru) terlihat seperti pemisah bidang.
1,"sebuah string",100.20
2,"sebuah string yang berisi , koma",102.20
3,"sebuah string yang berisi "kutipan",102.20
4,"sebuah string berisi ", kutipan dan koma",102.20
Saat masuk, karakter ENCLOSED BY, jika ada, dihapus dari akhir nilai bidang. (Benar apakah kata OPSIONAL ditentukan atau tidak. Kata ini tidak berpengaruh pada interpretasi input.) Kemunculan karakter ENCLOSED BY yang didahului oleh karakter ESCAPED BY ditafsirkan sebagai bagian dari nilai bidang saat ini.
Jika bidang diawali dengan karakter ENCLOSED BY, contoh karakter tersebut ditafsirkan sebagai mengakhiri nilai bidang hanya jika diikuti oleh bidang atau urutan TERMINATED BY. Untuk menghindari ambiguitas saat karakter ENCLOSED BY muncul di dalam nilai bidang, karakter tersebut dapat digandakan, dan akan ditafsirkan sebagai contoh tunggal dari karakter tersebut. Misalnya, jika ENCLOSED BY "" ditentukan, tanda kutip ditangani sebagai berikut:
"Bos" "BESAR"" -> Bos "BESAR" Bos "BESAR" -> Bos "BESAR" Bos "BESAR" -> Bos "BESAR"
FIELDS ESCAPED BY mengontrol pembacaan atau penulisan karakter khusus. Jika argumen FIELDS ESCAPED BY tidak kosong, ini digunakan sebagai awalan untuk karakter berikut dalam output:

  1. FIELDS DILUARKAN OLEH karakter.
  2. BIDANG YANG DITUTUP OLEH karakter.
  3. Karakter pertama dari BIDANG DIHENTIKAN OLEH DAN BARIS DIHENTIKAN OLEH urutan.
  4. ASCII 0 (yang ditulis mengikuti karakter batal sebagai ASCII "0", bukan byte nol).

Jika FIELDS ESCAPED BY karakter kosong, tidak ada karakter yang didahului oleh karakter escape, dan NULL dihasilkan sebagai NULL, bukan \N. Mungkin bukan ide yang baik untuk membiarkan argumen FIELDS ESCAPED BY kosong, terutama jika nilai bidang data Anda berisi salah satu karakter yang disebutkan.
Pada input, jika FIELDS ESCAPED BY tidak kosong, maka saat karakter tersebut muncul di string nilai, karakter tersebut dihapus, dan karakter yang mengikutinya dibaca secara harfiah sebagai bagian dari nilai kolom. Pengecualian adalah "0" atau "N" (SYS-PAGE-CONTENT atau \N jika "\" adalah karakter escape). Urutan ini ditafsirkan sebagai ASCII NUL (nol byte) dan NULL, masing-masing. Aturan untuk menangani NULL dijelaskan nanti di bagian ini.
Informasi lebih lanjut tentang sintaks pembatalan "\" dapat ditemukan di bagian Nilai Literal
Dalam beberapa kasus, opsi yang mengontrol bidang dan baris saling berinteraksi:

  1. Jika string kosong ditentukan untuk LINES TERMINATED BY dan FIELDS TERMINATED BY tidak kosong, maka LINES TERMINATED BY juga berfungsi sebagai pemisah baris.
  2. JIKA FIELDS TERMINATED BY DAN FIELDS ENCLOSED BY keduanya kosong, format string tetap (tanpa pembatas) digunakan. Format ini tidak menggunakan pemisah antar bidang (tetapi Anda dapat memiliki pemisah garis). Sebagai gantinya, nilai kolom ditulis dan dibaca menggunakan lebar tampilan kolom. Misalnya, jika kolom dideklarasikan sebagai INT(7), nilai kolom ditulis ke bidang tujuh karakter. Saat Anda mengetik, nilai kolom diambil dengan membaca tujuh karakter.

LINES TERMINATED BY masih digunakan untuk memisahkan baris. Jika satu baris tidak berisi semua bidang, kolom lainnya akan diatur ke nilai defaultnya. Jika Anda tidak memiliki terminator garis, nilainya harus disetel ke 1". Dalam hal ini, file teks harus berisi semua bidang pada setiap baris. Format panjang garis tetap juga menangani nilai NULL, seperti dijelaskan di bawah. Perhatikan bahwa panjang format garis tetap tidak berfungsi jika kumpulan karakter multi-byte digunakan (misalnya, Unicode).
Penanganan nilai NULL bervariasi tergantung pada opsi FIELDS dan LINES yang digunakan:

  1. Dengan nilai default FIELDS dan LINES, NULL ditulis sebagai nilai field sebagai \N ​​pada output, dan nilai \N ​​yang sama dibaca sebagai NULL pada input (dengan asumsi karakter ESCAPED BY diatur ke "\")-
  2. Jika FIELDS ENCLOSED BY tidak kosong, maka field yang berisi kata literal NULL dibaca sebagai nilai NULL. Ini berbeda dengan kasus di mana kata NULL terbatas pada FIELDS ENCLOSED BY karakter, di mana nilainya dibaca sebagai string "NULL".
  3. Jika FIELDS ESCAPED BY kosong, NULL ditulis sebagai kata NULL.
  • Dengan format string tetap (yang terjadi ketika FIELDS TERMINATED BY dan FIELDS ENCLOSED BY kosong), NULL ditulis sebagai string kosong. Perhatikan bahwa ini menyebabkan nilai NULL dan baris kosong dalam tabel menjadi tidak dapat dibedakan saat ditulis ke file, karena keduanya menulis baris nol. Jika Anda perlu membedakan keduanya, hindari menggunakan format panjang garis tetap.
    Di bawah ini adalah beberapa kasus yang tidak didukung oleh LOAD DATA INFILE:
    1. String dengan PANJANG tetap (FIELDS TERMINATED BY AND FIELDS ENCLOSED BY adalah nyc) jika ada kolom tipe TEXT atau BLOB.
    2. Jika Anda menentukan pembatas yang cocok dengan awalan yang lain, LOAD DATA INFILE tidak dapat menginterpretasikan input stream dengan benar. Misalnya, opsi berikut akan menimbulkan masalah:

    BIDANG DIHENTIKAN OLEH ""DITUTUP OLEH""

    • Jika FIELDS ESCAPED BY kosong, nilai bidang yang menyertakan karakter FIELDS ENCLOSED BY ATAU LINES TERMINATED BY diikuti oleh LINES TERMINATED BY akan menyebabkan LOAD DATA INFILE berhenti membaca file atau baris terlalu cepat. Ini akan terjadi karena LOAD DATA INFILE tidak dapat menentukan dengan benar di mana nilai bidang atau baris berakhir. Contoh berikut memuat semua kolom tabel persondata: mysql> LOAD DATA INFILE "persondata.txt" KE TABEL persondata;
      Secara default, jika tidak ada daftar kolom yang disediakan di akhir pernyataan LOAD DATA INFILE, baris masukan diharapkan berisi bidang untuk setiap kolom tabel. Jika Anda ingin memuat hanya beberapa kolom tabel, tentukan daftar kolom:
      mysql> MUAT INFILE DATA "persondata.txt1
      -> INTO TABLE persondata(col,col2,...);
      Anda juga harus menentukan daftar kolom jika urutan kolom dalam file input berbeda dengan urutan kolom dalam tabel. Jika tidak, MySQL tidak akan dapat memetakan kolom input ke kolom tabel.
      Jika file masukan memiliki terlalu sedikit bidang per baris, maka kolom yang hilang akan diberi nilai default. Menetapkan nilai default dijelaskan di bagian Sintaks CREATE TABLE.
      Nilai bidang kosong ditafsirkan berbeda dari yang hilang:
      1. Untuk tipe string, string kosong ditugaskan ke kolom.
      2. Untuk tipe numerik, kolom diberi 0.
      3. Untuk jenis tanggal dan waktu - kolom disetel ke jenis yang sesuai
        nilai "nol". Lihat Jenis Tanggal dan Waktu

      Ini adalah nilai yang sama yang dihasilkan dari penetapan string kosong secara eksplisit ke kolom jenis ini dalam pernyataan INSERT atau UPDATE.
      Nilai kolom TIMESTAMP disetel ke tanggal dan waktu saat ini hanya jika disetel ke NULL (yaitu, \N), atau jika kolom jenis itu dihilangkan dari daftar bidang, jika daftar bidang diberikan.

      LOAD DATA INFILE memperlakukan semua input sebagai string, jadi Anda tidak dapat menggunakan nilai numerik untuk kolom ENUM atau SET, seperti yang diperbolehkan dalam pernyataan INSERT. Semua nilai ENUM atau SET harus ditentukan sebagai string!
      Saat pernyataan LOAD DATA INFILE selesai, ia mengembalikan string informasi dalam format berikut:
      Catatan: I Dihapus: 0 Dilewati: 0 Peringatan: O
      Jika Anda bekerja dengan C API, Anda bisa mendapatkan informasi tentang pernyataan ini dengan memanggil fungsi mysql_info().
      Peringatan yang muncul pada kondisi tertentu sama dengan ketika memasukkan nilai dengan pernyataan INSERT (lihat bagian 6.1.4), kecuali bahwa LOAD DATA INFILE juga menghasilkan peringatan bahwa file input terlalu sedikit atau terlalu sedikit. banyak bidang. Peringatan tidak disimpan di mana pun, jumlah peringatan hanya dapat digunakan sebagai indikasi bahwa semuanya berjalan dengan baik.
      Dimulai dengan MySQL 4.1.1, Anda dapat menggunakan SHOW WARNINGS untuk mencantumkan peringatan max_error_count pertama sebagai informasi tentang Apa memuat salah. Lihat Sintaks TAMPILKAN PERINGATAN
      Sebelum MySQL 4.1.1, hanya jumlah peringatan yang merupakan indikasi bahwa beban tidak berjalan lancar. Jika Anda mendapat peringatan dan ingin tahu persis mengapa hal itu terjadi, satu-satunya cara untuk melakukannya adalah dengan menggunakan SELECT.. .INTO OUTFILE untuk membuang dump tabel ke file lain dan membandingkannya dengan file masukan asli.

Menavigasi Tutorial: 1.1 Apa itu MySQL? 1.2 Mengapa menggunakan MySQL? 1.3 Seberapa stabil MySQL? 1.4 Seberapa besar tabel MySQL? 1.5 MySQL, MySQL AB, MySQL-MAX: apa itu? 1.6 Sistem operasi apa yang dijalankan oleh MySQL? 1.7 Distribusi MySQL 1.8 Permintaan baris perintah MySQL 2.1 Pengantar MySQL 2.2 Menghubungkan ke server MySQL 2.3 Memasukkan kueri di MySQL 2.4 Membuat dan menggunakan database 2.5 Membuat database MySQL 2.6 Membuat tabel MySQL 2.7 Memuat data ke dalam tabel MySQL 2.8 Memilih semua data dari a Tabel MySQL 2.9 Memilih baris tertentu dari tabel MySQL 2.10 Memilih kolom arbitrer dari tabel MySQL 2.11 Menyortir baris dari tabel MySQL 2.12 Menghitung tanggal dalam tabel MySQL 2.13 Bekerja dengan nilai NULL dalam tabel MySQL 2.14 Pencocokan pola. Templat SQL. 2.15 Menghitung baris dalam template SQL. Fungsi COUNT() 2.16 Menggunakan banyak tabel dalam satu query SQL 2.17 Mendapatkan informasi tentang database dan tabel MySQL 2.18 Contoh query umum di MySQL 2.19 Nilai maksimum untuk kolom MySQL 2.20 Baris mana yang menyimpan maksimum kolom tertentu MySQL 2.21 Maksimum kolom dalam grup MySQL 2.22 B baris MySQL mana yang merupakan nilai maksimum menurut grup? 2.23 Menggunakan variabel pengguna di MySQL 2.24 Menggunakan klien MySQL dalam mode batch 3.1 String di MySQL 3.2 Angka di MySQL. Bagaimana cara menulis angka di MySQL? 3.3 Nilai heksadesimal di MySQL 3.4 Nilai NULL di MySQL 3.5 Database, tabel, indeks, kolom, dan nama alias di MySQL 3.6 Sensitivitas kasus di nama MySQL 3.7 Variabel pengguna di MySQL 3.8 Komentar di MySQL 3.9 MySQL reserved word 4.1 Database MySQL redundansi 4.2 sintaks MySQL BACKUP TABLE 4.3 sintaks MySQL RESTORE TABLE 4.4 sintaks MySQL CHECK TABLE 4.5 sintaks MySQL REPAIR TABLE 4.6 sintaks MySQL OPTIMIZE TABLE 4.7 sintaks MySQL ANALYZE TABLE 4.8 sintaks MySQL FLUSH 4.9 sintaks MySQL KILL 4.10 sintaks MySQL SHOW MySQL 4.11 Синтаксис SHOW TABLE STATUS в MySQL 4.12 синтаксиilan menunjukkan status В mysql 4.13 синтаксиilan variabel В mysql 4.14 back_log 4.15 karakter_set, concurrent_ -naDed, delay -llay_lime_lime _ion _iMin _iMin _iMin_ keluar, join_buffer_size, key_buffer_size 4. 20 language, log_bin, long_query_time 4.21 lower_case_table_names, max_allowed_packet, max_binlog_cache_size 4.22 max_connections, max_connect_errors, max_delayed_threads 4.23 max_join_size, max_sort_length, max_user_connections 4.24 max_tmp_tables, max_write_lock_count, myisam_sort_buffer_size 4.25 mуisam_max_extra_sоrt_file_size, myisam_max_sort_file_size, net_buffer_length 4.26 net_read_timeout, net_retry_count, net_write_timeout 4.27 open_files_limit, port, record_buffer 4.28 protocol_version , record_rnd_buffer, query_buffer_size 4.29 safe_show_databases, skip_networking, skip_show_databases 4.30 socket, sort_buffer, skip_show_databases 4.31 thread_cache_size, tmp_table_size, wait_timeout 4.32 Синтаксис SHOW PROCESSLIST в MySQL 4.33 Синтаксис SHOW GRANTS в MySQL 4.34 Синтаксис SHOW CREATE TABLE в MySQL 4.35 Файл опций my.cnf в MySQL 5.1 Tipe Kolom di MySQL 5.2 Tipe Numerik di MySQL 5.3 Tipe Tanggal dan Waktu di MySQL 5.4 Y2K (2000) Tipe Edisi dan Tanggal di MySQL 5.5 Jenis MySQL DATETIME, DATE, dan TIMESTAMP 5.6 Jenis MySQL TIME 5.7 Jenis MySQL YEAR 5.8 Jenis string MySQL CHAR dan VARCHAR 5.9 Jenis string MySQL BLOB dan TEXT 5.10 Jenis string MySQL ENUM 5.11 Jenis string MySQL SET 5.12 Memilih jenis yang tepat untuk MySQL kolom 5.13 Menggunakan tipe kolom dari DBMS lain untuk MySQL 5.14 Persyaratan memori untuk kolom MySQL 6.1 Fungsi untuk menggunakan MySQL di SELECT dan WHERE 6.2 Operator Tanda Kurung Tidak Diketik di MySQL 6.3 Operator Perbandingan Tidak Diketik di MySQL 6.4 Operator Logika MySQL 6.5 Fungsi Cabang di MySQL 6.6 Fungsi String di MySQL

Setelah membuat tabel, Anda harus mengisinya dengan data. Instruksi dan MENYISIPKAN berguna untuk ini. Bagaimana cara kerjanya, kita akan membicarakannya nanti, tetapi untuk saat ini mari kita pikirkan tentang data yang perlu dimasukkan ke dalam tabel. Bagaimana tepatnya penampilan mereka?

Mari kita asumsikan bahwa catatan hewan Anda dapat dideskripsikan seperti yang ditunjukkan di bawah ini. Perhatikan bahwa MySQL mengharapkan tanggal dalam format tahun-bulan-hari, ini mungkin berbeda dari yang biasa Anda gunakan. Tahun paling baik dimasukkan sebagai 4 digit. MySQL memiliki algoritme yang agak rumit untuk menangani nilai tahun dua digit dengan benar, tetapi Anda belum perlu memahaminya, jadi mari masukkan datanya dengan jelas. Semua data hewan untuk contoh kami ditunjukkan pada Tabel 2.2:

Tabel 2.2. Data Hewan

nama pemilik jenis seks kelahiran kematian
Empuk Harold kucing f 1993-02-04
Empuk Harold kucing f 1993-02-04
Cakar Gwen kucing m 1994-03-17
Buffy Harold anjing f 1989-05-13
Fang Benny anjing m 1990-08-27
bowser Diane anjing m 1989-08-31 1995-07-29
Riang gembira Gwen birdie f 1998-09-11
Whistler Gwen birdie 1997-12-09
Langsing Benny ular m 1996-04-29

Karena Anda memulai dengan tabel kosong, cara termudah untuk mengisinya adalah dengan membuat file teks yang berisi baris untuk setiap hewan Anda, lalu memuat konten file ke dalam tabel hanya dengan satu instruksi.

Anda dapat membuat file teks pet.txt yang berisi satu entri per baris, dengan nilai yang dipisahkan oleh tab stop sesuai urutan kolom yang dicantumkan dalam pernyataan CREATE TABLE. Untuk nilai yang hilang (seperti jenis kelamin yang tidak diketahui atau tanggal kematian hewan yang masih hidup), Anda dapat menggunakan nilai NULL. Untuk mempresentasikannya dalam file teks, gunakan label. Misalnya, entri tentang burung Whistler terlihat seperti ini (saya menandai tab dengan spasi):

Whistler Gwen birdie 09-12-1997

Untuk memuat data dari file teks pet.txt yang terletak di komputer lokal (klien) dan bukan di server ke dalam tabel pet, gunakan perintah LOAD DATA:

Mysql> LOAD DATA LOKAL INFILE "pet.txt" KE TABEL pet;

Kata kunci memiliki arti sebagai berikut. INFILE menentukan string yang merupakan nama file untuk membaca data dari. Karena namanya adalah string, maka diapit tanda kutip, jika tidak, MySQL akan mencoba mengevaluasinya sebagai ekspresi numerik. LOKAL menetapkan bahwa file harus dicari di sistem klien, bukan di server. KE TABEL menginstruksikan untuk memuat data ke dalam tabel yang namanya ditentukan segera setelah kata TABEL (dipisahkan oleh spasi).

Anda dapat menentukan pemisah nilai kolom dan penanda akhir baris secara eksplisit dalam pernyataan jika Anda mau, tetapi nilai defaultnya hanyalah tab dan baris baru. Mereka cukup untuk membaca file pet.txt dengan benar, dan Anda tidak memerlukan lebih banyak sekarang.

Saat Anda ingin menambahkan record baru satu per satu, instruksi ini berguna MENYISIPKAN. Dalam bentuknya yang paling sederhana, Anda memberikan nilai untuk setiap kolom dalam urutan kolom yang dicantumkan dalam pernyataan CREATE TABLE. Misalkan Diane menerima hamster Puffball baru sebagai hadiah. Anda dapat menambahkan entri baru menggunakan pernyataan INSERT, kira-kira seperti ini:

MySQL> MASUKKAN KE pet
-> NILAI ("Puffball", "Diane", "hamster", "f", "1999-03-30", "NULL");

Kata kunci di sini juga tidak terlalu sulit. INTO pet menentukan tabel mana yang akan disisipkan. NILAI menentukan daftar nilai yang akan disisipkan untuk entri baru dalam tabel. Nilai dicantumkan dipisahkan dengan koma dan semuanya diambil dalam tanda kurung.

Perhatikan bahwa string dan nilai tanggal didefinisikan sebagai string. Anda dapat menyisipkan NULL secara langsung (bukan sebagai string) untuk menyatakan tidak adanya nilai.

Anda dapat melihat dari contoh ini bahwa dibutuhkan banyak pengetikan untuk memuat langsung ke tabel. Instruksi menghemat banyak waktu.

Pernahkah Anda memuat data dari file ke dalam tabel dari file? Jika tidak, maka saya akan mencoba memberi tahu Anda secara singkat tentang salah satu cara untuk melakukan ini.

Memuat data ke dalam tabel dari file

LOAD DATA INFILE "data.csv" INTO TABLE my_table Konstruk ini akan membantu Anda memuat data dari file ke dalam tabel Anda.

Jika Anda ingin memuat data yang diformat, misalnya dipisahkan dengan koma, konstruksi berikut akan membantu Anda:

LOAD DATA INFILE "data.csv" KE TABEL LAPANGAN my_table DIHENTIKAN DENGAN "," TERLAMPIR OLEH """ LOLOS OLEH "\\" GARIS DIHENTIKAN OLEH "\r\n"
Apa artinya ini?

  • Cari akhiran baris sebagai karakter "\r\n"
  • Pisahkan baris menjadi bidang dengan karakter koma (,).
  • Harapkan bidang untuk diapit dalam karakter kutipan.
  • Tafsirkan kemunculan tab, baris baru, atau "\" yang diawali dengan "\" sebagai literal yang merupakan bagian dari nilai bidang.

konstruk LOAD DATA INFILE

Semua yang telah kami jelaskan di atas adalah konstruk LOAD DATA INFILE yang terkenal.

Akses ditolak karena kesalahan pengguna

Jika Anda tiba-tiba menemukan kesalahan akses ditolak untuk pengguna, maka Anda hanya perlu menambahkan atributnya LOKAL depan INFILE. Sebagai contoh:

LOAD DATA LOCAL INFILE "data.csv" KE TABEL my_table

Muat data ke dalam tabel dari file untuk bidang tertentu

LOAD DATA LOCAL INFILE "data.csv" KE TABEL t1 BIDANG DIHENTIKAN OLEH "," BARIS DIHENTIKAN OLEH "\n" (@ col1 ,@ col2 ,@ col3 ,@ col4 ) set name [email dilindungi] col4, id [email dilindungi] kolom2 ;

Di sini kami menentukan nama file (data.csv) dari mana data akan dimuat. Dalam konstruksi (@col1,@col2,@col3,@col4) kami menghitung semua kolom file untuk digunakan lebih lanjut. Dan kemudian, dengan menggunakan metode set yang sudah dikenal, kami menetapkan nilai kolom ini untuk bidang tabel tertentu.

LOAD DATA INFILE dengan GABUNG

Jika Anda perlu mengisi tabel dari file menggunakan yang sudah ada, Anda mungkin langsung berpikir untuk menggunakannya Ikuti. Kode untuk penyisipan data seperti ini terlihat seperti ini:

LOAD DATA LOCAL INFILE "data.csv" KE TABEL table_1 BIDANG DIHENTIKAN OLEH "\t" BARIS DIHENTIKAN OLEH "\r\n" (@col1,@col2,@col3,@col4) set [email dilindungi], username=(pilih nama pengguna dari pengguna di mana user_id = @col1);