බූලියන් අගයන් ගබඩා කිරීම සඳහා භාවිතා කළ යුතු MySQL දත්ත වර්ගය


1222

MySQL හි කිසිදු 'බූලියන්' දත්ත වර්ගයක් නොමැති බව පෙනෙන්නට ඇති හෙයින්, MySQL හි සත්‍ය / අසත්‍ය තොරතුරු ගබඩා කිරීම සඳහා ඔබ කුමන දත්ත වර්ගයක් අපයෝජනය කරන්නේද?

විශේෂයෙන් PHP පිටපතක් / සිට ලිවීමේ හා කියවීමේ සන්දර්භය තුළ.

කාලයත් සමඟ මම ප්රවේශයන් කිහිපයක් භාවිතා කර දැක ඇත්තෙමි:

  • 0/1 අගයන් අඩංගු කුඩා, වර්චර් ක්ෂේත්‍ර,
  • '0' / '1' හෝ 'true' / 'false' යන වර්චර් ක්ෂේත්‍ර
  • අවසාන වශයෙන් 'සත්‍ය' / 'අසත්‍ය' යන විකල්ප දෙක අඩංගු ක්ෂේත්‍ර ඇතුළත් කරන්න.

ඉහත කිසිවක් ප්‍රශස්ත බවක් නොපෙනේ. මම කුඩා ටයිප් 0/1 ප්‍රභේදයට වැඩි කැමැත්තක් දක්වන්නෙමි, මන්ද PHP හි ස්වයංක්‍රීය ආකාරයේ පරිවර්තනය මට සරලවම බූලියන් අගයන් ලබා දෙයි.

ඉතින් ඔබ භාවිතා කරන්නේ කුමන දත්ත වර්ගයද? මා නොසලකා හැර ඇති බූලියන් අගයන් සඳහා නිර්මාණය කර ඇති වර්ගයක් තිබේද? එක් වර්ගයක් හෝ වෙනත් වර්ගයක් භාවිතා කිරීමෙන් ඔබට යම් වාසි / අවාසි පෙනේද?


217
මෙම ප්‍රශ්නයට පැරණි පිළිතුරු කියවන ඕනෑම කෙනෙකුට MySQL 5 වන අනුවාදයේ ටිකක් දත්ත සමුදායක් එක් කළ බව තේරුම් ගත යුතුය. dev.mysql.com/doc/refman/5.0/en/bit-type.html
smp7d


7
MYSQL බූලියන් වර්ගයේ වර්තමාන අනුවාදය සඳහා ලබා ගත හැකිය- dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html මෙය පරීක්ෂා කරන්න. එම අගය අනුව ශුන්‍යය සාවද්‍ය යැයි සැලකේ
DevT

7
bit(1)එක්සෙල් වලින් ආනයනය කිරීමට ටිකක් **. tinyint(1)වැඩ වලට මාරුවීම .
සීස් ටිමර්මන්

8
දැන් අපට වසර 5 කට පසු බූලියන් ඇත
V-SHY

Answers:


1243

MySQL 5.0.3 සහ ඊට වැඩි සඳහා ඔබට භාවිතා කළ හැකිය BIT. අත්පොතෙහි මෙසේ සඳහන් වේ:

MySQL 5.0.3 වන විට, බිට්-ක්ෂේත්‍ර අගයන් ගබඩා කිරීම සඳහා BIT දත්ත වර්ගය භාවිතා කරයි. BIT (M) වර්ගයක් මගින් M-bit අගයන් ගබඩා කිරීමට හැකියාව ලැබේ. එම් 1 සිට 64 දක්වා විය හැකිය.

එසේ නොමැතිනම්, MySQL අත්පොතට අනුව ඔබට මේ වන විට කුඩා (1) අන්වර්ථයන් වන බූල් සහ බූලියන් භාවිතා කළ හැකිය :

බූල්, බූලියන්: මෙම වර්ග TINYINT (1) සඳහා සමාන පද වේ . ශුන්‍යයේ අගය සාවද්‍ය ලෙස සැලකේ. ශුන්‍ය නොවන අගයන් සත්‍ය ලෙස සැලකේ.

MySQL ද මෙසේ සඳහන් කරයි:

අනාගත MySQL නිකුතුවකදී සම්මත SQL වලට අනුකූලව පූර්ණ බූලියන් වර්ග හැසිරවීම ක්‍රියාත්මක කිරීමට අපි අදහස් කරමු.

යොමුව: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html


11
ඔව්, මම මේ සඳහා හෝ, CHAR (1) සඳහා ගොස් සන්දර්භය අනුව 'Y' / 'N' හෝ 'T' / 'F' ආදිය ගබඩා කරමි. කුඩා නිඛිල වර්ගයක් භාවිතා කිරීමේ වාසිය නම් ඔබට RDBMS-es හරහා උපරිම අතේ ගෙන යා හැකි වීමයි
රෝලන්ඩ් බූමන්

37
අවම වශයෙන් PHP හි වර්‍ග සඳහා යාම වැඩිදුර කේතයකට තුඩු දෙනු ඇත !$boolean.
මෘදු ෆස්

10
EPecerier ඔබට කිසිවක් ගූගල් කිරීමට නොහැකි විය, නමුත් හරි, මම දෂ්ට කරන්නෙමි. පළමුවෙන්ම, කරුණාකර data0type.h දෙස බලන්න. Innodb එහි BIT වර්ගයක් ස්වදේශීයව නිර්වචනය නොකරන බව කරුණාවෙන් සලකන්න. එය ඔබ විස්තර කරන ආකාරයට BIT ක්ෂේත්‍රයන්ට සලකන්නේ නම්, නිසැකවම එහි පැවැත්ම පිළිබඳ යම් ඉඟියක් අපට හමුවනු ඇත. දෙවනුව, mysqlperformanceblog.com/2008/04/23/… කියවන්න . “මාර්ක් ටෙට්ස්පේස්” හි ඇති පුදුමාකාර MySQL සේවාදායකයින් BIT ක්ෂේත්‍ර සමඟ හොඳින් ක්‍රීඩා කරන බව අපට දැනුම් දීමට පසුබට නොවන්න. එම ලිපිය මඟ හැරුණු ඕනෑම කෙනෙකුට ඒවා ප්‍රයෝජනවත් වනු ඇත.
රෝලන්ඩ් බූමන්

9
මම සම්මත mysql විධාන රේඛාවෙන් තේරීමක් කරන විට ග්‍රාහක බිට් ක්ෂේත්‍ර සම්පූර්ණයෙන්ම හිස්ව පෙන්වයි. මේ නිසා මම කැමතියි TINYINT (1).
පරිශීලක

9
Ike මයික්පර්සෙල් මම ඇසීමට අකමැති නමුත් ඔබට auto_incrementබූලියන් අගයක් නියෝජනය කරන තීරුවක අවශ්‍ය වන්නේ ඇයි ?
ක්‍රිස් හේස්

249

BOOLසහ එහි BOOLEANසමාන පද වේ TINYINT(1). ශුන්‍යය false, වෙන ඕනෑම දෙයක් true. වැඩි විස්තර මෙතැනින් .


7
මෙම (1)අගය ප්රදර්ශනය වන ආකාරය තීරණය කට වඩා වැඩි දෙයක්, ඔබ ගබඩා ප්රමාණය ගැන දැනුවත් කරන්නේ නම් එවිට ඔබ භාවිතා කිරීමට අවශ්ය කරන්නේ BITඒ වෙනුවට
JamesHalsall

35
@JamesHalsall: ඇත්තටම, BIT(1)හා TINYINT(1)ගබඩා භාවිතය එක් බයිටය දෙකම වනු ඇත. MySQL 5.0.3 දක්වා, BITඇත්ත වශයෙන්ම එහි අර්ථය විය TINYINT. MySQL හි පසු සංස්කරණ BIT ක්‍රියාත්මක කිරීම වෙනස් කළේය. නමුත් ක්‍රියාත්මක කිරීමේ වෙනස සමඟ වුවද, BITදත්ත සමුදායට තවමත් "ගබඩා ප්‍රමාණයේ" ප්‍රතිලාභයක් නොමැත (අවම වශයෙන් InnoDB සහ MyISAM සමඟ; වෙනත් ගබඩා එන්ජින් උදා. ආපසු ලබා දුන් BITදත්ත සමුදා තීරු පුස්තකාල හඳුනාගෙන හෝ නිසි ලෙස හසුරුවන්නේ නැත . ඒ TINYINTවඩා හොඳ වැඩ කරයි.
spencer7593

5
MySQL 5.0 අත්පොතෙහි පැහැදිලිවම පවසන්නේ බූලියන් අගය 1 හෝ 0 බවයි. “වෙන කිසිවක්” යන වාක්‍ය ඛණ්ඩය trueසත්‍ය නොවේ.
වෝල්ටර්

7
Al වෝල්ටර්: එය ඇත්ත වශයෙන්ම එක්තරා ආකාරයක සත්‍යයකි, පැහැදිලි කිරීම තරමක් අඩු ය. කෙටියෙන් කිවහොත්, බූලියන් සන්දර්භයක් තුළ, ප්‍රකාශනයකට NULL, FALSE හෝ TRUE ලෙස ඇගයීමට ලක් කළ හැකිය. MySQL ප්‍රකාශයකදී, බූලියන් සන්දර්භයක් තුළ තක්සේරු කරන ලද ප්‍රකාශනයක් මුලින් ම තක්සේරු කරනු ලබන්නේ පූර්ණ සංඛ්‍යා ලෙස ය (දශම හා පාවෙන අගයන් වටකුරු ය, නූල් සුපුරුදු විචක්ෂණශීලී ආකාරයෙන් පරිවර්තනය කරනු ලැබේ. MySQL නූල් පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය කරයි). NULL පැහැදිලිවම NULL (සත්‍ය හෝ අසත්‍ය නොවේ). 0 හි පූර්ණ සංඛ්‍යාවක් FALSE ලෙස හසුරුවන අතර වෙනත් ඕනෑම පූර්ණ සංඛ්‍යාවක් (1, 2, -7, ආදිය) සත්‍ය ලෙස තක්සේරු කරයි. අනුකූලතාව සඳහා, අපි TINYINT බූලියන් තර්කනය / හැසිරවීම අනුකරණය කරමු
spencer7593

4
Al වෝල්ටර්: මෙය පරීක්ෂා කිරීම පහසුය, උදා SELECT 'foo' AS bar FROM dual WHERE -7. -7 ප්‍රකාශනය තක්සේරු කරනු ලබන්නේ බූලියන් සන්දර්භයක වන අතර විමසුම පේළියක් ලබා දෙයි. අපට 0 සමඟ පරීක්‍ෂා කළ හැකිය, නැතහොත් පූර්ණ සංඛ්‍යා 0 ට තක්සේරු කරන ඕනෑම ප්‍රකාශනයක් කළ හැකි අතර කිසිදු පේළියක් ආපසු නොලැබේ. WHERE වගන්තියේ ප්‍රකාශනය ශුන්‍යය හැර වෙනත් ශුන්‍ය නොවන පූර්ණ සංඛ්‍යාවක් වෙත තක්සේරු කරන්නේ නම්, ප්‍රකාශනය සත්‍ය වේ. (මම විශ්වාස දශම සහ පාවෙන වටිනාකම් උදා: පූර්ණ සංඛ්යාමය කිරීමට "වටකුරු" ලබා WHERE 1/3ඇගයීමට කිරීමට WHERE 0අපි සමග එම ප්රතිඵලයම ලබා. WHERE 'foo'String නිසා 'foo'ද පූර්ණ සංඛ්යාමය අගය 0 අගය ලබා ගැනීම
spencer7593

74

මෙය ශුන්‍ය දත්ත බයිට් භාවිතා කරන බැවින් මම බෙහෙවින් අගය කරන අලංකාර විසඳුමකි:

some_flag CHAR(0) DEFAULT NULL

එය සත්‍ය ලෙස සැකසීමට some_flag = '', සකසා එය අසත්‍ය ලෙස සැකසීමට, සකසන්න some_flag = NULL.

සත්‍යය සඳහා පරීක්ෂා කිරීමට, some_flag IS NOT NULLදැයි පරීක්ෂා කර, අසත්‍යය සඳහා පරීක්ෂා කිරීමට, some_flag තිබේදැයි පරීක්ෂා කරන්න IS NULL.

(මෙම ක්‍රමය ජෝන් වොරන් ලෙන්ට්ස්, බාරොන් ෂ්වාට්ස් සහ අර්ජන් ලෙන්ට්ස් විසින් "ඉහළ කාර්ය සාධනය MySQL: ප්‍රශස්තිකරණය, උපස්ථ, ප්‍රතිවර්තනය සහ තවත්" හි විස්තර කර ඇත.)


3
විසිතුරු උපක්‍රමය! MySQL <5 හා සමහර විට BIT ට වඩා සැහැල්ලු අඩිපාරක් සමඟ වැඩ කරන්නේ නම් මෙය ප්‍රයෝජනවත් වේ, කෙසේ වෙතත් සම්මුතියට අනුකූල වීමේ උත්සාහයක් සහ තරමක් අඩු ගණනය කිරීම් පොදු (තර්කනයට එදිරිව නිශ්චිත අගය) මම කියන්නේ BIT යන්නට වඩා හොඳ ක්‍රමයයි.
zamnuts

62
'වේගවත්' විය හැකි නමුත්, එය ඕනෑම නව සංවර්ධකයෙකුට තීරුව නියෝජනය කරන්නේ කුමක් දැයි නොදැනෙන පරිදි දත්ත අපැහැදිලි කරයි.
රිච්තොෆෙන්

5
මෙය BIT (1)
ITS ඇලස්කාවේ

27
මේ සඳහා මනාව සිතියම් ගත කිරීම සඳහා ORM එකක් ලබා ගැනීම වාසනාවකි.
ක්‍රේග් ලැබෙන්ස්

5
මම රිච්තොෆෙන් සමඟ එකඟ වන අතර, මෙම විසඳුම භාවිතා කිරීමට මා කවදා හෝ යෝජනා කරන තත්වයක් ගැන සිතීම දුෂ්කර ය. කෙසේ වෙතත්, එය භාවිතා කිරීමට නම්, COMMENTතීරුවේ අර්ථ දැක්වීමේදී NULLඅසත්‍ය බව පෙන්වන සහ ''සත්‍ය බව පෙන්වන අනාගත අර්ථ දැක්වීමට ආධාර කිරීම සඳහා ඉතා සුළු මාර්ගයක් ගත හැකිය.
එගියාල්

36

මෙම ප්‍රශ්නයට පිළිතුරු ලැබී ඇති නමුත් මම සිතුවේ මගේ ඩොලර් 0.02 ට දමනු ඇති බවයි. මම බොහෝ විට භාවිතා කරන්නේ CHAR(0), කොහේද '' == true and NULL == false.

සිට mysql ලේඛන :

CHAR(0)ඔබ වටිනාකම් දෙකක් පමණක් ගත හැකි බව තීරුව අවශ්ය වන විට ද හොඳයි: අර්ථ කරන තීරු ලෙස CHAR(0) NULLඑකම ටිකක් අත්පත් කරගෙන පමණක් වටිනාකම් ගත හැකි NULLහා ''(හිස් string).


16
මි.මී., මෙය ඔබ මා ලෙස නම් කරදරයක් ඉල්ලා සිටින බවක් පෙනේ. මම අදහස් කළේ, භාෂාව අනුව NULL සහ '' අතර වෙනස හඳුනා නොගැනීම පහසු විය හැකිය (උදාහරණයක් ලෙස PHP).
රෝලන්ඩ් බූමන්

3
ඉඩ ඉතිරි කර ගැනීමේදී (බූලියන් නියෝජනය කිරීමට භාවිතා කරන බයිට් ගණන), මෙම ප්‍රවේශය පැහැදිලි ජයග්‍රාහකයෙකි. මෙය TINYINT හරහා බයිට් එකක් ඉතිරි කරයි. අවාසිය නම් (සමහර අදහස් පෙන්වා දෙන පරිදි) සමහර සේවාදායකයින්ට NULL සහ හිස් නූලක් වෙන්කර හඳුනා ගැනීමට අපහසු විය හැකිය. සමහර සම්බන්ධතා දත්ත සමුදායන් (උදා: ඔරකල්) ශුන්‍ය දිග නූලක් සහ NULL අතර වෙනස හඳුනා නොගනී.
spencer7593

3
මෙය ඉතා දක්ෂයි! මම දක්ෂ කේත ලිවීමට පුරුදුව සිටියෙමි, දැන් මම එය වසංගතය මෙන් වළක්වයි. මට දැන් අවශ්‍ය වන්නේ මගේ කේතය නිවැරදි හැසිරීම පමණක් නොව පැහැදිලි චේතනාවක් තිබීමයි. මගේ උපදෙස්? කේතය / දත්ත සමුදාය සඳහා සහය දැක්විය යුතු ඕනෑම අයෙකු ව්‍යාකූල කිරීමට ඔබට අවශ්‍ය නම් පමණක් මෙය කරන්න. දෙකම උදාහරණයක් වශයෙන්, PHP හි ''හා nullfalsy අගයන් වේ.
සී. ජේ. ඩෙනිස්

1
JCJDennis ඔබ ඔබේ දත්ත සමුදා ස්තරය නිධිය රටාව පිටුපස වියුක්ත කර ඇත්නම්, මෙම විසඳුමේ අපැහැදිලි බව ගැන කරදර විය යුතු නැත.
programhammer

33

ඔබ BOOLEAN වර්ගය භාවිතා කරන්නේ නම්, මෙය TINYINT (1) ට වෙනස් වේ. ඔබට ප්‍රමිතිගත SQL භාවිතා කිරීමට අවශ්‍ය නම් මෙය වඩාත් සුදුසු වන අතර ක්ෂේත්‍රයට පරාසයක වටිනාකමක් තිබිය හැකි බව මතක තබා ගන්න (මූලික වශයෙන් 0 නොවන ඕනෑම දෙයක් 'සත්‍ය' වනු ඇත).

ENUM ('False', 'True') මඟින් ඔබේ SQL හි ඇති නූල් භාවිතා කිරීමට ඉඩ ලබා දෙන අතර, MySQL විසින් ක්ෂේත්‍රය අභ්‍යන්තරව 'පූර්ණ' ලෙස පූර්ණ ලෙස ගබඩා කරනු ඇත, එහිදී 'False' = 0 සහ 'True' = 1 .

MySQL 5+ හි ඔබට 1-bit සංඛ්‍යාත්මක වර්ගයක් දැක්වීමට BIT (1) ක්ෂේත්‍රයක් භාවිතා කළ හැකිය. මෙය ඇත්ත වශයෙන්ම ගබඩාවේ අඩු ඉඩක් භාවිතා කරන බව මම විශ්වාස නොකරමි, නමුත් හැකි අගයන් 1 හෝ 0 දක්වා සීමා කිරීමට නැවත ඔබට ඉඩ සලසයි.

ඉහත සියල්ලම ආසන්න වශයෙන් එකම ගබඩා ප්‍රමාණයක් භාවිතා කරනු ඇත, එබැවින් ඔබ සමඟ වැඩ කිරීමට පහසුම දේ තෝරා ගැනීම වඩාත් සුදුසුය.


8
ENUM පිළිබඳ ඔබේ ප්‍රකාශය සත්‍ය නොවේ: CAST (yourenumcol AS UNGIGNED) උත්සාහ කර බලන්න, අසත්‍යය 1 ක් වන අතර සත්‍යය 2 වනු ඇත. ENUM සමඟ ඇති තවත් ගැටළුවක් නම් ඇතුල් කිරීම පහසු නැත (හිස් නූල ). මෙය භාවිතා කිරීම මම ප්‍රතික්ෂේප කරමි.
රෝලන්ඩ් බූමන්

5
මගේ අත්දැකීම් අනුව, PHP කේතයෙන් BIT (1) ක්ෂේත්‍රයක් භාවිතා කිරීම තරමක් කරදරකාරී විය. TINYINT (1) වඩා පහසු වූ අතර කියවිය හැකි කේතයක් නිපදවීය.
එම්-පෙරෝර්

1
@ M-Peror - "PHP කේතයෙන් BIT (1) ක්ෂේත්‍රයක් භාවිතා කිරීම තරමක් කරදරකාරී විය" ... කිසිදු ද pun ුවමක් අපේක්ෂා නොකරයි. :) නමුත්, ඔව්, මම එකඟයි. මට මතකයි TINYINT (1) පහසු වීමත් ... ඇයි කියලා මතක නැහැ. වෙන කාටහරි මේ ගැන සිතුවිලි තිබේද? ඔබට 0 හෝ 1 ට සීමා කළ හැකි නිසා BIT (1) මතුපිට වඩා හොඳ බව පෙනේ. BIT සමහර විට ද්විමය දත්ත ලෙස අර්ථකථනය කර ඇත (ක්‍රමලේඛන භාෂාව සහ ධාවක / පුස්තකාලය අනුව); TINYINT සලකනු ලැබුවේ අංකයක් ලෙස ය.
BMiner

2
@ බී මයිනර් - හාහා, එය සැබවින්ම බලාපොරොත්තු නොවූ දෙයක් බව දුටුවේ නැත :) නමුත් ඇත්ත වශයෙන්ම, මට නිවැරදිව මතක නම්, බිට් ක්ෂේත්‍රය ද්විමය දෙයක් ලෙස අර්ථකථනය කර ඇති අතර, කුඩා අක්ෂර සංඛ්‍යාවක් ලෙස සැලකීමට පහසු වූ අතර, ඒ නිසා, (බූලියන්) ප්‍රකාශනයක භාවිතා කරන්න.
එම්-පෙරෝර්

18

මයික්ල් හි බූලියන් අගයන් ගබඩා කිරීම සඳහා මම TINYINT (1) භාවිතා කරමි.

මෙය භාවිතා කිරීමෙන් යම් වාසියක් තිබේදැයි මම නොදනිමි ... නමුත් මම වැරදියි නම්, mysql හට බූලියන් (BOOL) ගබඩා කළ හැකි අතර එය ඉතා කුඩා (1) ලෙස ගබඩා කරයි.

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


18

ඔබට බූලියන් ක්ෂේත්‍ර විශාල ප්‍රමාණයක් තිබේ නම් විවිධ බයිට් විකල්ප (ටයිනින්ට්, එනුම්, චාර් (1)) ට වඩා බිට් වාසිදායක වේ. එක් බිට් ක්ෂේත්‍රයක් තවමත් සම්පූර්ණ බයිට් එකක් ගනී. බිට් ක්ෂේත්‍ර දෙකක් එකම බයිටයට ගැලපේ. තුන, හතර, පහ, හය, හත, අට. ඉන්පසු ඔවුන් ඊළඟ බයිට් එක පුරවන්න පටන් ගන්නවා. අවසානයේ ඉතිරිකිරීම් ඉතා කුඩා වන අතර, ඔබ අවධානය යොමු කළ යුතු තවත් ප්‍රශස්තිකරණ දහස් ගණනක් ඇත. ඔබ අතිවිශාල දත්ත ප්‍රමාණයක් සමඟ කටයුතු නොකරන්නේ නම්, එම බයිට් කිහිපය වැඩි ප්‍රමාණයක් එකතු නොකරනු ඇත. ඔබ PHP සමඟ බිට් භාවිතා කරන්නේ නම්, ඇතුළට සහ පිටතට යන අගයන් යතුරු ලියනය කළ යුතුය.


1
යතුරු ලියනය කිරීමේ විවරණය සඳහා +1. ක්‍රමලේඛන භාෂාවන් සමඟ වැඩ කිරීමේදී මෙයට එකතු වීම සඳහා අනුකූලතාවයට කම්මැලි ක්‍රමලේඛන ක්‍රම භාවිතා කිරීමෙන් වළකින්න. සමානාත්මතාවය වෙනුවට සමාන ක්‍රියාකරුවන් භාවිතා කරන්න. PHP සම්බන්ධයෙන් නම් ($ var == "") 0 සඳහා සත්‍ය වේ, අසත්‍ය, ශුන්‍ය, නිර්වචනය නොකළ සහ "". (සත්‍ය === හිස් ($ var)) නම් භාවිතා කළ හැකි සියලු අගයන් පරීක්ෂා කිරීම වඩාත් සුදුසු වන්නේ එය නිර්වචනය නොකළ දෝෂ මඟහරවා ගන්නා බැවිනි. (Is_int ($ var) && $ var === 0) සමඟ ඔබ වැඩ කරන දත්ත වර්ගයද ඔබ විසින් වලංගු කළ යුතුය.
fyrye

MS මෙය MySQL සඳහා MSSQL සඳහා සත්‍ය වන තරමටම සත්‍යයක්ද? මම තවම නිෂ්පාදනයට නොගිය නව යෙදුමක් MSSQL සිට MySQL වෙත සංක්‍රමණය කරමි. මම පීඑච්පී භාවිතා නොකර සී # ඕවර් ජාවා 8 බවට පරිවර්තනය කරමි. ජාවා තදින් ටයිප් කළ භාෂාවක් බැවින්, ටයිප් හැසිරවීම ගැන මම කණගාටු නොවෙමි ... එක් බයිටයක සිට කොඩි 8 ක් දක්වා ගමන් කරන සියලුම බිට් කොඩි TINYINT (1) ලබා දී ඇති එක් එක් ධජයට බයිට් 1 ක්. MySQL සඳහා මෙම මාතෘකාව පිළිබඳ කිසියම් ලේඛනයක් ඔබ දන්නවාද?
සැක් ජැන්සන්

1
H ඒ අනුව ගැඹුරු පර්යේෂණ කිහිපයක් කිරීමෙන් පිළිතුර කුමක් විය යුතුද යන්න පැහැදිලි වේ. වෙනසක් සිදු වන අතර මෙම හැසිරවීමේ වැඩි දියුණු කිරීම් අපි දැක ඇත්තෙමු. යෙදුම් ස්ථරයේ / දත්ත ප්‍රවේශ ස්ථරයේ ඇති ඔබේ භාෂාව දැනගෙන ඔබේ පුස්තකාල සහාය දැන ගන්න. මම දැනට ජාවා භාවිතා කරන අතර හයිබර්නේට් වැනි පුස්තකාල සහ ජේඩීබීසී භාවිතය සඳහා මේ අවස්ථාවේ නිර්දේශිත තේරීම BIT (1) වේ. මෙන්න URL එක [වගුව 5.2 බලන්න]: dev.mysql.com/doc/connector-j/en/…
සැක්

12

MySQL ටිකක් දත්ත සමුදායක් ක්‍රියාත්මක කරන තුරු, ඔබේ සැකසුම් සැබවින්ම අවකාශය සහ / හෝ වේලාව සඳහා තද කළ විට, එනම් ඉහළ පරිමාවකින් යුත් ගනුදෙනු වැනි, bit_flagsඔබේ සියලු බූලියන් විචල්‍යයන් සඳහා කැඳවූ TINYINT ක්ෂේත්‍රයක් සාදන්න , සහ ඔබේ SQL හි ඔබ කැමති බූලියන් බිට් ආවරණ කර මාරු කරන්න. විමසුම.

නිදසුනක් ලෙස, ඔබේ වම්-බිට් ඔබේ බූල් ක්ෂේත්‍රය නියෝජනය කරන්නේ නම් සහ දකුණු පස ඇති බිටු 7 කිසිවක් නියෝජනය නොකරන්නේ නම්, ඔබේ bit_flagsක්ෂේත්‍රය 128 (ද්විමය 10000000) ට සමාන වේ. &දකුණට ඇති බිටු හත (බිට්වේස් ක්‍රියාකරු භාවිතා කරමින්) වෙස්මුහුණු කරන්න , සහ 8 වන බිටු හත දකුණට මාරුවන්න, එය 00000001 සමඟ අවසන් වේ. දැන් සම්පූර්ණ අංකය (මේ අවස්ථාවේ දී 1) ඔබේ වටිනාකම වේ.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

ඔබ පරීක්ෂා කරන විට මෙවැනි ප්‍රකාශ ක්‍රියාත්මක කළ හැකිය

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

ආදිය.

ඔබට බිටු 8 ක් ඇති බැවින්, ඔබට එක් බයිට් එකකින් බූලියන් විචල්‍යයන් 8 ක් තිබිය හැකිය. සමහර අනාගත ක්‍රමලේඛකයෝ ඊළඟ බිටු හත නිරන්තරයෙන් භාවිතා කරනු ඇත, එබැවින් ඔබ ආවරණ කළ යුතුය . මාරුවෙන්න එපා, නැත්නම් අනාගතයේදී ඔබටත් අන් අයටත් නිරය නිර්මාණය වනු ඇත. ඔබේ ආවරණ සහ මාරුවීම් MySQL සතුව ඇති බවට වග බලා ගන්න - මෙය වෙබ් ස්ක්‍රිප්ටින් භාෂාව (PHP, ASP, ආදිය) කිරීමට වඩා සැලකිය යුතු වේගයකින් සිදු වේ. එසේම, ඔබේ bit_flagsක්ෂේත්‍රය සඳහා MySQL අදහස් ක්ෂේත්‍රය තුළ අදහස් දැක්වීමක් කිරීමට වග බලා ගන්න .

මෙම ක්‍රමය ක්‍රියාත්මක කිරීමේදී මෙම වෙබ් අඩවි ඔබට ප්‍රයෝජනවත් වනු ඇත:


7
මෙය අනාගත ක්‍රමලේඛකයින්ගේ අභිප්‍රාය අපැහැදිලි කිරීමේ භයානක ක්‍රමයක් සේ පෙනේ. බයිට් 7 ක් ඉතිරි කර ගැනීම නිසැකවම කරදරයක් සේ පෙනේ (ඔබ එම තනි වගුවේ ඇති බූල් 8 ම භාවිතා කරයි යැයි උපකල්පනය කරමු!)
ඔව්

අපොයි කිසිම අපැහැදිලි දෙයක් නැහැ! වගුවේ එක් එක් ක්ෂේත්‍රය පැහැදිලි කරමින් ප්‍රලේඛන සහ MySQL අදහස් ලියන්න (පිළිතුර සඳහන් වන පරිදි)! යෝජිත MySQL මුදා හැරීමේ උපායමාර්ගය solid න පෙනුමක් ඇති අතර තීරු කිහිපයක් පමණක් සහිත විවිධ බූලියන් ක්ෂේත්‍ර 16 ක් ගබඩා කිරීම වෙනුවට ඒවා 16 ක් තිබීමට වඩා හොඳය. බිට් හැසිරවීම භාවිතා කිරීම අවුල් සහගත නම් සහ එක් එක් බූලියන් ලබා ගැනීම සඳහා ඔබේ වෙබ් ස්ක්‍රිප්ටින් භාෂාව භාවිතා කිරීමට ඔබ කැමති නම්, එය a ලෙස ගබඩා කර කේතයේ නිරාවරණය කිරීමේ ක්‍රියා පටිපාටිය කරන්න (ඔබට එය ක්ෂේත්‍ර 8 කට සීමා කිරීමට අවශ්‍ය නැත) ...VARCHAR
සීපීඑච්පයිතන්

මෙම BITවර්ගය පවතී. බලන්න dev.mysql.com/doc/refman/8.0/en/bit-type.html
dolmen

9

PHP, MySQL සහ POST අගයන් නිවැරදිව වට කර ගැනීමට ශුන්‍යයන්, NULLS සහ '' ලබා ගැනීමට උත්සාහ කිරීමෙන් මම වෙහෙසට පත්ව සිටිමි, එබැවින් මම 'ඔව්' සහ 'නැත' භාවිතා කරමි.

මෙය දෝෂ රහිතව ක්‍රියාත්මක වන අතර පැහැදිලි හා පහසු නොවන විශේෂ ප්‍රතිකාර අවශ්‍ය නොවේ.


17
ඔබට සැබවින්ම මෙතරම් ඉඩක් නාස්ති කිරීමට සහ කාර්ය සාධනය අඩපණ කිරීමට අවශ්‍ය නම්, ඔබට අවම වශයෙන් Y සහ N විකල්ප සමඟ CHAR (1) වත් කළ හැකිය.
ILikeTacos

