使用日语文件名的 PHP 文件上传在数据库中变成损坏的文件名

Posted

技术标签:

【中文标题】使用日语文件名的 PHP 文件上传在数据库中变成损坏的文件名【英文标题】:PHP file upload with japanese filename turns into corrupted filename in DB 【发布时间】:2022-01-07 17:22:30 【问题描述】:

我有一个 REST API 端点,可让您将文件上传到服务器。当我保存使用拉丁字母命名的文件时,没有问题。但是当我尝试保存一个包含日文字符的文件时,文件被保存并且服务器中的文件名是好的,但是当我查看数据库时文件名不正确。

保存文件时我的数据库中的结果:

但是当我查看服务器的外壳时,文件名是正确的:

我尝试将数据库排序规则更改为:

utf8mb4_unicode_ci utf8 utf8_general_ci ...但问题仍然存在。

更新:这是我插入数据的查询:

public function setFileQuery($param,$file)
  $this->module_id = $param['moduleid'];
  $this->file_name = $file['name'];
  $this->file_size = $file['size'];

  $q = "INSERT INTO data_file
       (module_id,file_name,file_size,start_time,end_time,elapse_time,through_put)
       VALUES
       (?,?,?,?,?,?,?)";
            
  $insertStmt = $this->conn->prepare($q);
  $insertStmt->execute([
    $this->module_id,
    $this->file_name,
    $this->file_size,
    null,
    null,
    null,
    null,
  ]);
            
  Responses::http_ok();

【问题讨论】:

能否分享一下insert 查询代码,用于向表中插入数据? 完成编辑@Dula先生的问题 查看***.com/questions/38363566/…中的“Mojibake” 可能与连接参数有关,但我没有看到足够的细节来确定。 【参考方案1】:

    首先,表格排序规则应设置为utf8mb4

    其次,确保数据字段(又名列)排序规则也是utf8mb4

    现在您可以插入数据(例如通过 phpMyAdmin 或通过任何 PHP 脚本):

    phpMyAdmin

    PHP

    如果您使用的是 PDO,请确保您已在连接中设置字符集,例如:
    $conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass);
    
    如果您使用的是 MySQLi
    $conn = mysqli_connect($servername, $username, $password, $dbname);
    
    /* change character set to utf8mb4 */
    mysqli_set_charset($conn,"utf8mb4");
    $mysqli->query("set names utf8mb4");
    

    ...然后执行查询,即:

    mysqli_query( "INSERT INTO song( songname ) VALUES( 'あああ.txt' )" );
    

    结果将如您所愿:

【讨论】:

将排序规则直接更改为 phpmyadmin 表不同吗? Phpmyadmin 只是一个用于执行数据库操作的工具(但它非常方便),例如更改数据库结构(包括排序规则)。或者你也可以通过 mysql 控制台输入命令。他们都会没事的。对于 PHP,只需确保您已指示您使用 utf8 作为字符集(请参阅我在 PDO 和 Mysqli 中的示例行) 请不要使用MyISAM;它正在消失。它可能会误导 MySQL 用户。另外,请使用 utf8mb4,而不是 utf8;前者正在标准化。 (这些 cmets 都不会影响有关损坏的日文字符的问题。) @RickJames,感谢您的 cmets,我已通过删除 MyISAM 并将所有 utf8 更改为 utf8mb4 来修改我的答案。

以上是关于使用日语文件名的 PHP 文件上传在数据库中变成损坏的文件名的主要内容,如果未能解决你的问题,请参考以下文章

文件上传图片

php 上传文件名出现乱码

php 文件中文文件名乱码的解决方法

如何在php中上传和解析CSV文件

php 使用$_FILES 能否获得上传文件的绝对地址

php中上传文件的散列内容