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
相关产品推荐
相关产品推荐

