如何解决Yii2+PHP8.0向PostgreSQL插入阿拉伯语转义为符号的问题
Yii2插入阿拉伯语转HTML实体的解决办法
问题根源
阿拉伯语词汇插入数据库后变成HTML实体编码,但查询时能正常显示,本质是插入过程中被自动做了HTML转义,大概率是Yii2的ActiveRecord默认转义规则导致,也可能和Excel读取逻辑有关。
具体解决步骤
1. 关闭Yii2模型的自动转义
在对应数据模型的rules()方法里,给存储阿拉伯语的字段添加safe规则,让Yii2不对该字段做HTML转义:
public function rules() { return [ // 保留其他原有规则 ['arabic_column', 'safe'], // 将arabic_column替换为你的实际字段名 ]; }
如果是手动赋值后保存,也可以用save(false)跳过验证,但优先推荐用safe规则,更符合开发规范。
2. 检查Excel读取代码
若使用PhpSpreadsheet(或旧版PHPExcel)读取Excel,确认代码里没有手动调用htmlspecialchars()这类转义函数:
// 错误写法(会触发转义) $arabicContent = htmlspecialchars($sheet->getCell('B2')->getValue()); // 正确写法 $arabicContent = $sheet->getCell('B2')->getValue();
3. 确认数据库字符集配置
确保PostgreSQL的数据库、目标表、字段都采用UTF-8编码(推荐utf8mb4,兼容更多特殊字符):
- 查看表的编码:
SELECT pg_encoding_to_char(c.encoding) FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE relname = 'your_table_name'; -- 替换为你的表名
- 若编码不符合要求,修改表编码:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4;
4. 修复已插入的错误数据
如果数据库里已经存在转义后的实体编码数据,可以用SQL批量反转义:
UPDATE your_table_name SET arabic_column = html_entity_decode(arabic_column); -- 替换为实际字段名
或者用PHP处理后重新保存:
$models = YourModel::find()->all(); foreach ($models as $model) { $model->arabic_column = html_entity_decode($model->arabic_column, ENT_QUOTES, 'UTF-8'); $model->save(false); }
内容的提问来源于stack exchange,提问作者Shamnad
相关产品推荐
相关产品推荐

