Kokie MySQL duomenys naudojami loginėms vertybėms saugoti

Kadangi, atrodo, MySQL neturi jokio „loginio“ duomenų tipo, kokį duomenų tipą „piktnaudžiavote“, kad išsaugotumėte tikrą / klaidingą informaciją „MySQL“?

Ypač rašant ir skaitant iš / į PHP scenarijų.

Laikui bėgant, aš naudoju ir pamatiau keletą būdų:

  • tinyint, varchar laukai, kuriuose yra 0/1,
  • varchar laukai, kuriuose yra eilutės „0“ / „1“ arba „true“ / „false“
  • ir, galiausiai, išvardykite laukus, kuriuose yra du parametrai: „true“ / „false“.

Nė vienas iš pirmiau minėtų neatrodo optimalus. Man labiau patinka tinyint 0/1 variantas, nes automatinis tipo konvertavimas PHP suteikia man loginę vertę.

Kokio tipo duomenis naudojate? Ar yra tipas, skirtas būlių vertėms, kurias užmiršau? Ar matote kokių nors privalumų / trūkumų, naudojant šį ar tą tipą?

943
14 нояб. Beat rinkinys 14 nov. 2008-11-14 13:36 '08, 13:36 pm 2008-11-14 13:36
@ 10 atsakymų

MySQL 5.0.3 ir naujesnėms versijoms galite naudoti BIT . Vadove sakoma:

Nuo „MySQL 5.0.3“ BIT duomenų tipas naudojamas vertės bitų laukui išsaugoti. BIT (M) tipas leidžia išsaugoti M-bitų reikšmes. M gali skirtis nuo 1 iki 64.

Priešingu atveju, pagal „MySQL“ vadovą, galite naudoti „Bool“ ir „Boolean“, kurie šiuo metu yra slapyvardžiai už tinyint (1):

Bool, Boolean: Šie tipai yra sinonimai (1). Nulio vertė laikoma klaidinga. Nulinės vertės laikomos teisingomis.

„MySQL“ taip pat teigia, kad:

Ateityje MySQL išleidimo metu ketiname įdiegti pilną logikos tipą pagal standartinį SQL.

Nuorodos: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html

Beje: tai tik klausimas https://google.com/search?q=mysql+boolean+datatype .

Tai juokinga, ar ne, prieš keletą metų paskelbta nuoroda tapo rekursyvia.

1008
14 нояб. Atsakymą pateikė markus lapkričio 14 d. 2008-11-14 13:50 '08, 13:50 pm 2008-11-14 13:50

BOOL ir BOOL yra sinonimai su TINYINT(1) . Nulis yra false , visa kita yra true . Skaitykite daugiau čia .

190
14 нояб. Atsakymą pateikė Philip Morton lapkričio 14 d. 2008-11-14 13:55 '08 at 13:55 pm 2008-11-14 13:55

Tai yra elegantiškas sprendimas, kurį visiškai suprantu, nes jis naudoja nulinius duomenų baitus:

 some_flag CHAR(0) DEFAULT NULL 

Norėdami nustatyti reikšmę true, nustatykite some_flag = '' ir nustatykite jį į false, nustatykite some_flag = NULL .

Tada, norėdami patikrinti tikrosios vertės vertę, patikrinkite, ar kai kurie_flagai IS NOT NULL , ir patikrinti netikrą vertę, patikrinkite, ar kai_flag yra IS NULL .

