По умолчанию регистр не чувствителен к регистру в Spring Data JPA [duplicate]

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

  public static class FileUtility {private const char PrefixChar = '%';  private static readonly int MaxLength;  private static readonly Dictionary & lt; char, char [] & gt;  Нелегалы;  static FileUtility () {List & lt; char & gt;  illegal = new List & lt; char & gt;  {PrefixChar};  illegal.AddRange (Path.GetInvalidFileNameChars ());  MaxLength = illegal.Select (x = & gt; ((int) x) .ToString (). Length) .Max ();  Illegals = illegal.ToDictionary (x = & gt; x, x = & gt; ((int) x) .ToString ("D" + MaxLength) .ToCharArray ());  } public static string FilenameEncode (string s) {var builder = new StringBuilder ();  char [] замена;  using (var reader = new StringReader (s)) {while (true) {int read = reader.Read ();  if (read == -1) break;  char c = (char) read;  if (Illegals.TryGetValue (c, вне замены)) {builder.Append (PrefixChar);  builder.Append (замена);  } else {builder.Append (c);  }}} return builder.ToString ();  } public static string FilenameDecode (string s) {var builder = new StringBuilder ();  char [] buffer = new char [MaxLength];  using (var reader = new StringReader (s)) {while (true) {int read = reader.Read ();  if (read == -1) break;  char c = (char) read;  if (c == PrefixChar) {reader.Read (buffer, 0, MaxLength);  var encoded = (char) ParseCharArray (буфер);  builder.Append (кодируются);  } else {builder.Append (c);  }}} return builder.ToString ();  } public static int ParseCharArray (char [] buffer) {int result = 0;  foreach (char t в буфере) {int digit = t - '0';  if ((digit & lt; 0) || (digit & gt; 9)) {throw new ArgumentException («Строка ввода не была в правильном формате»);  } result * = 10;  результат + = цифра;  } return result;  }}  
185
задан Teun Zengerink 23 October 2012 в 14:22
поделиться

11 ответов

Сравнение нечувствительно к регистру, когда столбец использует сортировку, которая заканчивается на _ci (например, по умолчанию latin1_general_ci), и они чувствительны к регистру, когда столбец использует сортировку, которая заканчивается _cs или _bin (например, utf8_unicode_cs и utf8_bin).

Проверить сопоставление

Вы можете проверить свои сервер , базу данных и соединение , используя:

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

, и вы можете проверить сопоставление таблицы , используя:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

Изменить настройку

Вы можете изменить свою базу данных, таблицы или столбца для чего-то чувствительного к регистру следующим образом:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

Теперь ваши сравнения должны быть чувствительны к регистру.

401
ответ дан ostrokach 15 August 2018 в 17:02
поделиться
  • 1
    это должен быть самый верный ответ – tim peterson 2 February 2014 в 22:01
  • 2
    Я в основном согласен с комментарием Тима, я не думаю, что делать «lower ()». по вашим ценностям везде - лучший способ справиться с этим, похоже на обходной путь. Но я признаю, что временами это имеет смысл и проще. (Колин сказал, что сравнение было лучше). У нас были исторические данные, перенесенные в таблицу mysql, которая разбила логику устаревания из-за определенных значений столбцов, имеющих нечувствительный случай. Нам нужно было знать разницу между "GE1234" и "ge1234", они должны быть уникальными и оставаться в журнале таким образом. Вместо этого мы устанавливаем наш столбец в инструкции create table: varchar (20) CHARACTER SET utf8 COLLATE utf8_bin – gregthegeek 19 March 2014 в 20:56
  • 3
    Я не знаю, почему так много людей проголосовали за это. Здесь четко указано dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html , что «... это означает, что для буквенных символов сравнения будут чувствительны к регистру». ; Поэтому, если я буду искать «DickSavagewood», он НЕ заберет «dicksavagewood». Выполняя то же самое с LOWER (), возьмите его. Поэтому мой ответ на вопрос: в вашем конкретном случае SELECT действительно чувствителен к регистру. – Luftwaffle 20 August 2014 в 14:38
  • 4
    @ user1961753: Читать снова: & quot; Для двоичных строк (varbinary, blob) ... будет чувствительным к регистру ". – Marc B 20 August 2014 в 15:40
  • 5
    @MarcB эта ссылка сейчас сломана. Не могли бы вы исправить это? :) – Phiter 1 November 2016 в 03:17
  • 6
402
ответ дан ostrokach 5 September 2018 в 16:06
поделиться

Выбранная вами сортировка устанавливает, чувствительны ли вы к регистру или нет.

15
ответ дан chuck taylor 15 August 2018 в 17:02
поделиться

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

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("DickSavagewood")

Другим (лучшим) способом было бы использовать оператор COLLATE в качестве в документации

94
ответ дан Colin Hebert 15 August 2018 в 17:02
поделиться
  • 1
    Как будет выглядеть этот SELECT оператор с помощью COLLATE? – Yes Barry 2 December 2011 в 00:43
  • 2
    LOWER(Value) в WHERE повлияет на производительность – Anonymous 13 October 2012 в 16:01
  • 3
    На упомянутой странице документации выше указано, что «недвоичные сравнения строк не зависят от регистра по умолчанию». – Per Quested Aronsson 18 October 2012 в 14:22
  • 4
    Вид ужасающий, сколько людей поддержали этот ответ. Как объясняет @Marc выше, сравнения являются нечувствительными к регистру. Вам нужно понимать коллажи и индексы и правильно их настраивать - использование строковых преобразований, таких как LOWER() или произвольное COLLATE предложение, может полностью обходить индекс, и со временем, по мере роста вашей таблицы, это может иметь серьезные последствия для производительности. Наверно, это имена пользователей, которые вы ищете? Используйте регистр без учета регистра и добавьте уникальный индекс в столбец. Используйте EXPLAIN, чтобы подтвердить, что этот индекс используется. – mindplay.dk 14 January 2016 в 21:22
  • 5
    Я собирался сказать то же самое, что mindplay.dk ... upper () и lower () обходить индекс и напрямую влиять на производительность на больших таблицах базы данных. – GTodorov 15 February 2018 в 20:29

