|
Программирование >> Программный интерфейс приложений
операндов. Так, выражение, представленное внизу, сравнивает операторы как числа потому, что оба оператора являются числами: 2 < 11 -> 1 Вот выражение, в котором происходит лексофафическое сравнение строк, потому что оба оператора являются строками: 2 < 11 -> о В следующих операциях сравнения сравниваются разные типы данных таким образом, что СУБД MySQL сравнивает их как числа. В результате оба выражения возвращают результат истина : 2 < 11 -> 1 2 < 11 -> 1 При сравнениях СУБД MySQL преобразует типы данных в соответствии со следующими правилами. Операции сравнения, отличные от операции <=>, где один из операндов - пустое значение (NULL), возвращают NULL. (Операция <=> аналогична операции =, но сравнение NULL <=> NULL возвращает значение истина .) Когда оба оператора являются строками, они сравниваются лек-софафическим образом как строки. Сравнение сфок производится на основании набора символов, установленного на сервере. Когда оба оператора являются целыми числами, они сравниваются как целые числа. Шестнадцатеричные константы, не сравниваемые со строками, сравниваются как двоичные сфоки. Если один из операторов имеет значение типа TIMESTAMP или DATETIME, а другой операнд является константой, операнды сравниваются как значения TIMESTAMP. Это сделано для оптимизации работы ODBC-приложений. В любом другом случае операнды сравниваются в формате плавающей точки. Это правило включает случай сравнения сфоки и числа. Строка преобразуется в значение о, если в сфоке нет чисел. Например, 14.3 преобразуется в 14 . 3, а l4 .3 - в 0. Правила интерпретации календарных данных MySQL позволяет свободно преобразовывать сфоковые данные и числа в календарные типы данных, и наоборот. Календарные данные преобразуются в числа в числовом контексте, и числа преобразуются в календарные данные в контексте даты и времени. Преобразование данных в календарный тип происходит в момент присвоения значения столбцу с календарным типом данных. При выполнении операций сравнения основное правило гласит: Календарные данные сравниваются как сфоки . Для таблицы my table, имеющей в своем составе столбец datecol типа date, следующие операторы аналогичны: INSERT INTO my table SET date col = 1997-04-13 INSERT INTO iny table SET date col = 19970413 INSERT INTO my table SET date col = 19970413 Аргументы функции to days () интерпретируется как одно и то же значение во всех трех выражениях: TO DAYS( 1997-04-10 ) -> 729489 TO DAYS( 19970410 ) -> 729489 TO DAYS(19970410) -> 729489 Тестирование и запуск преобразования типов Посмотрим, как происходит преобразование типов. Для этого сделаем запрос select из профаммы mysql: mysql> SELECT 0x41, 0x41 + О; +------+----------+ I 0x41 I 0X41 + О I +------+----------+ I A I 65 I Тестирование выражений необходимо при профаммировании операций, вносящих изменения в сфоки (оператор delete или update). Это нужно для гарантии удаления или модификации соответствующих данных. Наилучшим способом проверки работы таких операторов может быть предварительный запуск оператора select с аналогичным предложением where. Предположим, что таблица my table имеет столбец типа char char col, содержащий следующие значения: abc def 00 ghi 3kl 00 mno Каков будет результат запроса?: DELETE FROM my table WHERE char col = 00 Этот запрос создавался для удаления двух сфок, содержащих значение 00 . В действительности, и это может стать неприятным сюрпризом, он удалит все сфоки таблицы. Это можно объяснить последствием работы правил сравнения, принятых в СУБД MySQL. Столбец char col является столбцом строкового типа. Но 00 в этом операторе не заключено в скобки. Таким образом, он рассмафивается как число. В соответствии с правилами сравнения, принятыми в СУБД MySQL, операция сравнения, в которой участвуют сфока и число, выполняется как сравнение двух чисел. При выполнении запроса delete каждое значение столбца charcol преобразуется в число и сравнивается со значением 0. Значение 00 будет преобразовано в О, но ведь то же самое произойдет и со всеми другими строками, которые не похожи на числа. Поэтому предложение where будет давать значение истина для всех строк, и оператор delete очистит всю таблицу. Очевидно, что в этом и подобном ему случаях (да и во многих других), будет благоразумнее предварительно проверять работу предложения where с помощью оператора select. После чего можно спокойно запускать его в операторе delete без риска удалить по ощибке не те строки: mysql> SELECT char col FROM my table WHERE char col = 00; +----------+ I char col I Когда нет полной уверенности в том, каким образом будет использоваться значение, можно принудительно воспользоваться механизмом преобразования типов, который запускается при вычислении выражений. Это даст полную картину преобразования значения в заданный тип данных. Прибавьте к выражению +0 или +0.0. Это инициирует преобразование в цифровое значение: 0x65 -> е 0x65 +0 -> 101 0x65 + 0.0 -> 101.0 Для преобразования значения в строку воспользуйтесь функцией concat{): 14 -> 14 C0NGAT(14) -> 14 Для получения АЗСП-кода символа воспользуйтесь функцией ascii О: А -> А ASCII( A ) -> 65 Для того чтобы строку или число преобразовать в календарный тип данных, можно прибегнуть к помощи функции date add {): 19990101 -> 19990101 DATE ADD(19990101, INTERVAL О DAY) -> 1999-01-01 19990101 -> 19990101 DATE ADD( 19990101 , INTERVAL 0 DAY) -> 1999-01-01
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |