Почему MySQL иногда сопоставляет строки с конечным пробелом, а иногда нет? - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть запрос, который ищет строку в таблице поиска, просто используя =

В таблице есть такие данные:

 "some_column"  | "my_string_val"
---------------------------------------
 'returned_val' | 'STRING_OF_INTEREST'

Здесь только строковый литералимеет альфа-символы:

SELECT some_column FROM my_lookup_table
  WHERE my_string_val = 'STRING_OF_INTEREST';

Во всех базах данных и клиентах этот запрос возвращает совпадающую строку.

Здесь строковый литерал имеет несколько конечных пробельных символов:

SELECT some_column FROM my_lookup_table
WHERE my_string_val = 'STRING_OF_INTEREST ';

В этом конкретном контексте этот запрос возвращает соответствующую строку:

  • окружение:
    1. dev
  • база данных:
    1. чтение-запись
  • клиент:
    1. PHP cli
    2. встроенный sql клиент PHPStorm

В ALL других комбинаций контекста второй запрос возвращает NO соответствующих строк:

  • environment:
    1. dev
    2. prod
  • база данных:
    1. чтение-запись
    2. только для чтения
  • клиент:
    1. PHP cli
    2. PHPStВстроенный клиент orm
    3. DataGrip - тот же драйвер, что и PHPStorm
    4. Клиент командной строки MySQL
    5. Приложение Sequel Pro

Я знаю, что ожидаемое поведение mysql заключается в заполнении строк до тех пор, пока они не будут одинаковой длины для сравнения, из этих сообщений:

... и я могу подтвердить это поведение во всех контекстах, перечисленных выше, с более простымquery

select 'a' = 'a   ';

-> 1

Примечание: все рассматриваемые базы данных / таблицы / столбцы имеют набор символов utf8mb4 и параметры сортировки utf8mb4_general_ci

Итак .... почему разница?Почему так много контекстов НЕ совпадают в конечных пробелах, когда некоторые это делают, и когда по правилам mysql и стандарту SQL они должны совпадать?

Что еще я могу проверить, чтобы найти различия между средами?

Спасибо!

...