问题
I'm trying to write a MySQL script to import data into a table for my Linux server. Here is the script named update.sql
:
SET @query = CONCAT("LOAD DATA LOCAL INFILE '", @spaceName, "' INTO TABLE tmp FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';");
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
And also, I write a bash script named main.sh
:
mysql -h "localhost" -u "root" "-pmypassword" "mydb" -e "set @spaceName=\"$1\";source update.sql;"
Then I execute ./main.sh France.list
. The France.list
is the data file that I'm trying to import into my database.
However I get an error:
ERROR 1295 (HY000) at line 2 in file: 'update.sql': This command is not supported in the prepared statement protocol yet
I've found this question:
MySQL - Load Data Infile with variable path
So, does it mean that there is no way to pass arguments to LOAD DATA
query?
回答1:
You can't use PREPARE
to run LOAD DATA INFILE
.
The list of statements that you can run with PREPARE
are documented in this page: https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html under the subheading "SQL Syntax Allowed in Prepared Statements". Note this list may be different in earlier versions of MySQL.
Because you can't use PREPARE
, you can't do the method you're using by setting a variable and making a dynamic SQL statement.
But you can run LOAD DATA INFILE
without using PREPARE
. You have to interpolate the filename into the statement using shell variable substitution and then run it as a direct SQL statement.
Your update.sql file might look like this:
LOAD DATA LOCAL INFILE '%spacename%' INTO TABLE tmp
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
Then you can substitute your shell variable into the file and run the result this way:
sed s/%spacename%/$1/ update.sql |
mysql -h "localhost" -u "root" "-pmypassword" "mydb"
Another simpler way is to use mysqlimport, except this requires that the input filename be the same as your table name. You can either rename your input file to match the table you want to load into (which you call tmp
), or else create a symbolic link:
ln -s $1 /tmp/tmp.list
mysqlimport --local -h "localhost" -u "root" "-pmypassword" "mydb" /tmp/tmp.list
rm -f /tmp/tmp.list
The ".list" extension is ignored by mysqlimport, so you can use any file extension, or none.
回答2:
If you are using Java 8+, Mysql 8.0+ and Connector/J library 8.0.18 then might be you will face this issue like "command is not supported by this version" or something or similar to that.
To solve the issue, you have to add the property which tells preparedStatement to all load local infile. YOu have to add configure it, I configure it in connection url and resolve the issue.
jdbc:mysql://localhost:3306/tempDB?allowLoadLocalInfile=true
Few changes I have also made in my.cnf file like:
- local_infile = 1
来源:https://stackoverflow.com/questions/44360756/mysql-load-data-this-command-is-not-supported-in-the-prepared-statement-protoco