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

PHP file upload with japanese filename turns into corrupted filename in DB

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

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

但是当我查看服务器的 shell 文件名是正确的:

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

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

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();
}
  1. 首先,table排序规则应该设置为utf8mb4

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

  3. 现在您可以插入数据(例如通过 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' )" );
      
  4. 结果如愿: