例如,在 Nodejs 中你有path.sep
,在 Java 中你有File.separator
。你在 mysql 中有类似的东西吗?如果不是,哪种方式是以适用于任何操作系统的方式处理路径分隔符的最佳方法?
我需要它,以便我可以将正确的路径传递给 LOAD_FILE(( 函数,而无需担心当前的操作系统。
我发现我可以在参数化查询中传递path.sep
或File.separator
的值:
"insert into MY_TABLE (file_contents) values (LOAD_FILE(?))", my_folder+File.separator+filename
不是我真正想要的,但至少对我有用。
MySQL查询以获取路径分隔符:
SELECT IF(INSTR(LOWER(@@global.version_compile_os), 'win'), '\', '/') AS `path_separator`;
<小时 />MySQL函数获取路径分隔符:
DELIMITER $$
CREATE FUNCTION `path_separator`()
RETURNS VARCHAR(1)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE `path_separator` VARCHAR(1);
SELECT IF(INSTR(LOWER(@@global.version_compile_os), 'win'), '\', '/') INTO `path_separator`;
RETURN `path_separator`;
END $$
DELIMITER ;
SELECT `path_separator`();
<小时 />用于构建文件路径的 MySQL 查询:
注意:如果MySQL服务器在Windows上运行,则可能需要转义反斜杠(Windows路径分隔符(,具体取决于您的用例。
SELECT CONCAT(
@@global.secure_file_priv,
CONCAT_WS(
`path_separator`(),
'foo',
'bar',
'baz.csv'
)
) AS `output_file_path`;
输出:
'C:ProgramDataMySQLMySQL Server 8.0Uploadsfoobarbaz.csv'
<小时 />示例:导出 CSV 文件。
笔记:
- 如果MySQL服务器使用--secure-file-priv选项运行,则路径必须位于"上传"目录中,否则您将获得
"Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement"
。 - 无法在"上传"目录中创建子目录,否则您将获得
"Error Code: 1. Can't create/write to file 'C:ProgramDataMySQLMySQL Server 8.0Uploadsfoobar.csv' (OS errno 2 - No such file or directory)"
.
DELIMITER $$
CREATE PROCEDURE `csv_export`()
BEGIN
DECLARE csv_file_path TEXT;
SELECT
REPLACE(
CONCAT(
@@global.secure_file_priv,
CONCAT_WS(
`path_separator`(),
'foo.csv'
)
),
'\',
'\\'
)
INTO csv_file_path;
SET @sql = '
SELECT id
INTO
OUTFILE ''csv_file_path''
FIELDS TERMINATED BY '',''
ENCLOSED BY ''"''
LINES TERMINATED BY ''n''
FROM your_table
LIMIT 1;
';
SET @sql = REPLACE(@sql, "csv_file_path", csv_file_path);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
CALL `csv_export`();
如果您需要转义文本列中的双引号,以便 Excel 可以正确读取 CSV 文件,请在此处查看我的答案。