Недавно я обновил свой Ubuntu 10.04 dev до 14.04. Это на самом деле свежая инсталляция. Версия PHP была 5.4.15, и теперь это PHP 5.5.9. MySQL перешел от 5.1.67 до 5.5.37.
Я пытаюсь LOAD LOCAL DATA INFILE на новом сервере. Он работает с командой local client mysql cli. Это не работает при выполнении PDO:
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version' in /home/ubuntu/mysqltest.php:21 Stack trace: #0 /home/ubuntu/mysqltest.php(21): PDO->exec('LOAD DATA LOCAL...') #1 {main} thrown in /home/ubuntu/mysqltest.php on line 21
Код, который генерирует ошибку:
ini_set('mysql.allow_local_infile', 1); echo "mysql.allow_local_infile: ".ini_get("mysql.allow_local_infile").PHP_EOL; $options = array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1); $db = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPassword, $options); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec("CREATE TEMPORARY TABLE tmp_table ( id INT(4), col1 varchar(128) ) ENGINE MYISAM"); $loadSQL = <<<'EOT' LOAD DATA LOCAL INFILE '/tmp/test.csv' INTO TABLE `tmp_table` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (id, col1) EOT; $db->exec($loadSQL);
Шаги, предпринятые до сих пор для решения проблемы:
Это ошибка в php. См. https://bugs.php.net/bug.php?id=68226 для объяснения и обхода проблемы.
Установка php5-mysqlnd для замены php5-mysql исправила проблему:
sudo apt-get install php5-mysqlnd
Он автоматически удалит php5-mysql.
Я предполагаю, что это ошибка либо в php5-mysql, либо в базовом libmysqlclient.