(Šis metodas aprašytas John Warren Lenz, barono Schwartzo ir Arjeno Lenzo skyriuje „Didelio našumo MySQL: optimizavimas, atsarginis kopijavimas, replikacija ir dar daugiau.“

61
10 февр. Atsakymas pateikiamas RS 10 vasario mėn. 2012-02-10 21:09 '12, 9:09 val. 2012-02-10 21:09

Į šį klausimą buvo atsakyta, bet aš nusprendžiau, kad norėčiau mesti savo $ 0,02. Aš dažnai naudoju CHAR (0), kur '' == true ir NULL == false.

mysql docs

CHAR (0) taip pat yra labai gražus, kai jums reikia stulpelio, kuriame gali būti tik dvi reikšmės: stulpelis, apibrėžtas kaip CHAR (0) NULL, trunka tik vieną bitą ir gali užtrukti tik NULL ir '' (tuščias eilutes) reikšmes.

31
30 апр. Josh atsakymas pateiktas balandžio 30 d 2009-04-30 20:39 '09 at 8:39 PM 2009-04-30 20:39

Jei naudojate BOOLEAN tipą, tai yra slapyvardis TINYINT (1). Tai geriausia, jei norite naudoti standartizuotą SQL ir neužmirškite, ar lauke gali būti ribinė vertė (iš esmės viskas, kas nėra lygi 0, bus „tiesa“).

ENUM („False“, „True“) leis jums naudoti eilutes jūsų SQL, o „MySQL“ išsaugos šį lauką kaip sveiką skaičių, kur „False“ = 0 ir „True“ = 1, remiantis Enum nurodyta tvarka.

„MySQL 5+“ galite naudoti BIT (1) lauką norėdami nurodyti 1 bitų skaitmeninį tipą. Nemanau, kad jis iš tikrųjų naudoja mažiau vietos, bet vėl leidžia apriboti galimas reikšmes iki 1 arba 0.

Visi aukščiau minėti kiekiai bus panaudoti maždaug tokiu pat kiekiu atminties, todėl geriausia pasirinkti tą, su kuria galima lengvai susidoroti.

23
14 нояб. Atsakymą pateikė Ciaran McNulty 14 lapkričio. 2008-11-14 17:59 '08, 17:59, 2008-11-14 17:59

Aš naudoju TINYINT (1), kad išsaugotumėte logines reikšmes MySQL.

Nežinau, ar yra kokių nors pranašumų, naudojant šį ... Bet jei aš nesuprantu, „mysql“ gali išsaugoti loginę vertę (BOOL) ir laikyti ją kaip „tinyint“ (1)

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html

14
14 нояб. Atsakymą Fredas pateikė lapkričio 14 d. 2008-11-14 13:42 '08 13:42 pm 2008-11-14 13:42

Bitas yra naudingas tik įvairioms baitų parinktims (tinyint, enum, char (1)), jei turite daug loginių laukų. Vienas bitų laukas vis dar užima visą baitą. Į tą patį baitą įeina du bitų laukai. Trys, keturi, penki, šeši, septyni, aštuoni. Po to jie pradeda užpildyti kitą baitą. Galiausiai taupymas yra toks mažas, kad jums reikia sutelkti dėmesį į tūkstančius kitų optimizacijų. Jei nesusiję su didžiuliu duomenų kiekiu, šie keli baitai nebus daug skirtingi. Jei naudojate šiek tiek su PHP, turite priskirti įvesties ir išvesties vertes.

13
12 янв. atsakymas duotas Thor 12 d 2012-01-12 19:18 '12, 07:18 PM 2012-01-12 19:18

Tol, kol MySQL nenaudoja duomenų tipų bitų, jei apdorojate tikrai prispaustą erdvę ir (arba) laiką, pvz., Su dideliais kiekiais, sukurkite TINYINT lauką, pavadintą bit_flags visiems jūsų loginiams kintamiesiems ir kaukę ir perkelkite loginį bitą jūsų SQL užklausoje.

Pvz., Jei jūsų kairysis bitas yra jūsų boolo laukas, o 7 geriausi bitai - nieko, tada jūsų bit_flag laukas bus 128 (dvejetainis 10 000 000). Kaukė (paslėpti) septyniais dešimčiaisiais bitais (naudojant bitų operatorių ir) ir perkelkite 8 bitų septynias erdves į dešinę, jūs baigsite 00000001. Dabar visas skaičius (kuris šiuo atveju yra 1) yra jūsų vertė.

 SELECT (t.bit_flags  128) >> 7 AS myBool FROM myTable t; if bit_flags = 128 ==> 1 (true) if bit_flags = 0 ==> 0 (false) 

Galite paleisti pareiškimus, pvz., Bandant

 SELECT (128  128) >> 7; SELECT (0  128) >> 7; 

ir tt ...

Kadangi turite 8 bitus, turite potencialiai 8 loginius kintamuosius, pradedant vienu baitu. Kai kurie ateities programuotojai nuosekliai naudos šiuos septynis bitus, todėl jūs turite užmaskuoti. Ne tik perkelkite, nei kurkite pragarą sau ir kitiems ateityje. Įsitikinkite, kad esate užmaskuotas ir perduotas „MySQL“ - jis bus daug greičiau nei naudojant interneto scenarijų kalbą (PHP, ASP ir tt). Taip pat įsitikinkite, kad įterpėte komentarą „MySQL“ komentarų lauke savo bit_flags laukui.

Šias svetaines rasite naudingai įgyvendinant šį metodą. http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html http://acc6.its.brooklyn.cuny.edu/~gurwitz/core5/nav2tool.html

10
13 июля '11 в 20:13 2011-07-13 20:13 Atsakymą davė Jonathanas liepos 11 d. 11 val. 20:13 2011-07-13 20:13

Aš pavargau nuo bandymų gauti nulius, „NULLS“ ir „tiksliai apeiti PHP,„ MySql “ir„ POST “reikšmes, todėl aš tiesiog naudoju„ Taip “ir„ Ne “.

Jis veikia nepriekaištingai ir nereikalauja specialaus gydymo, kuris nėra akivaizdus ir lengvai naudojamas.

7
09 июля '12 в 23:10 2012-07-09 23:10 atsakymą pateikė Geoffas Kendallas liepos 12 d. 12 val. 23:10 2012-07-09 23:10

Atsižvelgiant į šią nuorodą „ Boolean“ duomenų tipas „MySQL“ , priklausomai nuo programos naudojimo, jei norite išsaugoti tik 0 arba 1, geriau pasirinkti bitą (1).

3
23 февр. atsakymas pateikiamas Vidz 23 vas. 2015-02-23 13:41 '15, 13:41 pm 2015-02-23 13:41