使用 sqlsrv 驱动解决 sql server 中文乱码问题

Php 2020-08-20 阅读 182 评论 0

这篇文章描述了使用 PHP 7.4.9 连接 Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64),解决中文乱码的问题。

1. odbc 驱动出现乱码

一开始使用 odbc 连接驱动。在 php.ini 中增加 pdo_odbc扩展。

extension=pdo_odbc

PHP 查询代码如下:

$dsn = "odbc:DRIVER={SQL Server};SERVER=127.0.0.1;DATABASE=test;charset=UTF-8";
$user = "user";
$password = "password";
$pdo = new PDO($dsn, $user, $password);
$sql = "SELECT name, number, spec, unit, GoodsID from Goods WHERE GoodsID=?";
$statement = $pdo->prepare($sql);
$statement->execute([1]);
$res = $statement->fetchAll(PDO::FETCH_ASSOC);
print_r($res);

运行后输出了乱码:

$ php index.php
Array
(
    [0] => Array
        (
            [name] => ?????Οh????(ԭζ)65g
            [number] => 6924160712389
            [spec] => 65g
            [unit] => ??
            [GoodsID] => 1
        )

)

以上方法,在 sql server 2000 中,可以正常输出中文。

2. 使用 sqlsrv 连接驱动

尝试使用 sqlsrv 驱动,修改 dsn 连接。

$dsn = "sqlsrv:Server=127.0.0.1;Database=test";

运行时出现错误:

could not find driver

参考官网 https://docs.microsoft.com/en-us/sql/connect/php/microsoft-php-driver-for-sql-server?redirectedfrom=MSDN&view=sql-server-ver15,下载最新驱动,并将相应的 dll 文件(我的电脑是 php_pdo_sqlsrv_74_nts_x64.dll )放在 ext 目录,在 php.ini 中增加:

extension=pdo_sqlsrv_74_nts_x64

重新运行,正常了。

$ php index.php
Array
(
    [0] => Array
        (
            [name] => 无穷盐焗鸡翅(原味)65g
            [number] => 6924160712389
            [spec] => 65g
            [unit] => 包
            [GoodsID] => 1
        )

)
最后更新 2020-08-20