Чтобы расширить немного на мои комментарии, я нашел немного в документации, которая объясняет разницу между blankpadded и nonpadded сравнения:
http://docs.oracle.com/database/121/SQLRF/sql_elements002.htm#BABJBDGB
Если оба значения в вашем сравнении (две стороны равных знак) имеют тип данных CHAR или NCHAR или являются литеральными строками, тогда Oracle выбирает сравнительное сравнение. Это означает, что если длины отличаются друг от друга, тогда он заполняет короткие пробелы до тех пор, пока они не будут иметь одинаковую длину.
С колонкой DUPLICADO
будучи в CHAR(3)
, значение '#4'
хранится в столбце в виде трех символов '#4 '
(обратите внимание на пробел в качестве третьего символа.) Когда вы DUPLICADO = '#4'
правило гласит, Oracle будет использовать blankpadded сравнения и поэтому blankpad буквального '#4'
до тех пор, пока он не будет иметь такую же длину, что и столбец. Таким образом, это фактически становится DUPLICADO = '#4 '
.
Но когда вы сделаете DUPLICADO = :foo
, это будет зависеть от типа данных переменной привязки. Если тип данных - CHAR, он также будет выполнять сравнительное сравнение. Но если тип данных - VARCHAR2, тогда Oracle будет использовать не-дополненное сравнение, и тогда вам будет необходимо сделать пустую карту, где это необходимо.
В зависимости от языка клиента или клиента вы можете указать тип данных переменной привязки и, таким образом, получить посторонние или непроверенные сравнения по мере необходимости.
Разработчик SQL может быть особым случаем, который может не указывать тип данных - возможно, по умолчанию он может связывать переменные, всегда являющиеся типом данных VARCHAR2. Я не знаю достаточно о том, чтобы SQL Developer был уверен в этом ;-)
Какой тип данных является вашей переменной привязки PHP, объявленной как? Литерал ''# 4'' неявно преобразуется в CHAR (3) и поэтому заполняется пробелом. ': foo' bind variable Я думаю, что неявно преобразован и ожидает, что клиентский интерфейс будет выполнять добавление. Я не знаю, имеет ли PHP CHAR по сравнению с VARCHAR2 datatype для переменных привязки? Если вы можете объявить свою переменную привязки в PHP как CHAR (3) каким-то образом, тогда это может сработать, но если PHP имеет только тип данных String, возможно, по умолчанию он сопоставляется с VARCHAR2. –
@KimBergHansen Извините, я не тестировал это с помощью PHP (и я уже исправил тип столбца в приложении, поэтому для его проверки мне пришлось бы откатиться к более ранней версии). Я нашел различные варианты поведения в SQL Developer. –
Aha. Поэтому на самом деле вопрос может быть перефразирован на «Какой тип данных является переменной привязки в SQL Developer?» Я использую Toad, где можно выбрать тип данных переменной привязки.Для вашего вопроса тогда ответ заключается в том, что буквальное значение, которое SQL Engine может определить, что такое значение, и оно заполняет значение необходимыми пробелами. Для переменных привязки SQL-механизм полагается на клиент, чтобы при необходимости заполнить. Некоторые клиенты или языки клиента имеют способы указывать тип данных, чтобы клиент знал, что делать. У конкретного клиента «SQL Developer» может не быть этого (я не уверен сейчас ;-) –