我正在尝试从运行 PHP 7.1 的 Linux 机器连接到一个命名实例的 MS SQL 数据库。我正在为 SQL Server 使用 ODBC Driver 17。
我已成功安装 Microsoft 的 ODBC 驱动程序并成功连接到非命名实例的数据库。对于命名实例,我已经尝试了所有我能想到的组合(带/不带端口、引号、括号等)
//$host = 'mySVR-SQL'; // THIS WORKS
//$host = '10.10.10.12345'; // THIS ALSO WORKS
$host = "SERV\INSTANCE_NAME"; // THIS DOES NOT WORK
$host = "SERV\INSTANCE_NAME,1433"; // THIS DOES NOT WORK
$host = "[SERV\INSTANCE_NAME]"; // THIS DOES NOT WORK
$host = '123.12.34.56\INSTANCE_NAME'; // THIS DOES NOT WORK
$user = 'my_username';
$pass = 'my_password';
$db = 'my_database';
$conn = "odbc:DRIVER={ODBC Driver 17 for SQL Server};SERVER=$host;DATABASE=$db";
$db_c = new PDO($conn, $user, $pass);
//connection string without variables for troubleshooting
$db_c = new PDO("odbc:Driver={ODBC Driver 17 for SQL Server};Server=123.12.34.56\INSTANCE_NAME;Database=MyDatabase", "my_username", "my_password");
这是我收到的错误信息:
SQLSTATE[HYT00] SQLDriverConnect: 0 [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired
如何进一步解决此问题?请注意,在 php 5.6 上使用 pdo_dblib 驱动程序之前,我能够正常连接。但是由于我们要升级到 PHP 7,我认为我们应该使用 Microsoft 驱动程序(它工作正常,除了命名实例。)
这确实有效(使用 dblib):
$db_c = new PDO("dblib:host=123.12.34.56\INSTANCE_NAME;dbname=MyDatabase;charset=utf8", "my_username", "my_password");
最佳答案
对于具有命名实例和自定义端口的 MS SQL 数据库,这将起作用:
new \PDO("sqlsrv:Server=IP_ADDRESS\\INSTANCE_NAME,CUSTOM_PORT;Database=DATABASE_NAME", "my_username", "my_password");
您需要使用 2 个反斜杠来转义反斜杠。如果有自定义端口,您需要将其包含在连接字符串中。
关于sql-server - 如何在 PHP 7 上使用 ODBC Driver 17 连接到命名实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54030009/