为 Windows 10 上的 SQL Server 的 ODBC 驱动程序 11 设置 DSN 编码

Dan*_*.P. 5 sql-server pdo connection-string database-connection dsn

TL;TR

如何强制此 ODBC 驱动程序以 UTF-8 编码?

详细说明

我正在编写 PHP 5. 5. 应用程序,它使用 ODBC 驱动程序通过PDO连接到数据库 Microsoft SQL Server 2014 。更具体地说,我正在使用“ ODBC Driver 11 for SQL Server ”。

我在两个环境(平台)中运行应用程序:

  1. 生产 - Linux/Ubuntu/Appache PHP/UnixODBC
  2. 开发 - Windows 10/Wamp

为了配置 PDO 连接,我使用的是 DSN 源。要连接到 SQL 服务器,我使用以下命令:

$conn = new PDO("odbc:mssql_test", $user_name, $password);
Run Code Online (Sandbox Code Playgroud)

由于它是 PHP 应用程序,因此我需要以 UTF-8 编码返回来自 SQL 的数据。数据库中的数据有捷克字符,当数据不是用 UTF-8 编码时,这很棘手。

在生产平台上,一切正常。查询按预期返回(在 UTF-8 中)。

但是,我无法在 Windows 10(开发平台)配置DSN,以获取 UFT-8 中的数据(似乎我正在获取在 win1250 中编码的数据),当捷克字符作为问号出现在结果中时这一点值得注意询问。

要配置 DSN,我正在使用位于以下位置的 Windows DSN 管理工具:

C:\Windows\System32\odbcad32.exe
Run Code Online (Sandbox Code Playgroud)

我将 DSN 添加到选项卡系统 DSN,但没有设置编码的选项。

有什么方法或解决方法可以在 Windows 10 上以 UTF-8 格式获取数据(不使用 PHP 方式,例如 iconv, mb_convert_encoding,因为它唯一的开发问题和 DSN 配置问题)。

请注意,我试过这样想,但没有成功:

$conn = new PDO("odbc:mssql_test", $user_name, $password, array("charset" => "UTF-8"));
$conn->exec("set names utf8");
Run Code Online (Sandbox Code Playgroud)

或(以下代码有效,但在 Windows 上无法获得 UTF-8)

$dsn = "odbc:DRIVER={ODBC Driver 11 for SQL Server};SERVER=$server_address};CHARSET=UFT-8";
$conn = new PDO($dsn, $user_name, $password);
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!

3 个月后编辑 我最终切换到 FreeTDS 和 Linux 进行开发和生产环境。目前似乎不可能在使用 PHP 5.5 时将 ODBC 驱动程序 11 配置为以 UTF-8 编码。在 Windows 10 上...

小智 7

在 Windows 上使用 ODBC 时,数据库客户端字符集在非 Unicode 应用程序的语言设置中定义。SQL Server 客户端使用当前的 ANSI 代码页 (ACP)。

在 Windows 10 上,单击“开始”并键入“区域”,选择“区域和语言设置”,然后单击“管理语言设置”。单击更改系统区域设置并选中使用 unicode UTF-8 ...

这应该够了吧。