ฉันควรใช้ UNSIGNED และ SIGNED INT ใน MySQL เมื่อใด


103

ฉันควรใช้ UNSIGNED และ SIGNED INT ใน MySQL เมื่อใด จะใช้อะไรดีกว่ากันหรือนี่เป็นเพียงความชอบส่วนตัว? เพราะฉันเคยเห็นมันใช้แบบนี้

id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT

และ

id INT(11) NOT NULL AUTO_INCREMENT

4
PK เชิงลบไม่สมเหตุสมผล
zerkms

คำตอบ:


169

UNSIGNEDเก็บเฉพาะตัวเลขบวก (หรือศูนย์) ในทางกลับกันการลงนามสามารถจัดเก็บตัวเลขเชิงลบได้ (เช่นอาจมีค่าลบเครื่องหมาย )

นี่คือตารางของช่วงของค่าแต่ละค่า INTEGERประเภทสามารถจัดเก็บได้:

ประเภทและความยาวของ MySQL 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คอลัมน์ค่าสูงสุดที่เป็นไปได้ของคุณจะสูงถึงครึ่งหนึ่ง (และครึ่งหนึ่งที่เป็นค่าลบของช่วงค่าจะไม่ถูกใช้)


17
อย่างไรก็ตามโปรดทราบว่าUNSIGNEDเป็นคุณลักษณะเฉพาะของ MySQL และไม่ใช่คุณลักษณะ SQL มาตรฐาน ซึ่งหมายความว่าการใช้UNSIGNEDสามารถทำให้การย้ายข้อมูลในอนาคตไปยัง RDBMS อื่นซับซ้อนมากขึ้นหรือทำให้คุณลำบากเมื่อใช้ไลบรารีซอฟต์แวร์ที่กำหนดเป้าหมาย SQL มาตรฐานเช่น SQLAlchemy ฉันคิดว่านี่น่าจะเป็นคำตอบส่วนหนึ่ง
minexew

ความคิดเห็นของ Seconding @ minexew ฉันใช้ SQLAlchemy ใน Python กับฐานข้อมูล MySQL ฉันมีปัญหาในการกำหนดข้อ จำกัด คีย์ต่างประเทศเนื่องจากตารางที่สร้างไว้ก่อนหน้านี้มีจำนวนเต็มที่ไม่ได้ลงนามและไลบรารีเช่น SQLAlchemy ซึ่งเป็นไปตามมาตรฐาน SQL ไม่มีตัวเลือกในการสร้างคอลัมน์ที่ไม่ได้ลงนามเว้นแต่คุณจะเริ่มเขียนโค้ดเฉพาะของ MySQL สิ่งนี้ไม่สามารถปรับขนาดได้ (เช่นการใช้ฐานข้อมูล SQLite สำหรับการทดสอบการรวม ฯลฯ ) แม้ว่าจะยังคงใช้งานได้แน่นอน
MillerMedia


4

โดยพื้นฐานUNSIGNEDแล้วคุณจะให้ตัวเองมีช่องว่างเป็นสองเท่าสำหรับจำนวนเต็มเนื่องจากคุณระบุไว้อย่างชัดเจนว่าคุณไม่จำเป็นต้องมีจำนวนลบ (โดยปกติเนื่องจากค่าที่คุณจัดเก็บจะไม่เป็นลบ



1

ฉันไม่ได้ไม่เห็นด้วยกับ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  

0

สิ่งหนึ่งที่ผมอยากจะเพิ่มในsigned intซึ่งเป็นdefault value in mysql, จะถูกใช้ในการแสดง1 bit ดังนั้นหากแอปพลิเคชันของคุณใส่เฉพาะค่าบวกควรระบุไม่ได้ลงนามsign-1 for negative and 0 for positive.


0

หากคุณทราบประเภทของตัวเลขที่คุณจะจัดเก็บคุณสามารถเลือกได้ตามนั้น ในกรณีนี้คุณมี 'id' ซึ่งไม่มีทางเป็นลบ ดังนั้นคุณสามารถใช้ int ที่ไม่ได้ลงนาม ช่วงของ int ที่ลงนาม: -n / 2 ถึง + n / 2 ช่วงของ int ที่ไม่ได้ลงชื่อ: 0 ถึง n ดังนั้นคุณจึงมีจำนวนบวกสองเท่า เลือกตามนั้น


0

ฉันคิดว่าUNSIGNEDน่าจะเป็นตัวเลือกที่ดีที่สุดในการจัดเก็บค่าบางอย่างเช่นtime_duration(เช่น :) resolved_call_time = resolved_time(DateTime)-creation_time(DateTime)ในรูปแบบนาทีหรือชั่วโมงหรือวินาทีซึ่งแน่นอนว่าจะเป็นตัวเลขที่ไม่ติดลบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.