Я написал это чудовище для удовольствия, он позволяет вам совершать кругооборот:
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; }}
Сравнение нечувствительно к регистру, когда столбец использует сортировку, которая заканчивается на _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;
Теперь ваши сравнения должны быть чувствительны к регистру.
Выбранная вами сортировка устанавливает, чувствительны ли вы к регистру или нет.
Вы можете ввести строковое значение и переданный параметр:
SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("DickSavagewood")
Другим (лучшим) способом было бы использовать оператор COLLATE
в качестве в документации
LOWER()
или произвольное COLLATE
предложение, может полностью обходить индекс, и со временем, по мере роста вашей таблицы, это может иметь серьезные последствия для производительности. Наверно, это имена пользователей, которые вы ищете? Используйте регистр без учета регистра и добавьте уникальный индекс в столбец. Используйте EXPLAIN
, чтобы подтвердить, что этот индекс используется.
– mindplay.dk
14 January 2016 в 21:22
Сравнение строк в фразе 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
является общей или стандартной настройкой в большинстве баз данных.
SQL Select не чувствителен к регистру.
Эта ссылка может показать вам, как сделать регистр чувствителен к регистру: http://sqlserver2000.databases.aspfaq.com/how-can-i- макияж мои-SQL-запросы регистра-sensitive.html
Значение по умолчанию нечувствительно к регистру, но следующая самая важная вещь, на которую вы должны обратить внимание, - это то, как была создана таблица в первую очередь, потому что вы можете указать чувствительность к регистру при создании таблицы.
В приведенном ниже скрипте создается таблица. Обратите внимание на нижнюю часть: «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;
Если ваш проект таков, что вы можете создать свою собственную таблицу, тогда это имеет смысл чтобы указать предпочтение чувствительности к регистру при создании таблицы.
USE BINARY
Это простой выбор
SELECT * FROM myTable WHERE 'something' = 'Something'
= 1
Это выбор с двоичным
SELECT * FROM myTable WHERE BINARY 'something' = 'Something'
или
SELECT * FROM myTable WHERE 'something' = BINARY 'Something'
= 0
Обратите внимание также, что имена таблиц чувствительны к регистру в 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
lower_case_table_name
, как указано в ответе, который мы комментируем в
– Vic
6 January 2014 в 09:23
Вы можете попробовать. надеюсь, что это будет полезно.
SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "DickSavagewood"