На главную страницу
Сравнение явного и неявного преобразования типа
LewisC (оригинал: Mini-Tip #10 - Implicit vs. Explicit Conversion)
Перевод Моисеенко С.И.
Начну с того, что я полагаю, что неявное преобразование - это плохо. Еще хуже. Зло.
Нет-нет, серьезно! Теперь позвольте мне дать определения преобразований обоих типов
и объяснять, почему я так считаю.
Преобразование
Под преобразованием я понимаю приведение хранимых данных из одного типа к другому
типу данных. Например, символьное поле "1" может быть преобразовано к
числовому 1. Символьное поле может быть преобразовано к полю даты, если оно правильно
отформатировано. Форматирование преобразования может управляться командой и маской
формата (явное преобразование), или Вы можете положиться на Oracle и/или инструмент
третьих фирм, который сделал бы это за Вас (неявное преобразование).
Неявное преобразование
Примером неявного преобразования может быть:
SELECT *
FROM emp
WHERE hiredate between '01-JAN-1981' and '01-APR-1981';
Если Вы используете схему scott и оригинальную таблицу emp, то должны получить две
строки. Возможно. Если Вы используете sql*plus или другой инструмент, который не
устанавливает маску формата даты по умолчанию, и окажется, что маска формата базы
данных по умолчанию совпадает с той, что я ввел, или Вы используете инструмент,
который установил маску формата в соответствии с той, что я ввел.
Явное преобразование
SELECT *
FROM emp
WHERE hiredate between TO_DATE('01-JAN-1981', 'DD-MON-YYYY')
and TO_DATE('01-APR-1981', 'DD-MON-YYYY');
Если Вы выполните этот оператор, то должны получить две строки, независимо от того,
какой инструмент или какие маски формата по умолчанию установлены.
Отметьте, что различие состоит в том, что я ЯВНО выполнил преобразование из символьного
представления к дате с помощью функции TO_DATE, в которой я указал правильную маску
формата.
Явное преобразование требует дополнительного набора. Это верно.
Так что использовать?
Всегда, всегда, всегда используйте явное преобразование. Помимо того, что это намного
проще читать и поддерживать, явное преобразование гарантирует, что, если формат
по умолчанию когда-нибудь будет изменен, ваш код продолжит работать.
Вы не поверите, сколько мне встречалось проблем с производственными системами, вызванных
лишь тем, что кто-то поигрался с параметрами nls в базе данных.
Всегда, всегда, всегда используйте явное преобразование.
Что говорит Oracle?
Это выдержка непосредственно из справочного руководства к Oracle 10g:
Преобразование данных
Как правило, выражение не может содержать значения данных разных типов. Например,
выражение не может перемножить 5 и 10, а затем добавить 'JAMES'. Однако Oracle поддерживает
как неявное, так и явное преобразование значений из одного типа данных в другой.
Неявное и явное преобразование данных
Oracle рекомендует, чтобы Вы задавали явные преобразования, вместо того, чтобы полагаться
на неявные или автоматические преобразования, по следующим причинам:
? Операторы SQL легче понять, когда Вы используете функции явного преобразования
типа данных.
? Неявное преобразование типа данных может оказать отрицательное влияние на производительность,
особенно если тип данных столбца преобразуется к типу данных константы, а не наоборот.
? Неявное преобразование зависит от контекста, в котором оно происходит и, возможно,
не будет работать одинаково в каждом случае. Например, неявное преобразование значения
типа данных VARCHAR2 может возвратить неожиданный год в зависимости от значения
параметра NLS_DATE_FORMAT.
? Алгоритмы для неявного преобразования подвержены изменениям при обновлении версий
продуктов Oracle. Поведение явных преобразований более предсказуемо.
Я полагаю, что эти аргументы применимы не только к Oracle. Использование явных преобразований
следует отнести к лучшим методам для любой базы данных и любого языка программирования.
Если Вы обнаружите случай, когда неявное преобразование окажется лучше, чем явное,
пожалуйста, напишите комментарий к этому посту и объясните. Мне ничего подобное
не приходит в голову.
23-05-2007
На главную страницу