Как обращаться со случайными буквами верхнего и нижнего регистра в дБ при запросах? - PullRequest
3 голосов
/ 28 октября 2011

Как лучше всего обращаться со случайными заглавными и строчными буквами при запросе строки в базе данных?

Есть ли какой-то стандартный способ, или я должен разрешить только все записи в базе данных быть все нижерегистр и преобразовать их позже?

Прямо сейчас у меня есть этот запрос в PHP:

    $get_category = "select category_name from categories where category_name = ".$some_var;

, но я не уверен, что это лучший способ работать с записями, которые могут быть выше или нижеcase.

Я использую MySQL.

Спасибо, Алекс

Ответы [ 7 ]

6 голосов
/ 28 октября 2011

MySQL чувствителен к регистру или не зависит от параметров сортировки. Выберите параметры сортировки, которые заканчиваются на «_ci» (для регистра без учета регистра), и запросы к этому столбцу будут использовать сравнение без учета регистра.

Другим решением будет использование функции UPPER для преобразования столбца и значения поиска в верхний регистр, но это приведет к тому, что любые индексы столбца не будут использоваться.

1 голос
/ 28 октября 2011

То, что я делал в прошлом, когда мне нужно было сохранить регистр исходной строки (например, для имени для входа в систему), это создать еще один столбец со нормализованным значением (все прописные или строчные буквы) Кстати, я могу выполнить эффективное сравнение, просто преобразовав строку, с которой сравниваю, в один и тот же случай.

Если производительность не является проблемой (например, не так много данных), тогда просто примените upper () или lower () к столбцу в предложении where. Но это гарантирует сканирование таблицы.

1 голос
/ 28 октября 2011

Вы также можете попробовать это:

"выберите имя категории из категорий, где LOWER (имя_категории) = LOWER (". $ Some_var. ")";

, но это может быть медленным (будетбудь быстрым, если будешь хранить в базе данных имя в нижнем регистре)

1 голос
/ 28 октября 2011

SQL поддерживает последовательности COLLATION, некоторые из которых не чувствительны к регистру. (Я не знаю, что стандарт SQL говорит иначе, но обратитесь к документации поставщика.)

В этом случае см. Чувствительность к регистру при поиске строк в руководстве MySQL. Ниже приведен список поддерживаемых параметров сортировки , где параметры сортировки с _ci без учета регистра не учитываются.

Обратите внимание, что в дополнение к указанию для схемы таблицы, COLLATION также может быть указан для оператора LIKE в запросе.

Удачного кодирования.


И, пожалуйста, пожалуйста, используйте заполнители , чтобы сохранить строки SQL в чистоте и избежать атак с использованием SQL-инъекций!

1 голос
/ 28 октября 2011

Общий шаблон - выровнять игровое поле и сделать обе строки сравнения одинаковыми. Например:

$get_category = "select category_name from categories 
    where lower(category_name) = ".strtolower($some_var);
1 голос
/ 28 октября 2011

Параметры сортировки по умолчанию в MySQL чувствительны к регистру, поэтому «Hello» и «HeLLo» одинаковы. Если вам нужно привести данные в согласованный регистр, вы можете использовать LOWER() и UPPER() строковые функции.

0 голосов
/ 28 октября 2011

Вы можете использовать функцию UPPER sql для проверки:

$get_category = "select category_name from categories where UPPER(category_name) = UPPER(".$some_var.");

Но это действительно неэффективно. Лучшим способом было бы сохранить значения в верхнем или нижнем регистре с начала.

EDIT

Вам также следует рассмотреть возможность использования параметризованных запросов вместо простого объединения переменных в запрос. Это помогает предотвратить атаки с использованием SQL-инъекций!

Например, вы можете подготовить и выполнить ваш запрос следующим образом:

 $preparedStatement = $db->prepare('SELECT category_name FROM categories WHERE UPPER(category_name) = :category');
 $preparedStatement->execute(array(':category' => strtoupper($some_var)));
 $rows = $preparedStatement->fetchAll();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...