使用 sqlsrv 驱动解决 sql server 中文乱码问题
这篇文章描述了使用 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
)
)