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

标签 php mysql character-encoding collation

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

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

phpMyAdmin displays one rowset with text of nonsensical characters

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

puTTY displays a proper UTF-8 filename with Hiragana in a shell

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

  • 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();
}

最佳答案

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

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

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

    • phpMyAdmin: phpMyAdmin INSERT query with Hiragana literal

    • 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. 结果将如您所愿: phpMyAdmin displaying one rowset with Hiragana text

关于使用日语文件名上传的 PHP 文件在数据库中变成损坏的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70178773/

相关文章:

character-encoding -\377\376 附加到文件(Windows -> Unix)

html - 使用 UTF-8 时我应该对 HTML 特殊字符进行编码吗?

php - 如何让 Mysql 查询(多连接)更快更高效

php - 删除查询正确,但无法删除

php - 如何正确设置文件、数据库、连接等的编码?

敏感数据的 MySQL 数据库安全性

mysql - 在删除表之前删除行

C# - MD5 哈希与预期值不匹配

javascript - 使用 jQuery 和 Laravel 对数据进行排序的最佳方式?

具有多个步骤的 PHP AJAX 进度条更新