Попытка использовать альтернативу битового типа в oracle [duplicate]

23
задан Martin Milan 11 March 2010 в 23:44
поделиться

9 ответов

Я предпочитаю char (1) по числу (1), так как с некоторым разумным выбором символов очевидно, какой символ имеет то, что имеет логическое значение.

Конечно, вам следует бороться со всеми различными вариациями, выберите один из них и убедитесь, что он используется, поместив контрольные ограничения на столбцы.

Хотя, вероятно, в конце вашего случая генерация схемы из другого инструмента часто заботится хотя бы о проблеме согласованности. Я лично предпочитаю спящий режим для этой цели, но это очень специфическая ситуация.

И, конечно, это вопиющее представление. Чтобы сделать это хуже, PL / SQL имеет логическое значение, но вы не можете использовать его в операторах SQL.

11
ответ дан Jens Schauder 25 August 2018 в 22:07
поделиться
  • 1
    И это, и ответы Тило хорошо, но я принял это из-за совета, чтобы обеспечить соблюдение с помощью проверочных ограничений ... Похоже, что реальный ответ «Каждый делает свое дело, нет стандартного ...» ; – Martin Milan 11 March 2010 в 16:54
  • 2
    Вы также можете назвать столбец соответственно, например UPDATE_ALLOWED_YN – Gary Myers 11 March 2010 в 23:05

Я не владею английским языком, поэтому я склонен использовать либо 1, либо 0, либо 1 и 0. Использование «Y» и «N» имеет мало смысла, если вы не кодируете на английском языке (да, кодировка на родном языке существует). Использование «SI» и «NO» или «S» и «N» не выглядит профессиональным (точно так же, как именование переменных с акцентированными буквами). Напротив, ноты и ноль довольно стандартизированы, если вы закодированы в C, PHP или JavaScript. В любом случае, я всегда добавляю соответствующее ограничение, чтобы запретить любой другой символ. Помимо субъективных проблем, я не думаю, что при выборе CHAR или NUMBER заметно увеличение производительности. Мне нравятся номера немного больше, потому что мне не нужно их процитировать:)

Я согласен, что это вопиющее упущение, но я читал серьезно горячие дискуссии по этому вопросу на некоторых форумах Oracle; это своего рода религиозная проблема. Некоторые утверждают, что булевы относятся к типам данных приложения и не имеют места в ядре базы данных. Честно говоря, я считаю, что это один из тех, кого мы так долго не знали, что мы лучше говорили, что это было по назначению.

Кстати, у MySQL есть тип BOOLEAN, но это синоним TINYINT (1 ), поэтому он в конечном итоге равен 1 и 0; что хорошо, потому что он также имеет константы TRUE и FALSE, которые оценивают 1 и 0.

15
ответ дан Álvaro González 25 August 2018 в 22:07
поделиться
  • 1
    Я склонен согласиться с вами - и да, я сделал некоторые C / PHP в прошлом. Я определенно предпочитаю численные данные, но я удивлен, обнаружив, что они занимают больше места (см. Выше) – Martin Milan 11 March 2010 в 18:01
  • 2
    +1 для «Мы-были-так-долго-без-это-то-мы-лучше-говори-это-было-на-цели» Мы должны поместить эту фразу: WHBSLWITWHBSIWOP. – Baodad 3 October 2014 в 18:35

https://docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html

Как сказал DCookie , char (1) более эффективен. Поскольку VARCHAR2 (VARCHAR) пуст, содержит 1 байт, но когда мы сохраняем 1 символ, тогда пустой размер 1 байта + с размером символа 1 байт -> 2 байта должен хранить 1 символ в varchar

-1
ответ дан Artem.Borysov 25 August 2018 в 22:07
поделиться

Вот обсуждение Ask Tom по этой теме. Дает ориентированный на Oracle взгляд на проблему.

Что касается хранилища, char (1) на самом деле является бит (без каламбура) более эффективным:

SQL> CREATE TABLE xx (c CHAR(1), n NUMBER);

Table created

SQL> insert into xx values('T', 1);

1 row inserted

SQL> select dump(c), dump(n) from xx;

DUMP(C)             DUMP(N)
------------------- -------------
Typ=96 Len=1: 84    Typ=2 Len=2: 193,2
8
ответ дан DCookie 25 August 2018 в 22:07
поделиться
  • 1
    Это очень интересно - и не то, что я ожидал. Я все еще лично чувствую, что у численностей больше ясности ... Я прочитал дискуссию Ask Tom перед тем, как увидеть ваш пост (Googled around), но я не согласен с его оправданием от того, что у меня нет логического / битного ... – Martin Milan 11 March 2010 в 17:59
  • 2
    @Martin: Смотрите это обсуждение для дальнейшего просветления, обращая особое внимание на ответ Квасной: stackoverflow.com/questions/1087210/oracle-number-comparisons/… – DCookie 11 March 2010 в 19:40
  • 3
    @Martin: Я согласен, нет логической причины, чтобы исключить тип BOOLEAN в базе данных, только прагматические. Oracle является немного шизофреником в этой проблеме, поскольку у них есть тип BOOLEAN на языке PL / SQL. Это само по себе является источником большой путаницы для программистов Oracle в первый раз, когда они сталкиваются с этим. – DCookie 11 March 2010 в 19:43
  • 4
    Спасибо за это - не знали, что они были сохранены как centesmimal ... Мой опыт, прежде чем эта работа была в основном связана с MS-SQL, и я должен сказать, во многих отношениях, я начинаю пропустить это! – Martin Milan 11 March 2010 в 23:39

Согласно этому руководству Oracle, вы должны использовать NUMBER (3). Сумасшедший, но правда.

http://docs.oracle.com/cd/B19306_01/gateways.102/b14270/apa.htm

2
ответ дан GilesDMiddleton 25 August 2018 в 22:07
поделиться

Используйте CHAR (1) и ограничение, чтобы разрешить только «1» и «0».

...

col CHAR(1),
CONSTRAINT cons_atable_col1 CHECK (col1 IN ('1','0'))
24
ответ дан Samuel 25 August 2018 в 22:07
поделиться
  • 1
    Теперь этот ответ мне очень нравится .. – Martin Milan 11 March 2010 в 18:12
  • 2
    Это то, что я собирался написать после дальнейших исследований по этому делу. Во всяком случае, вот ссылка, которая должна помочь. thinkoracle.blogspot.com/2005/07/oracle-boolean.html Кроме того, вы можете определить тип пользователя, который должен быть BIT, например, затем принимать только те ограниченные значения. Другая полезная ссылка: download-uk.oracle.com/docs/cd/B19306_01/server.102/b14200/… – Will Marcouiller 12 March 2010 в 01:37
  • 3
    Не забывайте о «По умолчанию 0 Not Null», если необходимо. Я проверял необходимость - избегать нулевой вставки – Artem.Borysov 23 July 2015 в 15:53

Вопрос старый, но до тех пор, пока не будет использована последняя версия oracle, это все еще правильный вопрос.

Я бы решил проблему следующим образом: Создайте таблицу, которая содержит возможные значения для true / false плюс локализованный текст дисплея fe T $ KEYWORDS ITEMNO ITEMTEXT ITEMTEXT_DE ITEMTEXT_FE ... 0 False Falsch 1 True Wahr

Вместо True / False это может быть также выбрано, не выбрано и т. Д.

. Затем добавьте toeigh ключ к вашей колонке к этой таблице. Таким образом, у вас есть только допустимые значения, и они не меняются с локализацией.

Другое хорошее решение imho использует ограничение проверки в столбце данных. Этот параметр cc не работает, если ваши значения могут отличаться в одной и той же базе данных / столбце в зависимости от локализации клиентов.

alter table tblLocations add flag number CONSTRAINT <constraintname> CHECK (flag IN (1,0));

0
ответ дан SomeCoder 25 August 2018 в 22:07
поделиться

Oracle использует «биты» (а не тип данных per se) в разных представлениях словаря данных.

Например, представление dba_users имеет:

..
        , DECODE (BITAND (u.spare1, 128), 128, 'YES', 'NO')
..
        , DECODE (BITAND (u.spare1, 256), 256, 'Y', 'N')
..

, который показывает способ обхода этого в некотором роде. Если вам не нужно часто изменять «логические» биты, вы можете использовать тот же подход, что и Oracle с Oracle 6 (по крайней мере). Создайте таблицу с столбцом NUMBER и VIEW поверх того, что скрывает сложность операций BITAND.

ps. С другой стороны, Oracle JDBC имеет тип данных «бит» https://docs.oracle.com/cd/E16338_01/appdev.112/e13995/oracle/jdbc/OracleTypes.html#BIT as как вы уже знаете, PL / SQL имеет Boolean. Хотя это, вероятно, вам не поможет. См. Подход BITAND выше, если он соответствует вашему делу.

0
ответ дан Tagar 25 August 2018 в 22:07
поделиться

Число (1) не лучше, чем char (1). Особенно, если это будет в дополнение к существующему char (1). Это просто добавит к путанице.

FWIW, Oracle во внутренних представлениях (например, USER_TAB_COLUMNS) использует varchar2 (3) (YES и NO). Не уверен, что они здесь 100%.

2
ответ дан Thilo 25 August 2018 в 22:07
поделиться
  • 1
    Моя причина думать о Number (1,0) заключалась в том, что если бы ничто иное значение не имело бы определенного определенного значения. Я обращаю ваше внимание на то, что мы делаем, чтобы сосуществовать с кодом прошлого, но это неизбежно - и не так нежелательно, как просто оставить ситуацию, как это сейчас ... Я также надеялся, что численный характер будет проще для сервера, и, следовательно, возможно (небрежно) быстрее. Не хотите ли вы предложить тип данных кандидата? – Martin Milan 11 March 2010 в 16:32
  • 2
    число (1) может быть немного меньше на диске, но за исключением огромных таблиц, состоящих почти из «булевых», это должно быть пренебрежимо. Также у вас всегда есть параметры сжатия и растровые индексы, которые могут решить некоторые связанные с пространством негативные эффекты. – Jens Schauder 11 March 2010 в 16:35
  • 3
    @Jens: На самом деле число (1) больше. См. Мой ответ. – DCookie 11 March 2010 в 17:46
  • 4
    Oracle использует, по-разному, «Y» / «N», «YES» / «NO», «ENABLED» / «DISABLED» и даже «Y» / «N» (см. Столбец all_tables.cache), + несколько других , Консистенция даже не заглядывает. – thecoop 11 March 2010 в 18:06
Другие вопросы по тегам:

Похожие вопросы: