Способы приведения типов
В большинстве случаев приведение типов в SQL осуществляется автоматически.
Например, запрос SELECT 25+’35’;вернет результат 60. Арифметическая операция «+» служит основанием для преобразования строки ‘35’ в число.
Однако, может возникнуть ряд ситуаций, когда требуются специальные способа преобразования. Существует три типа задач, когда могут потребоваться специальные способы:
- Сравнение строк с помощью инструкции BINARY.
- Преобразование типа с помощью функции CAST().
- Преобразование из одной кодировки в другую с помощью функции CONVERT().
Сравнение строк с помощью инструкции BINARY
В MySQL сравнение строк не учитывает регистр. То есть строки «ООО ТОПАЗ» и «ООО Топаз» считаются одинаковыми. Но бывают ситуации, когда регистр учесть нужно. Для сравнения с учетом регистра в запрос нужно добавить инструкцию BINARY:
BINARY строка1=строка2;
ИЛИ
строка1 BINARY= строка2;
Обратите внимание, что инструкция BINARY может стоять как слева от логического выражения, так и перед оператором сравнения. Эта инструкция позволяет сравнивать строки как двоичные последовательности. Двоичный код одной и той же буквы в верхнем и нижнем регистре будет различным. Поэтому такое сравнение будет учитывать регистр.
SELECT «ООО Топаз»= «ООО ТОПАЗ»;
Результат: 1 (то есть истина)
SELECT BINARY «ООО Топаз»= «ООО ТОПАЗ»;
Результат: 0 (то есть ложь).
SELECT «ООО Топаз»BINARY = «ООО ТОПАЗ»;
Результат: 0 (то есть ложь).
Можно использовать инструкцию Binary при задании условия отбора внутри инструкции WHERE:
SELECT * clients WHERE BINARY client_name =”ООО Топаз”;
Или
SELECT * clients WHERE client_name BINARY =”ООО Топаз”;
Преобразование типа с помощью функции CAST()
Функция CAST() является стандартной функцией преобразования типов, используемой в различных диалектах SQL. Она имеет следующий синтаксис:
CAST(выражение AS тип);
Выражение – это то выражение, которое должно быть преобразовано к другому типу.
Тип – это тот тип, к которому нужно преобразовать выражение. Аргумент тип может быть принимать следующие значения:
- BINARY
- CHAR [N]
- DATE
- DATETIME
- SIGNED [INTEGER]
- TIME
- UNSIGNED [INTEGER]
Преобразование числа в дату:
SELECT CAST(19861111 AS date);
Результат: 1986-11-11.
Преобразование даты в сокращенный формат:
SELECT NOW();
Результат: 2016-08-30 13:01:46
SELECT CAST(NOW() AS date);
Результат: 2016-08-30.
В таблице booking поле amount имеет тип DOUBLE.
Необходимо привести это поле к типу DECIMAL из четырех знаков, два из которых поле запятой.
SELECT fio, CAST(amount AS DECIMAL(4,2)) from booking;
Результат:
Функция CAST() бывает полезной при сортировке. Если сортировать по некоторому полю как числовому, то результат будет не таким как при сортировке по тому же полю как по текстовому. Для числового поля значение 2 будет предшествовать значению 10. Для текстового поля значение 10 будет предшествовать значению 2.
SELECT * from booking ORDER BY idbooking;
Результат:
SELECT * from booking ORDER BY cast(idbooking as char);
Результат:
Преобразование из одной кодировки в другую с помощью функции CONVERT()
Функция CONVERT() может использоваться в двух синтаксисах. Для преобразования типа по аналогии с функцией CAST():
CONVERT( выражение, тип);
Для преобразования кодировки:
CONVERT(выражение USING кодировка);
Запросы
SELECT CAST(Now() AS date); и
SELECT CONVERT(Now(),date);
Дают одинаковый результат: 2016-08-30.
Для преобразования из текущей кодировки в кодировку cp1251 нужно выполнить запрос:
SELECT CONVERT(«ООО Топаз» USING cp1251) from booking;
Результат: «ООО Топаз» (но уже в другой кодировке!).