ฉันควรใช้ 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/2
n/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)
ในรูปแบบนาทีหรือชั่วโมงหรือวินาทีซึ่งแน่นอนว่าจะเป็นตัวเลขที่ไม่ติดลบ