【问题标题】:Laravel: Generated SQL throws error only on specific tablesLaravel:生成的 SQL 仅在特定表上引发错误
【发布时间】:2016-04-06 18:49:56
【问题描述】:

我正在使用 Eloquent ORM 或 Query Builder 通过 Laravel 访问 MS SQLServer。这适用于所有表,但一个特定表会引发此错误:

production.ERROR: exception 'Illuminate\Database\QueryException' 
with message 'SQLSTATE [HY000]: General error: 4004 General SQL Server error: 
Check messages from the SQL Server [4004] (severity 16) [(null)] 
(SQL: select * from [tblLeistung])

我在 MS SQLServer Management Studio 中执行了给定的 SQL 查询,它运行良好。 我还尝试在 ORM protected $table = 'DBName.dbo.tblLeistung'; 中添加数据库名称和模式名称,这会正确生成 (SQL: select * from [DBName].[dbo].[tblLeistung]),但也会引发相同的错误。

问题似乎出在架构上,因为它是一个相当大的表(23 列,2160 条记录)。删除它并使用相同的架构重新创建它仍然会导致错误。删除它并创建一个具有相同名称的简单表可以解决错误(但是我需要使它与给定的架构一起工作)。
任何人都知道是否存在遥控器不支持的特定表设计通过 Laravel 访问 SQLServer?
是否有其他(简单)方法来测试,问题出在 Laravel 还是服务器上?

我已经有一段时间了,感谢任何帮助。提前致谢!

生成的有问题表的CREATE TABLE 语句如下所示:

CREATE TABLE [dbo].[tblLeistung](
    [LeistungID] [int] IDENTITY(1,1) NOT NULL,
    [LeistungskatalogID] [int] NULL,
    [SchlagID] [int] NOT NULL,
    [StatusInternID] [int] NULL,
    [StatusExternID] [int] NULL,
    [VertragID] [int] NULL,
    [Menge] [float] NULL DEFAULT ((0)),
    [SperreLeistung] [bit] NULL DEFAULT ((0)),
    [SperreAusfuehrung] [bit] NULL DEFAULT ((0)),
    [RechnungEinkID] [int] NULL,
    [RechnungVerkID] [int] NULL,
    [LeistungsunterkatID] [int] NULL,
    [LeistungsBeschreibung] [nvarchar](max) NULL,
    [InterneNotiz] [nvarchar](max) NULL,
    [AbrechungsdatenVorhanden] [bit] NULL DEFAULT ((0)),
    [AuftragID] [smallint] NULL,
    [UeberleistungID] [int] NULL,
    [AuftraggeberID] [int] NULL,
    [SSMA_TimeStamp] [timestamp] NOT NULL,
    [DatumFrist] [datetime] NULL,
    [DatumGeplant] [datetime] NULL,
    [DatumAusgefuehrt] [datetime] NULL,
    [DatumAuftragfreigabe] [datetime] NULL,
 CONSTRAINT [tblLeistung$PrimaryKey] PRIMARY KEY CLUSTERED 
(
    [LeistungID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

ALTER TABLE [dbo].[tblLeistung]  WITH NOCHECK ADD  CONSTRAINT [tblLeistung$tbRechnungVerktblLeistung] FOREIGN KEY([RechnungVerkID])
REFERENCES [dbo].[tblRechnungVerk] ([RechnungVerkID])
ON UPDATE CASCADE

ALTER TABLE [dbo].[tblLeistung] CHECK CONSTRAINT [tblLeistung$tbRechnungVerktblLeistung]

编辑:

  • 删除 FOREIGN KEY 并没有解决问题
  • 如果我访问一个不存在的表,也会出现同样的错误。但是,在具有不同配置的多个数据库实例上创建同一个表后,我非常确信它存在。

【问题讨论】:

  • 您是否必须将 unicode 数据保存在“LeistungsBeschreibung”中?如果没有尝试将数据类型更改为 varchar。
  • 哇,太巧妙了——非常感谢!这似乎确实是问题所在。在“LeistungsBeschreibung”和“InterneNotiz”列中使用 varchar 重新创建表似乎有效。然而,简单地将数据插入新模式会产生转换错误(从 nvarchar 到 datetime)。我将不得不与数据库管理员交谈。 那是我问题的答案吗? Laravel + MS SQL Server 无法处理 nvarchar(MAX) 列中的 unicode 数据?是否有设置可以规避这种情况并在不更改架构的情况下进行查询?
  • 使用 VARCHAR(MAX) 添加新列并在内部复制工作数据。您可能想将此添加为答案,@jithujose。但是,对于更改数据库架构不是答案的情况,这不是答案。我在here (@2013-11-08/20:38) 和here 发现了更多关于这个问题的信息。似乎在任何地方都没有解决。

标签: sql-server sql-server-2008 laravel


【解决方案1】:

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

如果您不必在“LeistungsBeschreibung”中保存 unicode 数据,请将列数据类型更改为 varchar。

您可能需要查看已接受的类似问题的答案: MSSQL Query issue in PHP and querying text data

链接

【讨论】:

  • 感谢您的全面回答 - 这解决了这个特殊问题。最终由于 Laravel + MS SQL Server 的其他问题,我现在转而使用 dreamfactory 包装 MS SQL Server,以提供带有 JSON 对象的 RESTful API。
【解决方案2】:

请尝试:

$handle = getHandle();
    $handle->exec('SET QUOTED_IDENTIFIER ON');
     $handle->exec('SET ANSI_WARNINGS ON');
     $handle->exec('SET ANSI_PADDING ON');
     $handle->exec('SET ANSI_NULLS ON');
     $handle->exec('SET CONCAT_NULL_YIELDS_NULL ON');

您还可以检查服务器配置: 检查“/etc/freetds.conf”文件并更改tds版本并添加客户端字符集然后在php.ini中请检查mssql.charset和default_charset

在 /etc/freetds.conf 中:

;tds version = 4.2
tds version = 8.0
client charset = UTF-8

在 php.ini 中:

mssql.charset = "UTF-8"
default_charset = "utf-8"

谢谢。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2022-01-22
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    相关资源
    最近更新 更多