Oracle hat keinen Bit-Datentyp für Tabellenspalten
Ich arbeite als Entwickler in einem kleinen team-Entwicklung, und etwas genervt hat mich zu dem Punkt, wo ich beschlossen habe zu handeln...
Oracle bietet keine Unterstützung für einen Bit-Datentyp - oder etwas anderes, das macht offensichtlich Sinn, true/false-Szenarien. Unbeirrt jedoch, bevor ich dem team beigetreten meiner Vorfahren beschlossen, char(1) Felder statt, die mit einem bestimmten Buchstaben zu bezeichnen, ja /true. Leider, obwohl, unsere Anwendung wird verwendet, um von Menschen auf der ganzen Welt, und aus Gründen, die offen trotzen alle meine versuche, Verständnis, der Wert variiert durch Lokalisierung.
Ja, ich weiß, dass ist völlig unnötig für die Werte in der Rückseite, die der Benutzer nie sieht - aber...
Habe ich bemerkt, dass diese Praxis scheint zu sein, immer vorgetragen in neue Entwicklung, die mir auffällt, ist, wie verrückt - also ich bin am überlegen, eine Anzahl(1,0) für das statt - 0 wird als false /Nein, etwas anderes interpretted als wahr /ja...
Einfache Frage - kann mir jemand einen Grund denken, dies könnte eine schlechte Idee?
Während wir dabei sind, hat jemand wissen, warum Oracle nicht unterstützt, ist eine einfache boolean-Typ? Ist es nicht ein KRASSER ommission?
Jubel in Erwartung,
Martin.
InformationsquelleAutor der Frage Martin Milan | 2010-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich lieber char(1) über die Zahl(1), da eine vernünftige Auswahl an Charakteren, ist es offensichtlich, welcher Charakter hat welche boolean Bedeutung.
Natürlich sollte man kämpfen, all die verschiedenen varations wählen Sie eine und es ist sicher, zu verwenden, indem Sie check constraints auf Spalten.
Obwohl es wahrscheinlich ist zu spät, in deinem Fall der Generierung des Schemas aus einem anderen Werkzeug, das oft kümmert sich zumindest von der Konsistenz-Problem. Ich persönlich bevorzuge den Ruhezustand für diesen Zweck, aber das ist eine sehr spezifische situation.
Und das ist natürlich ein krasser obmission. Um es noch schlimmer, PL/SQL hat einen booleschen Wert, aber Sie können es nicht verwenden in SQL-Anweisungen.
InformationsquelleAutor der Antwort Jens Schauder
Verwenden(CHAR (1), und eine Einschränkung, dass nur '1' und '0'.
...
InformationsquelleAutor der Antwort Samuel
Ich bin kein englischer Muttersprachler, so dass ich Neige dazu, verwenden Sie entweder 1 und 0 oder '1' und '0'. Mit 'Y' und 'N' wenig Sinn machen, wenn Sie nicht die Kodierung auf Englisch (ja, Muttersprache Codierung existiert). Mit 'SI' und 'NEIN' oder 'S' und 'N' nicht Professionell aussieht (genauso wie die Benennung von Variablen mit akzentuierten Buchstaben). Einsen und Nullen, im Gegenteil, sind ziemlich standard, wenn Sie codiert haben in C, PHP oder JavaScript. In jedem Fall, habe ich immer fügen Sie die entsprechende Einschränkung zu verbieten, irgendwelche anderen Zeichen. Abgesehen von subjektiven Fragen, die ich nicht glaube, es gibt spürbare performance-Gewinn in der CHAR Auswahl oder ANZAHL. Ich mag zahlen ein wenig mehr, weil ich brauche nicht zu zitieren 🙂
Ich Zustimmen, dass es eine eklatante Auslassung aber ich habe gelesen, ernst hitzige Diskussionen über das Thema in einigen Oracle-Foren; es ist eine Art religiöse Frage. Einige behaupten, dass Boolesche Werte gehören Anwendungsdaten Typen und haben keinen Platz in der Datenbank-Kern. Ehrlich gesagt, ich glaube, es ist einer von denen, die Wir Schon So Lange Ohne Sie, hätten Wir Besser Sagen, Es War absichtlich Dinge.
Durch die Art und Weise, MySQL hat ein BOOLEAN-Typ, sondern es ist ein synonym für TINYINT(1) so ist es schließlich gleich 1 und 0; das ist gut, weil es auch die Konstanten TRUE und FALSE zu bewerten, dass 1 und 0.
InformationsquelleAutor der Antwort Álvaro González
Hier ist ein Fragen Tom Diskussion über das Thema. Gibt eine Oracle-zentrierten Blick auf das Thema.
Als für die Lagerung, char(1) ist tatsächlich ein bisschen (kein Wortspiel beabsichtigt) effizienter:
InformationsquelleAutor der Antwort DCookie
Nummer(1) ist nicht besser als char(1). Vor allem, wenn es zusätzlich zu den bestehenden char(1). Das wird nur die Verwirrung.
FWIW, Oracle-internen Ansichten (wie USER_TAB_COLUMNS) verwendet varchar2(3) (JA und NEIN). Nicht sicher, ob Sie 100% konsistent ist, die hier, obwohl.
InformationsquelleAutor der Antwort Thilo
Gemäß dem Oracle Installationshandbuch - Sie sollte nutzen ANZAHL(3). Verrückt, aber wahr.
http://docs.oracle.com/cd/B19306_01/gateways.102/b14270/apa.htm
InformationsquelleAutor der Antwort GilesDMiddleton
Die Frage ist alt, aber bis auf das neueste release von oracle verwendet wird, ist es immer noch eine berechtigte Frage.
Ich würde lösen das problem auf diese Weise:
Erstellen Sie eine Tabelle enthält die möglichen Werte für true/false-plus lokalisierten text anzeigen f.e.
T$KEYWORDS
ITEMNO ITEMTEXT ITEMTEXT_DE ITEMTEXT_FE ...
0 Falsch Falsch
1 Wahr Wahr
Anstelle von True/False könnte dies auch Ausgewählt, Nicht Ausgewählt, etc.
Und fügen Sie dann eine foreigh Schlüssel zu Ihrer Spalte dieser Tabelle. So Sie haben nur gültige Werte, und Sie ändern sich nicht mit der Lokalisierung.
Andere gute Lösung imho ist die Verwendung einer check-Einschränkung auf Ihre Daten-Spalte. Dies ofc funktioniert nicht, wenn Ihre Werte könnten anders sein, in der gleichen Datenbank/Spalte je nach Lokalisierung des clients.
alter table tblLocations add flag number CONSTRAINT <constraintname> CHECK (flag IN (1,0));
InformationsquelleAutor der Antwort SomeCoder
Oracle intern verwendet "bits" (nicht den Datentyp per se), die in verschiedenen Data-Dictionary-views.
Z.B. dba_users Blick hat :
was zeigt, einen Weg zur Umgehung dieses in einer Art und Weise. Wenn Sie nicht zu ändern "boolean" bits oft, Sie könnten beschäftigen den gleichen Ansatz, dass Oracle hatte seit Oracle 6 (mindestens). Erstellen Sie eine Tabelle mit einer Spalte "NUMMER", und eine ANSICHT oben auf, dass, verbirgt die Komplexität der Operationen BITAND.
ps. On a side note, Oracle-JDBC-hat ein "Bisschen" datatype https://docs.oracle.com/cd/E16338_01/appdev.112/e13995/oracle/jdbc/OracleTypes.html#BIT so gut wie Sie bereits wissen, PL/SQL ist Boolean. Obwohl es wahrscheinlich nicht viel helfen. Sehen BITAND Ansatz oben, wenn es suites Ihrem Fall.
InformationsquelleAutor der Antwort Tagar
https://docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html
Als DCookie sagte, char(1) ist effizienter.
Da VARCHAR2(VARCHAR) leer enthält 1 byte, aber wenn wir speichern 1 Charakter dann leer 1 byte-Größe + mit Zeichen 1 byte Größe --> 2 byte speichern müssen 1 Zeichen in ein varchar
InformationsquelleAutor der Antwort Artem.Borysov