所以我正在使用 Linux(ubuntu)并尝试连接到 Microsoft Azure SQL 数据库。
服务器信息:
服务器地址是 a1a1a1a1a1.database.windows.net (a1a1a1a1a1 是我的服务器名称的占位符)
数据库名称为 MyDatabase
该表名为 [dbo].[Sloth]
Freetds.conf 设置:
[global]
dump file = /tmp/freetds.log
debug flags = 0xffff
text size = 64512
[a1a1a1a1a1.database.windows.net]
host = a1a1a1a1a1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8
当我跑步时
php -r "phpinfo();" | grep "PDO drivers"
在终端它返回
PDO drivers => dblib, mysql
所以据我所知,所有的配置和驱动程序安装都是应该的。
现在来看看错误:
错误 1
如果我像这样初始化 PDO:
$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
它可以连接,但如果我删除 dbname 的“=”字符周围的空格,如下所示:
$conn = new \PDO ( "dblib:dbname=MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
它从 PDOException 和 freetds.log 返回这些错误
SQLSTATE[HY000] General SQL Server error: Check messages from the SQL Server (severity 16)
(dbutil.c:86):msgno 40508: "USE statement is not supported to switch between databases. Use a new connection to connect to a different Database."
错误 2
当我运行以下代码时
try {
$conn = new \PDO ( "dblib:dbname = MyDatabase;host=a1a1a1a1a1.database.windows.net;", $Username, $Password);
$conn->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
$statement = $conn->prepare("SELECT * FROM dbo.Sloth");
$result = $statement->execute();
}
catch ( PDOException $e ) {
print( "Error connecting to SQL Server." );
die(print_r($e));
}
它在 $result = ... 行处中断,并出现来自 PDOException 和 freetds.log 的这些错误
SQLSTATE[HY000]: General error: 208 General SQL Server error: Check messages from the SQL Server [208] (severity 16) [(null)]
(dbutil.c:86):msgno 208: "Invalid object name 'dbo.Sloth'."
但是当我运行查询时
SELECT * FROM dbo.Sloth
在 Azure 数据库管理门户中,它返回所有正确的行。
任何有关这些问题的帮助都将不胜感激!
编辑
通过一些测试,我发现这两个问题都源于 PDO 没有连接到数据库,而是连接到“主服务器”。这可以解释 ERROR 2 的无效对象名称错误。
您对为什么 ERROR 1 中的代码无法连接到 MyDatabase 有什么想法吗?
答案1
解决方案
我使用的是 PHP 5.3.10,它仍然存在以下错误,https://bugs.php.net/bug.php?id=64338
事实证明,PDO 驱动程序正在发出 Microsoft Azure SQL 数据库不喜欢的 USE 语句。
我升级到 PHP 5.4.21 并且一切运行正常。