Сравнение строк в фразе WHERE не чувствительно к регистру. Вы можете попытаться сравнить, используя

WHERE `colname` = 'keyword'

или

WHERE `colname` = 'KeyWord'

, и вы получите тот же результат. Это поведение по умолчанию MySQL.

Если вы хотите, чтобы сравнение было чувствительным к регистру, вы могли бы добавить COLLATE так же, как это:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

Тот SQL дал бы другой результат с этим: WHERE colname COLLATE latin1_general_cs = 'keyword'

latin1_general_cs является общей или стандартной настройкой в ​​большинстве баз данных.

24
ответ дан Ifan Iqbal 15 August 2018 в 17:02
поделиться
  • 1
    Спасибо за ваш ответ, это более понятно для меня. – Harsha 26 April 2016 в 17:06

SQL Select не чувствителен к регистру.

Эта ссылка может показать вам, как сделать регистр чувствителен к регистру: http://sqlserver2000.databases.aspfaq.com/how-can-i- макияж мои-SQL-запросы регистра-sensitive.html

4
ответ дан Jacob Nelson 15 August 2018 в 17:02
поделиться
  • 1
    Зависит от вашей базы данных, как указано в другом месте здесь, они могут быть на mysql. – vickirk 17 October 2012 в 15:24

Попробуйте:

order by lower(column_name) asc;
1
ответ дан Jako 15 August 2018 в 17:02
поделиться

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

В приведенном ниже скрипте создается таблица. Обратите внимание на нижнюю часть: «COLLATE latin1_general_cs». Это cs в конце означает чувствительность к регистру. Если вы хотите, чтобы ваша таблица была нечувствительной к регистру, вы либо оставите эту часть, либо используете «COLLATE latin1_general_ci».

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

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

8
ответ дан Ken Johnson 15 August 2018 в 17:02
поделиться

USE BINARY

Это простой выбор

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

Это выбор с двоичным

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

или

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0

43
ответ дан Someone 15 August 2018 в 17:02
поделиться
  • 1
    Когда имеет смысл использовать BINARY только на одной стороне = (SELECT * FROM myTable WHERE BINARY «something» = «Something»)? – Jimmy 14 March 2013 в 17:31
  • 2
    @Jimmy Что ты имеешь в виду? Код работает. Когда одна сторона сравнения сравнивается с бинарным, сравнение выполняется двоично. – Jori 11 July 2014 в 14:01
  • 3
    @ Jori О, я думаю, я неправильно понял - я думал, что один из двух примеров имеет BINARY по обе стороны от равного. – Jimmy 11 July 2014 в 19:19
  • 4
    Я просто проголосовал за это, потому что это действительно правильный ответ. Согласно документации на веб-сайте MySQL, они говорят, что лучше использовать команду BINARY, чем пытаться приписать ваши слова / запрос на конкретный язык, потому что команда BINARY говорит, что оставляет все как есть, и использовать его точно так же, как и он представлен. Поэтому, когда я пришел искать ответ - два ответа привели меня на сайт MySQL и посмотрели их документы. Лучше использовать BINARY. Перевод может вызвать другие проблемы. – Mark Manning 25 October 2015 в 16:19

Обратите внимание также, что имена таблиц чувствительны к регистру в Linux, если вы не установите директиву конфигурации lower_case_table_name в 1. Это связано с тем, что таблицы представлены файлами, чувствительными к регистру в Linux.

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

"SELECT * from mytable" 

в отношении таблицы myTable преуспеет в Windows, но не работает в Linux, если не указано выше указанное директива.

Ссылка здесь: http: / /dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

2
ответ дан Wes Grant 15 August 2018 в 17:02
поделиться
  • 1
    +1 - Сценарий написания нечувствительных к регистру запросов, а затем неудача на Linuxes произошел в нашем проекте – Vic 19 November 2013 в 11:22
  • 2
    @Vic У меня такая же проблема с моим проектом. Не могли бы вы рассказать мне, как вы это исправили? – Kamran Ahmed 5 January 2014 в 16:54
  • 3
    @KamranAhmed, вам нужно использовать оболочку имен таблиц точно так же, как они появляются в сценариях создания – Vic 5 January 2014 в 21:40
  • 4
    @Vic, что было бы последним средством, поскольку мне пришлось бы модифицировать буквально множество запросов. Мне было интересно, если будет какой-нибудь простой способ сделать это. Спасибо хоть! – Kamran Ahmed 6 January 2014 в 08:12
  • 5
    @KamranAhmed, попробуйте изменить lower_case_table_name, как указано в ответе, который мы комментируем в – Vic 6 January 2014 в 09:23

Вы можете попробовать. надеюсь, что это будет полезно.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "DickSavagewood"
0
ответ дан Zahid 15 August 2018 в 17:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: