使用日语文件名的 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 文件上传在数据库中变成损坏的文件名的主要内容,如果未能解决你的问题,请参考以下文章