sql server сравнение строк с учетом регистра

Как я могу сделать сравнение строк с учетом регистра SQL на MySQL?

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

Как я могу сделать строковые запросы MySQL чувствительными к регистру?

10 ответов:

набор символов по умолчанию и параметры сортировки latin1 и latin1_swedish_ci, поэтому небинарные сравнения строк по умолчанию нечувствительны к регистру. Это означает, что при поиске с col_name, например » a%», вы получаете все значения столбцов, которые начинаются с A или A. Чтобы сделать этот поиск чувствительным к регистру, убедитесь, что один из операндов имеет чувствительные к регистру или двоичные параметры сортировки. Например, если вы сравнивая столбец и строку, которые оба имеют набор символов latin1, вы можете использовать оператор COLLATE, чтобы заставить любой операнд иметь параметры сортировки latin1_general_cs или latin1_bin:

Если вы хотите, чтобы столбец всегда обрабатывался с учетом регистра, объявите его с учетом регистра или двоичными параметрами сортировки.

хорошая новость заключается в том, что если вам нужно сделать запрос с учетом регистра, это очень легко сделать:

вместо использования оператора=, вы можете использовать LIKE или like BINARY

он будет принимать «а», а не » а » в своем состоянии

ответ отправил Крейг Уайт, имеет большой штраф за производительность

потому что он не использует индексы. Итак, либо вам нужно изменить параметры сортировки таблицы, как указано здесь https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html.

самое простое исправление, вы должны использовать двоичный код значения.

1 строка в наборе (0.00 сек)

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

подзапрос приведет к очень маленькому нечувствительному к регистру подмножеству, из которого вы затем выберете единственное совпадение с учетом регистра.

ниже Для версий MySQL, равных или выше 5.5.

добавить в /etc / mysql / my.cnf

все другие параметры сортировки, которые я пробовал, казались нечувствительными к регистру, работал только «utf8_bin».

Не забудьте перезапустить MySQL после этого:

вы можете использовать двоичный с учетом регистра, как это

к сожалению, этот sql не может использовать индекс, вы будете страдать от снижения производительности запросов, зависящих от этого индекса

к счастью, у меня есть несколько трюков, чтобы решить эту проблему

я делюсь с вами кодом из функции, которая сравнивает пароли:

Не нужно ничего менять на уровне БД, просто у вас есть изменения в SQL-запросе, он будет работать.

«SELECT * FROM

where userId = ‘» + iv_userId + «‘ AND password = BINARY ‘» + iv_password + «‘»;

двоичный сайта позволит сделать чувствительным к регистру.

MySQL не чувствительны к регистру по умолчанию, попробуйте изменить параметры сортировки языке latin1_general_cs

Источник

Как сделать сравнение с учетом регистра в sql?

Только что начал обучение SQL для начинающих. Сейчас я делаю упражнения и хочу знать, как изменить название.

Если вы посмотрите здесь: вы увидите, что я сделал имя, фамилию, титул, возраст и зарплату. И я написал буквы маленькими буквами. Как мне изменить его на заглавную букву?

Я пробовал использовать это:

Но позже я понял, что это не подойдет.

Я также заметил, что если я писал с пробелами, то это не распознается. Будет отображаться только первая часть. Вы знаете, почему это происходит? Спасибо

Спасибо за ваш вклад. Я пробовал это, переименовав «Firstname» в «Fname», и это не сработало. Я что-то пропустил?

8 ответов

Ах, есть два способа прочитать этот вопрос. Первый основан на чтении опубликованного вами образца ОБНОВЛЕНИЯ. Это не удастся, потому что по умолчанию SQL не выполняет сравнение строк с учетом регистра.

Второй фрагмент кода подразумевает, что вам нужно было ALTER TABLE и изменить имя столбца с имени столбца с одним регистром на другой. В MS-SQL вы не можете сделать это, не отбросив всю таблицу и не создав ее заново, в других диалектах SQL будет синтаксис DDL, зависящий от версии.

И, наконец, в MS-Access, если в имени столбца есть пробел, вы заключаете его в двойные кавычки, например «Мой столбец» в SQL, оберните его в [Мой столбец]

Это должно обновить все имена в таблице до первой буквы в верхнем регистре:

Надеюсь, это вам поможет :)

Во-первых, если вы действительно не хотите изменять имена полей, не делайте этого. На самом деле это не так уж важно, если все, что вы делаете, это изучаете SQL. Обратите внимание: если вы хотите изучить синтаксис для этого, то, конечно, это будет стоящее упражнение, но в остальном я бы позволил это сделать.

В вашем отредактированном вопросе упоминается использование пробелов в именах. Это не разрешено. Правила того, что составляет «Идентификатор SQL», будь то имя таблицы, столбца, ограничения и т. Д., Имеют некоторые строгие правила, и упрощенные они заключаются в том, что вы должны использовать только буквы, подчеркивания и цифры, за исключением того, что вы можете не начинаю с цифры.

Теперь, почему веб-сайт, который вы используете для изучения SQL, не жалуется, когда вы добавляете эти пробелы, я не знаю, и для меня это немного подозрительно. Это не звучит так, как будто он на самом деле использует известный движок базы данных, поскольку просто наличие этих пробелов там + лишние слова заставили бы любой нормальный движок базы данных жаловаться на плохой синтаксис.

Чтобы исправить это, либо добавьте подчеркивания вместо пробелов, либо сократите и используйте camelCasing, например: FirstName, LastName

Это обновит значения столбца firstname. Вы пытаетесь изменить имя столбца имени. Как это сделать, зависит от используемой базы данных (о которой вы не упомянули).

Если это MS Access или SQL-сервер, вы можете открыть таблицу в пользовательском интерфейсе и использовать конструктор для изменения имени столбца.

В противном случае вы можете использовать оператор SQL ALTER TABLE, как описано здесь.

Вы можете использовать [и] для разделения идентификаторов:

Если вы хотите изменить имя столбца с «firstname» на «Firstname», вы можете использовать sp_rename в MS SQL Server.

Если вы хотите изменить первую букву данных в столбце «имя», другие плакаты предлагают решения, а вот еще одно для одного имени.

Оператор BINARY преобразует следующую за ним строку в двоичную строку. Это простой способ заставить сравнение выполняться побайтово, а не посимвольно. BINARY также заставляет конечные пробелы быть значимыми

Вам понадобится какой-то уникальный идентификатор строки, например id, чтобы вы могли

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

Возможно, потребуется оптимизировать для большего, но это позволит вам даже обновить версию MSSQL с несколькими именами.

Источник

Параметры сортировки и учет регистра

Эта возможность появилась в EF Core 5.0.

Обработка текста в базах данных может быть сложной и требует больше внимания пользователей, чем подозрительная. В одном случае базы данных значительно зависят от того, как они обрабатывали текст; например, хотя в некоторых базах данных учитывается регистр по умолчанию (например, Sqlite, PostgreSQL), другие не учитывают регистр (SQL Server, MySQL). Кроме того, в связи с использованием индексов, чувствительность к регистру и аналогичные аспекты могут иметь более далекое влияние на производительность запросов: в то время как в этом случае может возникнуть желание использовать string.ToLower для принудительного сравнения без учета регистра в базе данных с учетом регистра, это может помешать приложению использовать индексы. На этой странице подробно описано, как настроить чувствительность к регистру или, как правило, параметры сортировки, а также как это сделать с помощью эффективного способа, не нарушая производительность запросов.

Общие сведения о параметрах сортировки

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

Параметры сортировки баз данных

при использовании EF Core миграции для управления схемой базы данных в OnModelCreating методе модели настраивается база данных SQL Server для использования параметров сортировки с учетом регистра.

Параметры сортировки столбца

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

При использовании EF Core миграций для управления схемой базы данных Следующая настройка столбца для Name свойства не учитывает регистр в базе данных, которая в противном случае настроена с учетом регистра:

Явные параметры сортировки в запросе

В некоторых случаях один и тот же столбец необходимо запрашивать с использованием различных параметров сортировки в разных запросах. Например, одному запросу может потребоваться выполнить сравнение столбца с учетом регистра, в то время как другой может потребоваться сравнение с тем же столбцом без учета регистра. Это можно сделать, явно указав параметры сортировки в самом запросе:

при этом создается COLLATE предложение в SQL запросе, в котором применяются параметры сортировки с учетом регистра, независимо от параметров сортировки, определенных на уровне столбца или базы данных.

Явные параметры сортировки и индексы

Индексы являются одним из наиболее важных факторов производительности базы данных — запрос, который эффективно работает с индексом, может привести к остановке без этого индекса. Индексы неявно наследуют параметры сортировки своего столбца; Это означает, что все запросы к столбцу автоматически подходят для использования индексов, определенных в этом столбце, при условии, что в запросе не указаны другие параметры сортировки. Явное указание параметров сортировки в запросе не позволит этому запросу использовать индекс, определенный для этого столбца, так как параметры сортировки больше не совпадают. Поэтому рекомендуется соблюдать осторожность при использовании этой функции. Всегда предпочтительнее определить параметры сортировки на уровне столбца (или базы данных), что позволяет всем запросам неявно использовать эти параметры сортировки и преимущества любого индекса.

Обратите внимание, что некоторые базы данных позволяют определять параметры сортировки при создании индекса (например, PostgreSQL, SQLite). Это позволяет определять несколько индексов в одном столбце, ускоряя операции с различными параметрами сортировки (например, сравнение с учетом регистра и без учета регистра). Дополнительные сведения см. в документации поставщика базы данных.

