В Oracle Database есть тип BOOLEAN, но он только для PL/SQL. Его нельзя использовать в качестве типа колонки таблицы. Сложно сказать, почему его нет. Но на текущий момент приходиться использовать CHAR(1) со значениями 'Y'/ 'N' или NUMBER(1) со значениями 1 / .
Чаще всего используется вариант с CHAR(1) и 'Y' / 'N'. В этом случае одно значение будет занимать ровно один байт. Также рекомендуется накладывать ограничение на колонку, чтобы никто случайно не вставил туда другие значения.
Пример:
1 2 3 |
CREATE TABLE mytable (boolvalue CHAR(1) CHECK (boolvalue IN ('N','Y')); INSERT INTO mytable values ('N'); INSERT INTO mytable values ('Y'); |
Перед созданием колонки с логическим типом стоит хорошенько подумать, так как вполне возможно, что ей можно указать NOT NULL, иначе мы получим BOOLEAN колонку, в которую можно вставить NULL, тогда она по сути будет иметь три значения: ИСТИНА, ЛОЖЬ и NULL.
В приведённом выше SQL-коде мы создаём таблицу mytable с одной колонкой boolvalue типа CHAR(1). На колонку наложено ограничение: оно может принимать только значения 'Y' (вместо булевского TRUE) и 'N' (вместо булевского FALSE). Таким образом чаще всего и имитируется BOOLEAN в Oracle.
Однако при работе с JDBC несколько легче использовать в качестве BOOLEAN тип NUMBER(1) с 0 вместо FALSE и 1 вместо TRUE, так как тогда мы сможем без проблем получать значения в Java с помощью методов getBoolean и устанавливать с помощью setBoolean:
1 2 3 |
CREATE TABLE mytable (boolvalue NUMBER(1) CHECK (boolvalue IN (0,1)); INSERT INTO mytable values (0); INSERT INTO mytable values (1); |
Также можно использовать CHAR(1) со значениями '1' и '0'. В этом случае getBoolean и setBoolean в ResultSet-ах Java тоже должны успешно отрабатывать:
1 2 3 4 5 6 7 |
CREATE TABLE mytable (boolvalue CHAR(1) CHECK (boolvalue IN ('0','1')); INSERT INTO mytable values ('0'); INSERT INTO mytable values ('1'); -- На самом деле мы можем даже пытаться вставлять туда цифры 0 и 1 -- Oracle сам сможет преобразовать их в CHAR(1). INSERT INTO mytable values (0); INSERT INTO mytable values (1); |
Преимущества варианта с CHAR(1) перед NUMBER(1) ещё в том, что он занимает меньше памяти.