【问题标题】:PHP/MySQL/MariaDB - Single quotes vs no quotes on TINYINT; two servers with different behaviourPHP/MySQL/MariaDB - TINYINT 上的单引号与无引号;具有不同行为的两台服务器
【发布时间】:2020-01-30 07:57:40
【问题描述】:

使用 Laravel 代码库,我有两个服务器,一个 DEV 环境和一个 PRODUCTION 环境,它们在数据库查询中表现出对单引号和无引号的不同处理。

正在开发的 MySQL 版本

innobd_version: 5.5.50
protocal_version: 10
version: 5.5.50-0ubuntu0.14.04.1
version_compile_machine: x86_64
version_compile_os: debian-linux-gnu

MariaDB 正在生产中

innodb_version: 5.5.61-MariaDB-38.13
protocol_version: 10
version: 5.5.64-MariaDB
version_comment: MariaDB Server
version_compile_machine: x86_64
version_compile_os: Linux

以这个 Laravel 数据库查询为例:

$records = table::all()->where('field_name', 1)->toArray();

'field_name' 在两台服务器上都设置为 TINYINT(1) 并且将为 0 或 1。

一个生产服务器,上面的查询(没有单引号)有效。

但是,在开发服务器上,它不会(它返回零个结果)。

反过来,在开发服务器上,如果 where 条件 (1) 用单引号括起来,它就可以工作:

$records = table::all()->where('field_name', '1')->toArray();

但是这个单引号版本在生产环境中不起作用。

这很痛苦,因为我必须将语句包装在服务器标志 if 语句中,因此它适用于两个环境。

这不仅仅是一个例子;它发生在不同表格/字段的其他地方的几个类似地方。

我猜这是因为一个数据库是 MySQL,另一个是 MariaDB。我想知道我是否可以使它们都始终如一地工作。我希望开发数据库(MySQL 5.5.50)在没有单引号的情况下处理它。但是,我不确定从哪里开始寻找。我欢迎任何有关可能导致此问题的原因以及如何使我的开发服务器遵循一致的生产行为的建议。

【问题讨论】:

  • 向我们展示为每台机器生成的 SQL。
  • 假设field_name 是数字类型,1 周围的引号无关紧要(在 MySQL 中)。

标签: php mysql laravel mariadb


【解决方案1】:

您可以尝试在数据库配置中禁用严格模式。

config/database.php

'connections' => [

    'mysql' => [
        // ...
        'strict' => false,
    ],

],

编辑:仔细检查,您的field_name 查询实际上并未发送到数据库。

您将整个表作为一个集合获取,然后使用 Laravel 的集合方法对其进行过滤。这是非常低效的,应尽可能避免。

$records = table::all()->where('field_name', 1)->toArray();

// SQL = SELECT * FROM `table`; 

// the ->where() is done with PHP...

你应该这样写来要求数据库只返回请求的记录。看到 SQL 的不同了吗?

$records = table::where('field_name', 1)->get()->toArray();

// SQL = SELECT * FROM `table` WHERE `field_name` = 1;

编辑:您还可以考虑将值转换为表的模型,因此它始终以整数形式从数据库返回。

https://laravel.com/docs/6.x/eloquent-mutators#attribute-casting

protected $casts = [
    'field_name' => 'integer'
];

【讨论】:

  • 谢谢,但是 mysql > strict 已经在两个环境的 laravel config/database.php 文件中设置为 false。显示像'sql_mode'这样的变量;和 SELECT @@GLOBAL.sql_mode;两者都返回空白
猜你喜欢
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 2013-06-20
  • 2012-01-28
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多