Почему я не могу использовать LOAD DATA LOCAL с PDO, хотя я могу от клиента cli?

Недавно я обновил свой 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); 

Шаги, предпринятые до сих пор для решения проблемы:

  • Я добавил local-infile = 1 в оба раздела [mysql] и [mysqld] /etc/mysql/my.cnf
  • Я проверил, что mysql.allow_local_infile = On находится в /etc/php5/cli/php.ini.
  • Пользователь БД является root и имеет все привилегии.
  • /tmp/test.csv существует, и у пользователя есть полные права на него.

Это ошибка в php. См. https://bugs.php.net/bug.php?id=68226 для объяснения и обхода проблемы.

Установка php5-mysqlnd для замены php5-mysql исправила проблему:

 sudo apt-get install php5-mysqlnd 

Он автоматически удалит php5-mysql.

Я предполагаю, что это ошибка либо в php5-mysql, либо в базовом libmysqlclient.