Jika Anda melakukan echo($sql);
sebelum Anda menjalankannya, Anda akan melihat bahwa sintaks kueri Anda salah karena alasan berikut:
-
Nama file harus diapit dalam tanda kutip daripada tanda centang balik karena ini adalah string literal bukan pengenal.
-
Sama sekali tidak perlu memanggil
mysql_escape_string()
untuk menentukan pembatas diFIELDS TERMINATED BY
danENCLOSED BY
danESCAPED BY
klausa. -
Anda terlalu sering menggunakan backtick. Bahkan dalam kasus Anda, karena tidak ada kata khusus yang digunakan, Anda membuang semuanya. Mereka hanya menambah kekacauan.
-
Di akhir baris pertama file CSV, Anda harus memiliki
,,,
karena Anda menggunakannya sebagai bagian dari pembatas garis. Jika Anda tidak melakukannya, Anda tidak hanya akan melewati baris pertama tetapi juga baris kedua yang berisi data. -
Anda tidak dapat menggunakan
ENCLOSED BY
klausa lebih dari satu kali. Anda harus berurusan denganNumber
bidang dengan cara yang berbeda. -
Melihat baris sampel Anda IMHO, Anda tidak perlu
ESCAPED BY
. Tetapi jika Anda merasa membutuhkannya gunakan seperti iniESCAPED BY '\\'
.
Dikatakan bahwa pernyataan yang benar secara sintaksis mungkin terlihat seperti ini
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(date, name, type, number, duration, addr, pin, city, state, country, lat, log)
Sekarang IMHO Anda perlu mengubah beberapa bidang saat Anda memuatnya:
-
jika
date
di tabel Anda adalahdatetime
tipe data maka perlu diubah, jika tidak, Anda akan mendapatkan kesalahanNilai tanggal waktu salah:'18 Sep-2013 13:53:45' untuk kolom 'tanggal' pada baris
-
anda harus berurusan dengan qoutes tunggal di sekitar nilai dalam
Number
bidang -
kemungkinan besar Anda ingin mengubah
"null"
string literal keNULL
yang sebenarnya untukaddr, pin, city, state, country
kolom -
jika durasi selalu dalam detik maka Anda dapat mengekstrak nilai bilangan bulat dari detik dan menyimpannya seperti itu di tabel Anda agar dapat dengan mudah menggabungkan nilai durasi nanti.
Meskipun demikian, versi pernyataan yang berguna akan terlihat seperti ini
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null')
Di bawah ini adalah hasil mengeksekusi kueri di mesin saya
mysql> LOAD DATA INFILE '/tmp/detection.csv' -> INTO TABLE calldetections -> FIELDS TERMINATED BY ',' -> OPTIONALLY ENCLOSED BY '"' -> LINES TERMINATED BY ',,,\n' -> IGNORE 1 LINES -> (@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log) -> SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'), -> number = TRIM(BOTH '\'' FROM @number), -> duration = 1 * TRIM(TRAILING 'Secs' FROM @duration), -> addr = NULLIF(@addr, 'null'), -> pin = NULLIF(@pin, 'null'), -> city = NULLIF(@city, 'null'), -> state = NULLIF(@state, 'null'), -> country = NULLIF(@country, 'null'); Query OK, 3 rows affected (0.00 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0 mysql> select * from calldetections; +---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+ | date | name | type | number | duration | addr | pin | city | state | country | lat | log | +---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+ | 2013-09-18 13:53:45 | Unknown | outgoing call | 123456 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 | | 2013-09-18 13:54:14 | Unknown | outgoing call | 1234567890 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 | | 2013-09-18 13:54:37 | Unknown | outgoing call | 14772580369 | 1 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 | +---------------------+---------+---------------+-------------+----------+------+------+------+-------+---------+------+------+ 3 rows in set (0.00 sec)
Dan akhirnya di php menetapkan string kueri ke $sql
variabel akan terlihat seperti ini
$sql = "LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY ',,,\\r\\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null') ";