Всегда проверяйте планы запросов запросов и убедитесь, что в критически важных для производительности запросах используются правильные индексы, выполняемые на больших объемах данных. Переопределение чувствительности к регистру в запросе с помощью EF.Functions.Collate (или путем вызова string.ToLower ) может оказать значительное влияние на производительность приложения.

Источник

Регистрозависимый поиск в SQL

SQL запрос, казалось бы, написан абсолютно ясно и прозрачно, но результат не тот, который ожидаем. О маленьких деталях в работе с большими символами пойдёт речь.

В рамках работы над проектом одна из задач заключалась в том, что из огромного массива необходимо было выбрать карты с определённым кодом. Коды карт могут иметь значения как символы типа ‘+’или ‘0’, так и символы — буквы алфавита, в том числе строчные и прописные. При работе с кодами карт в виде цифр и спецсимволов проблем не возникло, НО. В процессе работы с кодами карт в виде символов — букв алфавита разного регистра мы столкнулись с проблемой. Наш простой запрос выдавал нам все данные, независимо от регистра:

Кто и почему не понимает нас?

Оказалось, что на нашем сервере установлены параметры сортировки без учёта регистра.

Я нашла несколько способов решения и хочу поделиться с вами:

Использование функции ASCII, которая возвращает числовой код крайнего левого символа строкового выражения, являющегося аргументом функции.

Например, if ASCII(code)=ASCII(‘m’) is TRUE – значение нашего аргумента строчное;

Мы можем написать запрос сравнения с учетом регистра изменив регистр нашего аргумента и используя collate:

Функция Unicode, которая возвращает юникод первого значения.

Синтаксис функции: unicode ( ).

Возможны варианты использования значений юникодов:

Мы можем создать таблицу- справочник юникодов наших кодов продуктов;

Получим значения юникодов наших аргументов:

либо вычислить юникод изменив регистр нашего аргумента и сравнить с юникодом нашего аргумента;

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

ещё один путь- сразу в коде сравнивать вычисляемое значение с уже известным нам числовым, если их немного и это не трудоёмко.

Именно этот вариант я применила в своей работе, т.к. количество необходимых символов для сравнения было невелико.

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

Источник

Как я могу сделать сравнение строк с учетом регистра SQL на MySQL?

У меня есть функция, которая возвращает пять символов с смешанный случай. Если я сделаю запрос по этой строке, он вернет значение независимо от случая.

Как я могу сделать строковые запросы MySQL чувствительными к регистру?

10 ответов

набор символов и параметры сортировки по умолчанию-latin1 и latin1_swedish_ci, поэтому по умолчанию сравнения строк без учета регистра. Это означает, что при поиске с col_name, например » a%», вы получаете все значения столбцов, начинающиеся с A или a. Чтобы сделать этот поиск чувствительным к регистру, убедитесь, что один из операндов имеет регистр или двоичные параметры сортировки. Например, если вы сравнивая столбец и строку, которые имеют набор символов latin1, вы можете использовать оператор COLLATE, чтобы заставить операнд иметь параметры сортировки latin1_general_cs или latin1_bin:

Если вы хотите, чтобы столбец всегда обрабатывался с учетом регистра, объявите его с учетом регистра или двоичной сортировки.

хорошая новость заключается в том, что если вам нужно сделать запрос с учетом регистра, это очень легко сделать:

вместо использования оператора = вы можете использовать Like или LIKE BINARY

он будет принимать «a», а не » A » в его состоянии

ответ опубликовал Крейг Уайт, имеет большой штраф за производительность

потому что он не использует индексы. Итак, либо вам нужно изменить параметры сортировки таблицы, как здесьhttps://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html.

простое исправление, вы должны использовать двоичный файл значения.

1 строка в наборе (0.00 сек)

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

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

ниже Для версий MySQL, равных или выше 5.5.

добавить в /etc/mysql / my.cnf

все другие сортировки, которые я пробовал, казались нечувствительными к регистру, работал только «utf8_bin».

Не забудьте перезапустить MySQL после этого:

вы можете использовать двоичный файл с учетом регистра, как это

к сожалению, этот sql не может использовать индекс, вы будете страдать от снижения производительности запросов, зависящих от этого индекса

к счастью, у меня есть несколько трюков, чтобы решить эту проблему

я делюсь с вами кодом из функции, которая сравнивает пароли:

Не нужно ничего менять на уровне БД, просто вам нужно изменить SQL-запрос, он будет работать.

«SELECT * FROM

where userId = ‘» + iv_userId + «‘ AND password = BINARY ‘» + iv_password + «‘»;

ключевое слово Binary сделает регистр чувствительным.

mysql не чувствителен к регистру по умолчанию, попробуйте изменить языковые параметры сортировки на latin1_general_cs

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • sql like только буквы без учета регистра
  • sql error 42p01 ошибка отношение не существует