Программирование >>  Программный интерфейс приложений 

1 ... 50 51 52 [ 53 ] 54 55 56 ... 264


специально разработаны для работы с пустыми аргументами. Примером такой функции может служить функция ifnullo, в зависимости от значения аргумента возвращающая соответственно истину или ложь . А функция strcmp () работает только с непустыми данными и, если среди аргументов попадается пустое значение, null возвратит только пустое значение, а не значение истина или значение ложь .

При выполнении операций сортировки пустые значения (null) группируются вместе. При этом при сортировке в возрастающем порядке пустые значения будут отсортированы в начало, а при сортировке в убывающем порядке - в конец.

Преобразование типов

СУБД MySQL производит автоматическое преобразование типов при выполнении различных операций. Преобразование типов данных происходит в следующих ситуациях.

Преобразование операторов в тип, подходящий для вычисления.

Преобразование типа аргумента функции в тип, необходимый для работы функции.

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

Вот выражение, которое требует преобразование типа. Оно состоит из оператора + и двух операндов 1 и 2 :

1 + 2

Здесь операнды имеют различные типы данных (число и строка). СУБД MySQL преобразует один из них, чтобы привести операнды к одному типу. В данном случае мы имеем дело с арифметической операцией (знак + ), поэтому MySQL преобразует строку 2 в число 2. Результатом вычисления выражения будет 3. Вот другой пример. Функция CONCAT О объединяет строки, следовательно, она возвращает значение строкового типа. Таким образом, аргументы должны интерпретироваться как строки, независимо от их первоначального типа. В данном примере в качестве аргументов функция получает перечень чисел. Функция преобразует их в строки и возвращает конкатенацию этих строк:

CONCAT(1,2,3) -> 123

Если вызов функции CONCAT () является частью большего выражения, потребуется дальнейшее преобразование типов. Рассмотрим следующее выражение:

REPEAT(X,C0NCAT(1,2,3)/10) -> ХХХХХХХХХХХХ

Функция CONCAT (1,2,3) возвращает строку 123 . Выражение 12 3 /10 преобразуется в выражение 123/10 потому, что деление - это арифметический оператор. Результатом этого выражения будет 12.3 в



контексте операций с плавающей точкой, но функция REPEAT () требует в качестве аргумента целое значение, поэтому она получит в качестве арпмента число 12. Это значит, что результатом этого выражения будет оператор REPEAT (X , 12), возвращающий 12 символов X.

Главный принцип преобразования типов заключается в том, что MySQL сначала пытается преобразовать данные, а не вьщает сообщение об ощибке. В зависимости от контекста он преобразует значения трех основных категорий (числа, строки или календарные данные) в значения любой другой категории. Однако значения не всегда могут быть преобразованы из одного типа в другой. Операция преобразования может дать сбой, если она невозможна. Преобразование строк вида аЬс , которые никак не похожи на числа, вернет числовой результат, равный 0. Преобразование данных, которые не похожи на календарные данные, в календарный тип вернет 0. Например, преобразование строки аЬс в дату вернет нулевую дату 0000-00-00 , хотя любое значение может быть рассмотрено как строка. Это значит, что при преобразовании значения в строку никогда не должно возникать проблем.

MySQL выполняет и менее серьезные операции преобразования. Если в целочисленном контексте используется значение с плавающей точкой, значение будет преобразовано (округлено). Преобразование в обратном направлении тоже работает. Использование целого числа в качестве числа с плавающей точкой не будет ошибкой.

Шестнадцатеричные константы рассматриваются как строки в то.м случае, если контекст четко не свидетельствует о том, что это число. В шестнадцатеричном контексте каждая пара шестнадцатеричных цифр рассматривается в качестве символа, а результат используется как строка. Вот как это происходит:

0x61 -> а

0x61 +0 -> 97

CONCAT(0x61) -> а

CONCAT(0x61 +0) -> 97

Аналогичное правило интерпретации используется при операциях сравнения. За исключением случая, когда строка не сравнивается с числом:

10 = ОхОа -> 1

10 = 0x09 -> О

\п = ОхОа -> 1

\п = ОхОа +0 -> О

{ \п = ОхОа) +0 -> 1

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

3+4 -> 7

3 +4 -> 7

3 + 4 -> 7



Для того чтобы символьная строка была преобразована в число, она должна содержать числа в начале строки, числа в середине строки распознаны не будут. Преобразование такой строки вернет значение О (пятая строка):

1973-2-4 +0 -> 1973

12:14:01 +0 -> 12

23-skidoo +0 -> 23

-23-skidoo +0 -> -23

carbon-14 +0 -> О

Начиная с версии 3.23, правила преобразования строк в числа несколько меняются. До этой версии строки преобразовывались в целые числа с округлением. Начиная с версии 3.23, строки стали преобразовываться в формат с плавающей точкой:

-428.9 +0 -> -429 (MySQL < 3.23)

-428.9 +0 -> -428.9 (MySQL 3.23)

Еще строже правила преобразования при выполнении логических и побитовых операций. Операнды должны быть не просто числами, а только целыми числами. Это значит, что такое число как 0.3 не дает значение истина , несмотря на то, что оно не равно нулю. Это происходит потому, что при преобразовании в целое число оно возвращает 0. В других выражениях операторы тоже не могут дать значение истина , если их значение не превыщает 1.

0.3 OR .04 -> О

1.3 OR .04 -> 1

0.3 AND .04 -> О

1.3 AND .04 -> О

1.3 AND 1.04 -> 1

Преобразование такого же типа происходит в функции if(), первый оператор которого должен иметь целочисленный тип. Здесь есть один отличный прием: для тестирования значений с плавающей точкой надлежащим образом лучще всего воспользоваться операцией явного сравнения. В противном случае все значения меньще 1 будут восприняты как ложь (третья строка):

IF(1.3, non-zero , zero ) -> non-zero

IF(О.3, non-zero , zero ) -> zero

IF(0.3>0, non-zero , zero ) -> non-zero

Операторы сравнения по образцу работают со строками. Но операторы сравнения по образцу СУБД MySQL могут работать с числами, которые они преобразуют в строки при поиске совпадений!

12345 LIKE W -> 1

12345 REGEXP l.*5 -> 1

Операторы сравнения значений реагируют на контекст ( <, <=, = и т. д.), т.е. они производят сравнение в соответствии с типом их



1 ... 50 51 52 [ 53 ] 54 55 56 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика