ฉันควรใช้ UNSIGNED และ SIGNED INT ใน MySQL เมื่อใด จะใช้อะไรดีกว่ากันหรือนี่เป็นเพียงความชอบส่วนตัว? เพราะฉันเคยเห็นมันใช้แบบนี้
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
และ
id INT(11) NOT NULL AUTO_INCREMENT
ฉันควรใช้ UNSIGNED และ SIGNED INT ใน MySQL เมื่อใด จะใช้อะไรดีกว่ากันหรือนี่เป็นเพียงความชอบส่วนตัว? เพราะฉันเคยเห็นมันใช้แบบนี้
id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT
และ
id INT(11) NOT NULL AUTO_INCREMENT
คำตอบ:
UNSIGNEDเก็บเฉพาะตัวเลขบวก (หรือศูนย์) ในทางกลับกันการลงนามสามารถจัดเก็บตัวเลขเชิงลบได้ (เช่นอาจมีค่าลบเครื่องหมาย )
นี่คือตารางของช่วงของค่าแต่ละค่า INTEGERประเภทสามารถจัดเก็บได้:

ที่มา: http://dev.mysql.com/doc/refman/5.6/en/integer-types.html
UNSIGNEDช่วงจาก0ถึงnในขณะที่ได้ลงนามในช่วงจากไป-n/2n/2
ในกรณีนี้คุณมีAUTO_INCREMENTคอลัมน์ ID ดังนั้นคุณจะไม่มีเชิงลบ ดังนั้นการใช้UNSIGNED. หากคุณไม่ได้ใช้UNSIGNEDสำหรับAUTO_INCREMENTคอลัมน์ค่าสูงสุดที่เป็นไปได้ของคุณจะสูงถึงครึ่งหนึ่ง (และครึ่งหนึ่งที่เป็นค่าลบของช่วงค่าจะไม่ถูกใช้)
UNSIGNEDเป็นคุณลักษณะเฉพาะของ MySQL และไม่ใช่คุณลักษณะ SQL มาตรฐาน ซึ่งหมายความว่าการใช้UNSIGNEDสามารถทำให้การย้ายข้อมูลในอนาคตไปยัง RDBMS อื่นซับซ้อนมากขึ้นหรือทำให้คุณลำบากเมื่อใช้ไลบรารีซอฟต์แวร์ที่กำหนดเป้าหมาย SQL มาตรฐานเช่น SQLAlchemy ฉันคิดว่านี่น่าจะเป็นคำตอบส่วนหนึ่ง
ใช้UNSIGNEDสำหรับจำนวนเต็มที่ไม่เป็นลบ
โดยพื้นฐานUNSIGNEDแล้วคุณจะให้ตัวเองมีช่องว่างเป็นสองเท่าสำหรับจำนวนเต็มเนื่องจากคุณระบุไว้อย่างชัดเจนว่าคุณไม่จำเป็นต้องมีจำนวนลบ (โดยปกติเนื่องจากค่าที่คุณจัดเก็บจะไม่เป็นลบ
สำหรับค่าจำนวนเต็มลบSIGNEDและใช้สำหรับค่าจำนวนเต็มไม่เป็นลบUNSIGNEDถูกนำมาใช้ แนะนำให้ใช้UNSIGNEDสำหรับ id เป็นคีย์หลักเสมอ
ฉันไม่ได้ไม่เห็นด้วยกับVipin CP
ความจริงก็คือบิตแรกถูกใช้เพื่อแสดงเครื่องหมาย แต่1เป็นค่าลบและ0เป็นค่าบวก มากกว่าค่าลบจะถูกเข้ารหัสด้วยวิธีที่ต่างกัน (ส่วนเติมเต็มของสอง) ตัวอย่างด้วย TINYINT:
The sign bit
|
1000 0000b = -128d
...
1111 1101b = -3d
1111 1110b = -2d
1111 1111b = -1d
0000 0000b = 0d
0000 0001b = 1d
0000 0010b = 2d
...
0111 1111b = 127d
สิ่งหนึ่งที่ผมอยากจะเพิ่มในsigned intซึ่งเป็นdefault value in mysql, จะถูกใช้ในการแสดง1 bit
ดังนั้นหากแอปพลิเคชันของคุณใส่เฉพาะค่าบวกควรระบุไม่ได้ลงนามsign-1 for negative and 0 for positive.
หากคุณทราบประเภทของตัวเลขที่คุณจะจัดเก็บคุณสามารถเลือกได้ตามนั้น ในกรณีนี้คุณมี 'id' ซึ่งไม่มีทางเป็นลบ ดังนั้นคุณสามารถใช้ int ที่ไม่ได้ลงนาม ช่วงของ int ที่ลงนาม: -n / 2 ถึง + n / 2 ช่วงของ int ที่ไม่ได้ลงชื่อ: 0 ถึง n ดังนั้นคุณจึงมีจำนวนบวกสองเท่า เลือกตามนั้น
ฉันคิดว่าUNSIGNEDน่าจะเป็นตัวเลือกที่ดีที่สุดในการจัดเก็บค่าบางอย่างเช่นtime_duration(เช่น :) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)ในรูปแบบนาทีหรือชั่วโมงหรือวินาทีซึ่งแน่นอนว่าจะเป็นตัวเลขที่ไม่ติดลบ