我在Laravel
中创建一个应用程序,它访问存储在远程数据库Microsoft SQL Server
中的信息。
我遇到了一个错误,我解决了;但我不知道为什么......
我在Microsoft SQL Server
的数据库中创建了一个“users”表,以便通过登录系统使用该应用程序:运行良好。
我的工作是显示Microsoft SQL Server
现有数据库中的表格中的信息......所以我创建了其中一个表格的model
,例如Sales
-当我尝试查询信息时:
$sale = Sales::find("1");
我收到下一个错误:
SQLSTATE[HY000]: General error: 4004 General SQL Server error: Check messages from the SQL Server [4004] (severity 16) [(null)]
与其他Eloquent
方式和Fluent
相同的错误。
这些是具有查询表的一些列:
我已经解决了两个配置文件中的两个更改:
我更改了tds版本:
tds version = 4.2
至
tds version = 8.0
并设置客户端字符集如下:
client charset = UTF-8
mssql.charset = "UTF-8"
default_charset = "UTF-8"
据我所知,这是由于:
Laravel使用db-library(如果可用)连接到无法从MSSQL接收unicode数据的Sql Server。 (1,2) - 来自Here
所以我想这可能是由于类型字段nvarchar
...但是当我改变我的模型以删除nvarchar
的所有字段时,我仍然遇到同样的问题...
[...]
'default' => 'sqlsrv',
[...]
'sqlsrv' => array(
'driver' => 'sqlsrv',
'host' => 'foo.bar',
'database' => 'MyDataBase',
'username' => 'UserName',
'password' => 'MySecret',
'prefix' => ''
)
[...]
我不知道configuration是否还有另一个sqlsrv
来指定FreeTDS
的版本。
tsql -C
command:tds version = 4.2
是FreeTDS的全局默认值,但非常过时,不支持UTF-8
,即使连接到现代版本的SQL Server也存在问题。请参阅此处的文档:
http://www.freetds.org/userguide/choosingtdsprotocol.htm
您的nvarchar
列将需要整个堆栈中的UTF-8
。
另请注意,tds version = 8.0
已弃用且无效,可能会在将来的FreeTDS版本中删除。您可能需要tds version = 7.2
或tds version = 7.3
,具体取决于您安装的FreeTDS驱动程序的版本。您可以从命令行使用tsql -C
找到安装的FreeTDS版本。
更新:关键是改变tds version = 7.2
。
好吧FreeTDS 4.2太旧了。它有很多局限性。你应该考虑更高的版本。
但无论如何。 FreeTDS与PHP的结合并不是一个好的选择。特别是最新的PHP版本。
您应该更改为ODBC11或ODBC13,它也适用于Linux。
但同样:你的基本错误是FreeTDS版本低。这取决于您尝试使用的SQL Server版本。你可以看到兼容性表here。