Microsoft SQL Laravel 服务器错误:为什么这解决了我的错误?

Microsoft SQL Server error with Laravel: Why this solves my mistake?

我正在 Laravel 中创建一个应用程序,它访问存储在远程数据库 Microsoft SQL Server 中的信息。

而且我遇到了一个错误,我解决了;但我不太清楚为什么...

问题

我在 Microsoft SQL Server 的数据库中创建了一个“users”table,以便通过登录系统使用该应用程序:效果很好。

我的工作是显示 Microsoft SQL Server 现有数据库中 table 的信息...所以我创建了其中一个 [=110] 的 model =]s — 例如,调用 SalesBUT 当我尝试查询信息时:

$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 相同的错误。


有问题table

这些是查询的一些列 table:


我是如何解决这个问题的:

我已经解决了对两个配置文件进行两项更改的问题:


1) 里面 /etc/freetds/freetds.conf

我更改了 tds 版本:

tds version = 4.2

tds version = 8.0

并将客户端字符集设置如下:

client charset = UTF-8

2) 里面 /etc/php5/apache2/php.ini

mssql.charset = "UTF-8"

default_charset = "UTF-8"

我的问题:为什么这有效?

据我了解,这是由于:

Laravel uses db-library (if it's available) to connect to Sql Server which cannot receive unicode data from MSSQL. (1,2) — From Here

所以我猜这可能是由于类型字段 nvarchar...


我的 Laravel 数据库配置的片段:config/database.php

 [...]

'default' => 'sqlsrv',

    [...]
    'sqlsrv' => array(
        'driver' => 'sqlsrv',
        'host' => 'foo.bar',
        'database' => 'MyDataBase',
        'username' => 'UserName',
        'password' => 'MySecret',
        'prefix' => ''
    )

[...]

不知道还有没有configuration for sqlsrv来指定FreeTDS的版本。


tsql -C 命令的结果:

嗯,FreeTDS 4.2 太旧了。它有很多限制。你应该考虑更高的版本。

但无论如何。与 PHP 结合使用的 FreeTDS 不是一个好的选择。特别是最新的 PHP 版本。

您应该更改为 ODBC11 或 ODBC13,它也适用于 Linux。

但是再说一次:你的基本错误是低 FreeTDS 版本。这取决于您尝试使用的 SQL 服务器的版本。可以看到兼容性tablehere.

tds version = 4.2 是 FreeTDS 的全局默认值,但非常过时,不支持 UTF-8,即使连接到现代版本的 SQL 服务器也出现问题.请在此处查看文档:

http://www.freetds.org/userguide/choosingtdsprotocol.htm

您的 nvarchar 列将需要 UTF-8 整个堆栈。

另请注意,tds version = 8.0 已弃用且无效,可能会在未来的 FreeTDS 版本中删除。您 可能 想要 tds version = 7.2tds version = 7.3,具体取决于您安装的 FreeTDS 驱动程序的版本。您可以从命令行使用 tsql -C 找到安装的 FreeTDS 版本。

更新:密钥正在更改 tds version = 7.2