Ответ 1
Они нечувствительны к регистру, если вы не делаете двоичное сравнение.
Может кто-нибудь сказать мне, если запрос MySQL SELECT
чувствителен к регистру или нечувствительным к регистру по умолчанию? И если нет, то какой запрос мне нужно отправить, чтобы я мог сделать что-то вроде:
SELECT * FROM 'table' WHERE 'Value' = "iaresavage"
Где в действительности, реальная ценность Value
- это IAreSavage
.
Они нечувствительны к регистру, если вы не делаете двоичное сравнение.
Вы можете в нижнем регистре значение и переданный параметр:
SELECT * FROM 'table' WHERE LOWER('Value') = LOWER("IAreSavage")
Другой (лучший) способ - использовать оператор COLLATE
как сказано в документации.
ИСПОЛЬЗОВАТЬ BINARY
Это простой выбор
SELECT * FROM myTable WHERE 'something' = 'Something'
= 1
Это выбор с двоичным
SELECT * FROM myTable WHERE BINARY 'something' = 'Something'
или
SELECT * FROM myTable WHERE 'something' = BINARY 'Something'
= 0
Сравнение нечувствительно к регистру, когда столбец использует сортировку, которая заканчивается на _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;
Теперь ваши сравнения должны быть чувствительны к регистру.
Сравнение строк в фразе 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
является общей или стандартной настройкой в большинстве баз данных.
Выбранная вами сортировка устанавливает, чувствительны ли вы к регистру или нет.
По умолчанию регистр нечувствителен к регистру, но следующая самая важная вещь вы должны взглянуть на то, как была создана таблица в первую очередь, потому что вы можете указать случай когда вы создаете таблицу.
Ниже приведена таблица script. Обратите внимание на нижнюю часть: "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;
Если ваш проект таков, что вы можете создать свой собственный стол, тогда имеет смысл указать ваш предпочтение чувствительности к регистру при создании таблицы.
SQL Select не чувствителен к регистру.
Эта ссылка может показать вам, как сделать с учетом регистра: http://web.archive.org/web/20080811231016/http://sqlserver2000.databases.aspfaq.com:80/how-can-i-make-my- SQL-запросы регистра-sensitive.html
Попробуйте:
order by lower(column_name) asc;
Обратите внимание также, что имена таблиц чувствительны к регистру в Linux, если вы не установите директиву lower_case_table_name
config 1. Это связано с тем, что таблицы представлены файлами, чувствительными к регистру в Linux.
Особенно остерегайтесь разработки в Windows, которая не чувствительна к регистру и не развертывается на производстве там, где она есть. Например:
"SELECT * from mytable"
против таблицы myTable удастся в Windows, но не работает в Linux, если не указано вышеописанная директива.
Ссылка здесь: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html
Можешь попробовать. надеюсь, это будет полезно.
SELECT * FROM 'table' WHERE 'Value' COLLATE latin1_general_cs = "IAreSavage"
Строковые поля с установленным двоичным флагом всегда будут чувствительны к регистру. Если вам нужен регистрозависимый поиск для недвоичного текстового поля, используйте это: ВЫБЕРИТЕ "test" REGEXP BINARY "TEST" КАК РЕЗУЛЬТАТ;