|
Программирование >> Программный интерфейс приложений
специально разработаны для работы с пустыми аргументами. Примером такой функции может служить функция 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 Операторы сравнения значений реагируют на контекст ( <, <=, = и т. д.), т.е. они производят сравнение в соответствии с типом их
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |