【发布时间】: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 中)。