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

问题描述 投票:4回答:2

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

我遇到了一个错误,我解决了;但我不知道为什么......

The Problem

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

The problematic table

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

nvarchar

How I solved this:

我已经解决了两个配置文件中的两个更改:


1) Inside /etc/freetds/freetds.conf

我更改了tds版本:

tds version = 4.2

tds version = 8.0

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

client charset = UTF-8

2) Inside /etc/php5/apache2/php.ini

mssql.charset = "UTF-8"

default_charset = "UTF-8"

My question: Why this works?

据我所知,这是由于:

Laravel使用db-library(如果可用)连接到无法从MSSQL接收unicode数据的Sql Server。 (1,2) - 来自Here

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

Fragment of my Laravel database config: config/database.php

 [...]

'default' => 'sqlsrv',

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

[...]

我不知道configuration是否还有另一个sqlsrv来指定FreeTDS的版本。

Result of tsql -C command:

enter image description here

sql-server laravel freetds nvarchar
2个回答
4
投票

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


0
投票

好吧FreeTDS 4.2太旧了。它有很多局限性。你应该考虑更高的版本。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.