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 — 例如,调用 Sales
— BUT 当我尝试查询信息时:
$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.2
或 tds version = 7.3
,具体取决于您安装的 FreeTDS 驱动程序的版本。您可以从命令行使用 tsql -C
找到安装的 FreeTDS 版本。
更新:密钥正在更改 tds version = 7.2
。
我正在 Laravel
中创建一个应用程序,它访问存储在远程数据库 Microsoft SQL Server
中的信息。
而且我遇到了一个错误,我解决了;但我不太清楚为什么...
问题
我在 Microsoft SQL Server
的数据库中创建了一个“users”table,以便通过登录系统使用该应用程序:效果很好。
我的工作是显示 Microsoft SQL Server
现有数据库中 table 的信息...所以我创建了其中一个 [=110] 的 model
=]s — 例如,调用 Sales
— BUT 当我尝试查询信息时:
$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.2
或 tds version = 7.3
,具体取决于您安装的 FreeTDS 驱动程序的版本。您可以从命令行使用 tsql -C
找到安装的 FreeTDS 版本。
更新:密钥正在更改 tds version = 7.2
。