You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel向MS SQL Server插入阿拉伯语出现乱码问题求助

解决Laravel插入MS SQL Server阿拉伯语乱码问题

听起来你遇到的问题很典型——直接在SSMS里插入阿拉伯语完全正常,但通过Laravel操作就出现乱码,核心原因通常是连接字符集配置缺失或者参数传递方式没正确处理Unicode。下面一步步帮你解决:

1. 修正数据库连接配置

首先打开config/database.php,找到对应ticketingsystem_new的sqlsrv连接配置,确保以下设置正确:

'sqlsrv' => [
    'driver' => 'sqlsrv',
    'host' => env('DB_HOST', 'localhost'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8',
    'prefix' => '',
    'prefix_indexes' => true,
    'options' => [
        // 这两个选项是处理Unicode的关键
        PDO::ATTR_STRINGIFY_FETCHES => false,
        PDO::ATTR_EMULATE_PREPARES => false,
    ],
],

修改完成后,记得清除配置缓存让新设置生效:

php artisan config:clear

2. 抛弃手动拼接SQL——用参数绑定

你之前直接把$request->reason拼进SQL的写法,不仅有严重的SQL注入风险,还会导致Unicode处理出错(哪怕加了N'...',PHP字符串编码和PDO的模拟预处理也可能破坏这个前缀)。推荐用Laravel的查询构造器或者参数绑定的原生查询:

方式一:查询构造器(最推荐)

DB::connection('ticketingsystem_new')
    ->table('[DatabaseName].[dbo].[Table]')
    ->insert([
        'Reason' => $request->reason,
        'Feeling' => $request->feeling,
    ]);

Laravel的SQL Server驱动会自动识别NVARCHAR列,为参数添加N前缀,确保阿拉伯语这类Unicode字符正确插入。

方式二:参数绑定的原生查询

如果一定要用原生SQL,用问号占位符绑定参数:

DB::connection('ticketingsystem_new')->insert(
    "INSERT INTO [DatabaseName].[dbo].[Table] (Reason, Feeling) VALUES (?, ?)",
    [$request->reason, $request->feeling]
);

3. 额外检查项

  • 确保PHP的mbstring扩展已启用,它负责处理阿拉伯语这类多字节字符。
  • 检查php.ini的default_charset设置为UTF-8,保证PHP默认字符集正确。
  • 如果用Eloquent模型,确认模型对应的表和字段没有手动设置错误的字符集属性。

为什么SSMS没问题?因为SSMS连接SQL Server时默认启用Unicode支持,而Laravel的PDO连接如果没配置好,会默认用非Unicode方式传递字符串,导致阿拉伯语被转成乱码。

内容的提问来源于stack exchange,提问作者Eslam Kalash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:03:51