3
බොහෝ සැබෑ ලෝක තත්වයන් තුළ 'නැත' සහ හුදෙක් තොරතුරු නොමැතිකම අතර සැබෑ වෙනසක් ඇත. උදාහරණයක් ලෙස, පරිශීලකයෙකු තවමත් 'එපා' යැයි නොකියන්නේ නම් පෙරනිමියෙන් සලකුණු කොටුවක් ලබා ගැනීමට ඔබට අවශ්‍ය විය හැකිය. හරියටම ඔබ සිතන්නේ ඔබ කොපමණ ඉඩ ප්‍රමාණයක් ඉතිරි කරනවාද යන්න සහ ව්‍යාජ සහ NULL අතර වෙනස හඳුනා ගැනීමට අවශ්‍ය සෑම අවස්ථාවකම ඔබ කොපමණ පිරිසැකසුම් කිරීමක් කරනවාද - ඇත්ත වශයෙන්ම ඔබට පවා වෙන්කර හඳුනාගත හැකි නම්? ගබඩා කර ඇති රූප සහ ඩිජිටල් වීඩියෝ ලෝකයක, ඉඩ ඉතිරි කිරීමේ බිට් හෝ දෙක මුළුමනින්ම අදාළ නොවේ, නමුත් පැහැදිලිකම සහ අඩු සැකසුම් සැබෑ ය.
ජෙෆ් කෙන්ඩල්

8
මෙම පිළිතුර වැරදියි, මන්ද එය ක්‍රියාත්මක වන අතර මිනිසුන් එයට ණය ලබා දෙන තරම් නරක නැත. බොහෝ ව්‍යාපෘති සඳහා (එනම්: වගු ප්‍රමාණ <1mil පේළි) සපයා ඇති විසඳුම් අතර කාර්ය සාධන වෙනස්කම් නොසැලකිලිමත් වනු ඇත. මගේ විමසුම් මිලි තත්පර 7 ට 5 ට නැවත පැමිණේ නම් මම පැමිණිලි නොකරමි ... ඔබේ වගු මිලි 10 පේළි හෝ ඊට වැඩි ගණනකට වැඩෙන්නේ නම් මෙය වඩාත් සුදුසු විසඳුම නොවේ.
බ්‍රැඩ්

1
ENUM දත්ත වර්ගය භාවිතා කිරීම සඳහා මගෙන් +1. මම පුද්ගලිකව මෙම අංකනයට කැමතියි: ENUM ('y', 'n'). එය සංයුක්ත (බයිට් දිගක් පමණි), සියලු බූලියන් ධජ සඳහා යෙදුම් මට්ටමේ සම්මුතියක් ලෙස බුද්ධිමත් හා හොඳ පෙනුමක් ඇත. ඔබට එය කෙලින්ම HTML පෝරම ක්ෂේත්‍ර සමඟ භාවිතා කළ හැකිය. උදාහරණයක් ලෙස PHP සමඟ: <select name = "production"> <option value = "y" <? = $ production === 'y'? 'select = "select"': ''? >> ඔව් </ option> <option value = "n" <? = $ production === 'n'? 'select = "select"': ''? >> නැත </ option> </select>
Vlado

2
ලොල් මේ මගේ ඇසට හසුවුවත් මට කියන්නට ඇත්තේ @ ජෙෆ්කෙන්ඩල් හරි. ටොන් ගණනක දී ප්‍රශස්ථ කාර්ය සාධනයක් අවශ්‍ය නොවන අතර ඔබ වෙනුවෙන් කුමන ක්‍රමයක් කළත් නිවැරදි ක්‍රමය වේ.
මැඩ්මෙන්යෝ

6

මෙම ලින්ක් එක වෙත යොමු MySQL තුළ බූලීය datatype එකක් හෝ පමණක් 0 1 ගබඩා කිරීමට අවශ්ය නම්, අයදුම්පත් භාවිතය අනුව, ටිකක් (1) වඩා හොඳ තේරීම වේ.


6
එය සත්‍යයක් හෝ අගයක් පමණක් ගබඩා කිරීමට BIT(1)ඉඩ දෙන බව සත්‍යයකි . දත්ත සමුදායේ ඇති ලොකුම ගැටලුව නම් විවිධ සේවාදායක පුස්තකාලවල දත්ත සමුදාය විවිධාකාරයෙන් හැසිරවීමයි. විවිධ SQL මෙවලම් වල හැසිරීම පරීක්ෂා කරන්න (SQLyog, TOS for MySQL, SQL සංවර්ධක), "ප්‍රතිලෝම ඉංජිනේරු" දත්ත සමුදා ආකෘති, සහ JDBC, PHP, Perl DBI වැනි විවිධ සේවාදායකයින් සහ හොඳ මිනුම් සඳහා ORM රාමු කිහිපයක් පරීක්ෂා කරන්න ( ශිශිර, මයිබාටිස්, ජේපීඒ). භාවිතයේ පහසුව සම්බන්ධයෙන් ගත් කල, මෙවලම් / රාමු අනුකූලතාව / ස්වදේශීය සහාය, පැහැදිලි ජයග්‍රාහකයා වේ. b'0'b'1'BITTINYINT(1)
spencer7593

ඔව්. එය සම්පුර්ණ වන්නේ යෙදුම සඳහා සලකා බලන රාමුව මත ය. උදාහරණයක් ලෙස, PHP හි ෆැල්කන් රාමුව බිට් දත්ත
සමුදාය

වාර්තාව සඳහා, MyBatis BITසහ TINYINT. MyBatis හි JdbcType පන්තිය, mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/… බලන්න
වාසනාවන්ත

1
Id විඩ්ස් මම ඔබට BIT (1) සඳහන් කිරීම සඳහා ප්ලස් වන් ලබා දෙනවා පමණක් නොව මෙය කියවන සංවර්ධකයින්ට ද පෙන්වා දෙමි - යෙදුම් ස්ථරයේ / දත්ත ප්‍රවේශ ස්ථරයේ ඇති ඔබේ භාෂාව දැනගෙන ඔබේ පුස්තකාලවල සහාය දැන ගන්න. මම දැනට ජාවා භාවිතා කරන අතර හයිබර්නේට් වැනි පුස්තකාල සහ ජේඩීබීසී භාවිතය සඳහා මේ අවස්ථාවේ නිර්දේශිත තේරීම BIT (1) වේ. මෙන්න URL එක [වගුව 5.2 බලන්න]: dev.mysql.com/doc/connector-j/en/…
සැක්

6

MySQL (8.0.16) සහ MariaDB (10.2.1) යන දෙකම චෙක් අවහිරතා ක්‍රියාත්මක කළ බැවින්, මම දැන් භාවිතා කරමි

bool_val TINYINT CHECK(bool_val IN(0,1))

ඔබ පමණක් ගබඩා කිරීමට හැකි වනු ඇත 0, 1හෝ NULLමෙන්ම බවට පරිවර්තනය කළ හැකි සාරධර්ම ලෙස, 0හෝ 1වැනි දෝෂ තොරව '1', 0x00, b'1'හෝ TRUE/ FALSE.

ඔබට NULL වලට අවසර දීමට අවශ්‍ය නැතිනම්, NOT NULLවිකල්පය එක් කරන්න

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

ඔබ භාවිතා කරන්නේ නම් එහි කිසි වෙනසක් පාහේ බව සටහන TINYINT, TINYINT(1)හෝ TINYINT(123).

ඔබ ඔබේ ක්රමානුරූපය උඩහට අනුකූල වීමට අවශ්ය නම්, ඔබ ද භාවිතා කළ හැකිය BOOLහෝBOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db <> ෆෙඩල් නිරූපණය


enum (0, 1) ගැන කුමක් කිව
හැකිද

3
ant සාන්තියාගෝරිස්ටි ENUM(එය විය යුතුය enum('0', '1')- සටහන: ඒවා නූල් වේ) හොඳ අදහසක් නොවේ. ඇත බොහෝ ප්රශ්න එය අභ්යන්තර ගබඩා කර ඇත ආකාරය නිසා, කෙසේද string නොවන අගයන් ප්රතිකාර ලබයි. උදා. 0හා FALSE ගබඩා කළ නොහැකි ය. 1සහ TRUEබවට පත් වන්න '0'. සහ 2බවට පත්වේ '1'.
පෝල් ස්පීගල්

හොඳම පිළිතුර ... MySQL 8+ භාවිතා කරන්නන් සඳහා
dolmen

2

මෙහි පිළිතුරු කියවීමෙන් පසු මම භාවිතා කිරීමට තීරණය කළ bit(1)අතර ඔව්, එය කෙසේ හෝ අවකාශයේ / වේලාවට වඩා හොඳය, නමුත් ටික වේලාවකට පසු මම මගේ අදහස වෙනස් කළ අතර මම එය නැවත කිසි විටෙකත් භාවිතා නොකරමි. සකස් කළ ප්‍රකාශ, පුස්තකාල ආදිය (php) භාවිතා කරන විට එය මගේ සංවර්ධනය බොහෝ සංකීර්ණ කළේය.

එතැන් සිට, මම සෑම විටම භාවිතා කරමි tinyint(1), හොඳටම පෙනේ.


3
එය ඔබේ සංවර්ධනය සංකීර්ණ කරන ආකාරය පැහැදිලි කිරීමට සැලකිලිමත්ද?
Chazy Chaz

HaChazyChaz SQL සේවාදායකය වැනි වෙනත් dbs මෙන් නොව 1/0 වෙනුවට සත්‍ය / අසත්‍යය අපේක්ෂා කරයි. මෙය සමහර විට ඔබ එය සත්‍ය බවට සැකසූ නමුත් එය සත්‍ය වශයෙන්ම සිදු නොවන අමුතු අවස්ථාවන්ට මඟ පෑදිය හැකිය.
maembe

0

බූලියන් අගයන් ගබඩා කිරීම සඳහා ඔබට BOOL, BOOLEAN දත්ත වර්ගය භාවිතා කළ හැකිය.

මෙම වර්ග TINYINT (1) සඳහා සමාන පද වේ

කෙසේ වෙතත්, BIT (1) දත්ත වර්ගය බූලියන් අගයක් (සත්‍ය [1] හෝ අසත්‍ය [0]) ගබඩා කිරීම සඳහා වඩාත් අර්ථවත් කරයි, නමුත් TINYINT (1) ඔබ දත්ත ප්‍රතිදානය කරන විට, විමසීමේදී සහ වෙනත් දේ සමඟ වැඩ කිරීම පහසුය. MySQL සහ අනෙකුත් දත්ත සමුදායන් අතර අන්තර් ක්‍රියාකාරීත්වය ළඟා කර ගැනීමට. ඔබට මෙම පිළිතුර හෝ නූල් පරීක්ෂා කළ හැකිය .

MySQL විසින් BOOL, BOOLEAN දත්ත වර්ග TINYINT (1) බවට පරිවර්තනය කරයි.

තවදුරටත්, ලියකියවිලි කියවන්න

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.