Search code examples
mysql

MySQL LOAD_FILE() loads null values


I'm attempting to load a directory of xml files into a database table as blobs. Each row would contain a corresponding blob file. When loading files via a python script into the table, values are inserted as null. This is also the case when running an equivalent command in the mysql command line.

At one point I was able to insert values after changing some folder permissions to mysql, but due to needed scripting privileges I had to modify ownership of the directory /var/lib/mysql/foo, thus values are being reinserted as null effectively breaking the script I wrote. I cannot remember the necessary change of directory permissions to do so.

The following are discussions of the topic:

http://bugs.mysql.com/bug.php?id=38403

along with

MySQL LOAD_FILE returning NULL


Solution

  • Make sure:

    • there is execute permission on the parent directory
    • The FILE privilege must is explicily granted. (GRANT FILE on . TO user@localhost)
    • You have flushed privileges
    • You have logged out and logged back in

    Example of permission on parent dir:

    
    mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg`
    drwxrwxr--. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images
    
    mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/image
    
    Test01.jpg'));
    +-------------------------------------------------------------------------------------------------------------+
    | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) |
    +-------------------------------------------------------------------------------------------------------------+
    | NULL                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    
    
    mysql> \! chmod o+x /home/jlam/code/projectName/doc/filesForTesting/images
    mysql> \! ls -ld `dirname /home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg`
    drwxrwxr-x. 2 jlam jlam 4096 May 12 14:22 /home/jlam/code/projectName/doc/filesForTesting/images
    mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'));
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                                                                                                                
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    
    

    Example of user privileges:

    
    16:38:09 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal
    Enter password: 
    
    mysql> show grants;
    +-----------------------------------------------------------------------------------------------------------------+
    | Grants for eventCal@localhost                                                                                   |
    +-----------------------------------------------------------------------------------------------------------------+
    | GRANT USAGE ON *.* TO 'eventCal'@'localhost' IDENTIFIED BY PASSWORD '*xxxx' |
    | GRANT ALL PRIVILEGES ON `tmp`.* TO 'eventCal'@'localhost'                                                       |
    | GRANT ALL PRIVILEGES ON `eventCalTesting`.* TO 'eventCal'@'localhost'                                           |
    | GRANT ALL PRIVILEGES ON `eventCal`.* TO 'eventCal'@'localhost'                                                  |
    | GRANT ALL PRIVILEGES ON `eventCal_categoryMigration`.* TO 'eventCal'@'localhost'                                |
    +-----------------------------------------------------------------------------------------------------------------+
    5 rows in set (0.00 sec)
    
    mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'));
    +-------------------------------------------------------------------------------------------------------------+
    | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) |
    +-------------------------------------------------------------------------------------------------------------+
    | NULL                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    

    In other root session:

    
    mysql> grant file ON *.*  to eventCal@localhost;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    
    

    Back in user session, I still can't load the file

    
    mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'));
    +-------------------------------------------------------------------------------------------------------------+
    | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg')) |
    +-------------------------------------------------------------------------------------------------------------+
    | NULL                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    

    .....But if I log out and back in:

    
    mysql> exit
    Bye
    
    16:40:14 (getImages) ~/code/projectName/doc/filesForTesting/images$ mysql -u eventCal -p eventCal
    Enter password: 
    
    mysql> select hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'));
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | hex(LOAD_FILE('/home/jlam/code/projectName/doc/filesForTesting/images/imageTest01.jpg'))                                                                                                                                
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    | FFD8FFE1001845786966000049492A00080000000000000000000000FFEC00114475636B7900010004000000500000FFE10407687474703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F003C3F787061636B657420626567696E3D22EFBBBF222069643D2257354D304D7043656869487
    +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------