【问题标题】:Microsoft SQL Server error with Laravel: Why this solves my mistake?Laravel 的 Microsoft SQL Server 错误:为什么这解决了我的错误?
【发布时间】:2016-11-12 13:31:29
【问题描述】:

我正在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 相同的错误。


有问题的表

这些是一些具有查询表的列:


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

我已经解决了在两个配置文件中进行两次更改:


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 使用 db-library(如果可用)连接到无法从 MSSQL 接收 unicode 数据的 Sql Server。 (1,2)——来自Here

所以我猜这可能是由于类型字段nvarchar...但是当我更改模型以删除所有带有nvarchar 的字段时,我仍然遇到同样的问题...


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

 [...]

'default' => 'sqlsrv',

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

[...]

不知道有没有另外一个configurationsqlsrv指定FreeTDS的版本。


tsql -C 命令的结果:

【问题讨论】:

    标签: sql-server laravel freetds nvarchar


    【解决方案1】:

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

    但无论如何。 FreeTDS 与 PHP 结合不是一个好的选择。尤其是最新的 PHP 版本。

    您应该更改为适用于 Linux 的 ODBC11 或 ODBC13。

    但又一次:你的基本错误是低 FreeTDS 版本。这取决于您尝试使用的 SQL Server 版本。你可以看到一个兼容性表here

    【讨论】:

    • 感谢您的回答。我试图在我的 Debian 中安装 ODBC13 (microsoft.com/en-us/download/details.aspx?id=50419) 但我猜它与这个操作系统不兼容......顺便问一下,你能告诉我为什么 FreeTDS 不是与 PHP 组合的好选择吗?还有...如何指定我是要使用FreeTDS 还是ODBC13
    • Microsoft 为 Linux 提供的 ODBC 驱动程序存在很多已知问题。 FreeTDS 在 Linux 上更可靠。如果您对某些细节感兴趣:groups.google.com/d/msg/django-developers/FbBcUCzrSZo/…
    • 是的,它“可能”是可靠的。我们也使用它,与 php 结合使用。但它仅适用于许多解决方法。如果您尝试使用交响乐并那样想,那将是痛苦的。但正如我所说,它可能是可靠的。这取决于您的应用程序大小和压力。
    【解决方案2】:

    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.2tds version = 7.3,具体取决于您安装的FreeTDS 驱动程序的版本。您可以在命令行中使用tsql -C 找到安装的 FreeTDS 版本。

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

    【讨论】:

    • 感谢您的回答。当我将tds version = 8.0 更改为7.27.3 时,我得到了与我在问题中暴露的相同的错误。同样,当我使用tsql -C 时,我只看到4.2 版本。你知道如何安装其他版本吗? (7.2,如您所愿
    • 确保在 freetds.conf 中将 TDS 版本设置为 7.2(在全局部分和 DSN 中)。但我猜你真的需要它作为你的 Laravel 连接字符串中的一个选项。你能在指定数据库连接信息的地方包含你的 Laravel 代码吗?
    • 当您运行tsql -C 时,它在哪里说您的freetds.conf 方式?我很好奇,如果您在 freetds.conf 配置的 [global] 部分更改为 7.2,为什么它会报告 4.2
    • TDS 版本很棘手,但我很高兴我们弄明白了!我有一个对 FreeTDS 的拉取请求,希望能在文档中更清楚地解释这一点:github.com/FreeTDS/freetds/pull/71/files
    • 非常感谢,您的帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多