PHP / MySQL / MariaDB - одинарные кавычки и нет кавычек на TINYINT;два сервера с разным поведением - PullRequest
0 голосов
/ 01 октября 2019

Используя кодовую базу Laravel, у меня есть два сервера, DEV env и PRODUCTION env, которые демонстрируют различную обработку одиночных и нулевых кавычек в запросе базы данных.

Версия 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, поэтому он работает в обоих envs.

Это не просто один пример;это происходит в нескольких похожих местах в других таблицах / полях.

Я предполагаю, что это потому, что одна база данных - MySQL, а другая - MariaDB. Мне интересно, смогу ли я заставить их обоих работать последовательно. Я хочу, чтобы база данных разработки (MySQL 5.5.50) обрабатывала ее без одинарных кавычек. Однако я не уверен, с чего начать. Я приветствую любые советы о том, что может быть причиной этого, и как я могу заставить свой сервер разработки следовать последовательному поведению в рабочем состоянии.

1 Ответ

1 голос
/ 01 октября 2019

Вы можете попробовать отключить строгий режим в конфигурации базы данных.

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'
];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...