ประเภทข้อมูลสำหรับหมายเลขโทรศัพท์: VARCHAR, INT หรือ BIGINT หรือไม่


12

ดังนั้นนี่จะเป็นคำถามจำลองของปี แต่ฉันต้องถามเนื่องจากไม่ใช่ครั้งแรกที่ฉันผ่านสิ่งนี้ ดูคำจำกัดความของตารางต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ลองดูที่คอลัมน์from_numberซึ่งเป็นVARCHAR(45)ตอนนี้ แต่มันจะถือหมายเลขโทรศัพท์ เนื่องจากฉันไม่ทราบว่ามีกี่หมายเลขโทรศัพท์ที่สามารถมีได้ทั่วโลกดังนั้นฉันจึงพยายามครอบคลุมเกือบทั้งหมด ฉันต้องการให้สมบูรณ์ของฐานข้อมูลมากที่สุดเท่าที่เป็นไปได้ดังนั้นฉันคิดว่าVARCHARไม่ได้เป็นประเภทที่เหมาะสมสำหรับการถือชนิดของข้อมูลนี้ - บางทีฉันกำลังผิดคุณบอกฉัน - ดังนั้นฉันคิดในการเปลี่ยนแปลงหรือแม้กระทั่งINTBIGINT

เมื่อฉันกำหนดคอลัมน์ใน Workbench ฉันควรระบุจำนวนระหว่างวงเล็บ()ไม่ใช่ทุกกรณี แต่ในรายการที่ฉันพูดถึงก่อนหน้านี้ฉันต้องทำ ดังนั้นถ้าฉันทำสิ่งนี้: BIGINT()ฉันได้รับข้อผิดพลาดนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ซึ่งให้คำแนะนำฉันไปอ่านเล็กน้อยเกี่ยวกับประเภท MySQL นี้ที่นี่ โดยทั่วไปข้อมูลนี้คือ:

จำนวนเต็มขนาดใหญ่ ... ช่วงที่ไม่ได้ลงชื่อคือ 0 ถึง 18446744073709551615

ซึ่งทำให้ฉันถาม: สิ่งที่ฉันควรตั้งค่าสำหรับวงเล็บเมื่อฉันกำหนดBIGINT()ประเภท (ฉันใช้ BIGINT เพราะฉันไม่ทราบว่า INT สามารถถือตัวเลขได้มากเท่าที่โทรศัพท์มี - บางทีฉันก็ผิดด้วย) วิธีใดที่เหมาะสมในการสร้าง | ออกแบบคอลัมน์ในฐานข้อมูล MariaDB / MySQL

อย่างไรก็ตามฉันต้องการทราบความคิดเห็นประสบการณ์และแน่นอนฉันต้องการคำตอบ

หมายเหตุ:ฉันใช้ MySQL Workbench รุ่นล่าสุดเพื่อสร้างไดอะแกรม ER ฉันใช้ MariaDB 10.0.x ด้วย


คำตอบ:


13

คุณจะจัดการหมายเลขโทรศัพท์ที่มีส่วนขยายเช่น "+ 1-000-000-0000 ต่อ 1234" ได้อย่างไร

หมายเหตุ "+" หมายถึงควรใช้กฎการโทรระหว่างประเทศ ดังนั้นจากอเมริกาเหนือระบบจะรู้จัก "011" โดยอัตโนมัติต่อหน้าการโทรระหว่างประเทศ ฯลฯ

นอกจากนี้หมายเลขโทรศัพท์เช่น "1-800-DBA-HELP" คืออะไร

ฉันมักจะเก็บหมายเลขโทรศัพท์เป็นข้อความ ต้องบอกว่ามันขึ้นอยู่กับความสำคัญของคอลัมน์หมายเลขโทรศัพท์ของคุณ หากคุณกำลังเรียกเลขหมายอัตโนมัติจากคอลัมน์นั้นคุณจะต้องตรวจสอบให้แน่ใจว่ามีเฉพาะหมายเลขเท่านั้นและข้อมูลจะแสดงหมายเลขโทรศัพท์ที่มีรูปแบบถูกต้อง

คุณสามารถมีคอลัมน์แยกต่างหากสำหรับส่วนขยายและหมายเลขโทรศัพท์ที่มีข้อความเช่นตัวอย่าง "1-800-DBA-HELP" ที่ฉันให้ไว้


ใช่พวกเขาจะมีความสำคัญดังนั้นฉันจะไม่ทำผิดพลาดใด ๆ ในอนาคตขึ้นอยู่กับว่าฉันจะอนุญาตตัวเลขเท่านั้นข้อเสนอแนะของคุณคืออะไร? เป็นเรื่องง่ายที่จะเพิ่มคอลัมน์ใหม่ที่มีหมายเลขส่วนขยายหรือฉันต้องการให้คนใส่ตัวเลข1-800-DBA-HELPตามตัวเลข
ReynierPM

มันขึ้นอยู่กับความต้องการของคุณ หากคุณต้องการรักษาความเป็นมนุษย์ฉันจะต้องเก็บหมายเลขข้อความไว้ที่ใดที่หนึ่งซึ่งอาจอยู่ในฟิลด์ข้อความ ถ้าคุณไม่สนใจส่วนของข้อความอย่าเก็บไว้
Max Vernon

1
INT นั้นไม่ใหญ่พอหากคุณเก็บหมายเลขเต็มไว้ด้วยรหัสประเทศ BIGINT น่าจะใหญ่พอ
Max Vernon

1
ฉันต้องการอย่างน้อย 20 หลัก
Max Vernon

1
ด้วย MariaDB คุณสามารถใช้ฟิลด์คำนวณเพื่อแยกตัวเลขสำหรับตัวหมุนอัตโนมัติ อาจจะอยู่ใน MySQL 5.7 (ไม่แน่ใจ)
Vérace

2

ก่อนหน้านี้มันถูกเขียน:

"ด้วย MariaDB คุณสามารถใช้computedเขตข้อมูลเพื่อดึงเฉพาะตัวเลขสำหรับตัวเรียกเลขหมายอัตโนมัตินอกจากนี้ยังใช้กับ MySQL 5.7 ได้ด้วย"

เพื่อตอบคำถามของ OP เกี่ยวกับเรื่องนี้ ("คุณสามารถอธิบายได้บ้างคุณกำลังบอกอะไรฉันบ้าง?") นี่คือคำอธิบาย

ระบบฐานข้อมูลจำนวนมากได้เปิดตัวคุณลักษณะนี้แล้ว เหล่านี้คือฟิลด์ที่รู้จักกันหลากหลายว่า " computed", " virtual" หรือ " generated" ซึ่งได้มาจากค่าในฟิลด์อื่น พลังของคุณสมบัตินี้จะแตกต่างกันไปขึ้นอยู่กับ RDBMS ของคุณ ฉันรู้ว่า Oracle, Firebird, MariaDB และตอนนี้ MySQL 5.7 มีพวกเขา คนอื่นอาจทำเช่นกัน

ตัวอย่างง่ายๆคือการมีคอลัมน์นามสกุลและมีคอลัมน์ที่คำนวณซึ่ง "เก็บ" (จำได้ว่าพวกเขาสามารถเป็นเสมือน - เช่นคำนวณได้ทันทีหรือพวกเขาสามารถเก็บไว้ในดิสก์) นามสกุลเป็นเมืองหลวงทั้งหมดจึงทำให้ ค้นหาง่ายขึ้น ด้วยวิธีนี้คุณเพียงแค่ค้นหาCAP(ใช้พูดLIKE) โดยรู้ว่าข้อมูลที่ค้นหาใน [ computed| virtual| generated] ฟิลด์เป็นข้อความตัวพิมพ์ใหญ่

แนวคิดสำหรับ MySQL 5.7 จะมีการอธิบายที่นี่และที่นี่ จะได้รับใน MariaDB สำหรับบิตอีกต่อไปและแนวคิดนี้ยังจะมีการอธิบายที่นี่ มีการแนะนำการใช้งานที่เป็นไปได้บางอย่างที่นี่แต่คุณถูก จำกัด ด้วยจินตนาการของคุณเท่านั้น พวกมันถูกมองว่าเป็นสิ่งที่สะดวก (และลดข้อผิดพลาดได้ง่าย) แทนทริกเกอร์

สำหรับกรณีการใช้งานเฉพาะของคุณคุณสามารถรับหมายเลขที่สามารถหมุนได้จากช่องข้อความ "+" -> "00" (หรือรหัสการโทรระหว่างประเทศของคุณ) แค่ความคิด


เยี่ยมมากคุณสามารถปรับปรุงคำถามของคุณเล็กน้อยได้โดยเพิ่มข้อความค้นหา ฉันหมายถึงฉันได้รับแนวคิด แต่ฉันไม่แน่ใจว่าจะสร้างvirtualหรือgeneratedค่าได้อย่างไร ฉันกำลังใช้งานCONCATหรืออย่างอื่น แต่ไม่แน่ใจเลย นอกจากนี้คุณพูดถึงการค้นหาโดยCAPSใช้LIKEคุณสามารถใส่ตัวอย่างของสิ่งนี้ด้วยหรือไม่ สิ่งที่เกี่ยวกับประสิทธิภาพของคอลัมน์ที่คำนวณได้ทันที ( virtual) vs persisted (สร้างแล้ว)?
ReynierPM

1

อืมมม หมายเลขโทรศัพท์ทำจากตัวเลข การใช้ varchar ช่วยให้ผู้ใช้จัดเก็บการจัดรูปแบบใด ๆ ด้วย (หรือไม่ด้วย - หรือ. และมันจะสร้างความยุ่งเหยิงกับข้อมูลของคุณอย่างรวดเร็วรูปแบบ # โทรศัพท์ขึ้นอยู่กับ "ประเทศ" ขึ้นอยู่กับหน้ากากควรเชื่อมโยงกับประเทศ เป็นส่วนขยายและเป็นตัวเลือกดังนั้นจึงควรเก็บไว้ใน "ส่วนต่อขยาย" (int ยัง) สำหรับ 1-800-DBA-HELP ฉันจะแปลงมันทันทีและเก็บหมายเลขจริงถ้าคุณต้องการสิ่งเหล่านี้ หมายเลขโทรศัพท์ที่มนุษย์อ่านได้เก็บไว้ในฟิลด์ varchar แยกต่างหาก


1

ฉันมักจะเก็บหมายเลขโทรศัพท์ในข้อความที่เรียบง่าย การจัดรูปแบบและการแสดงผลปล่อยให้มันเป็นรหัสลูกค้า

ที่นี่มากกว่าคุณจะเก็บอย่างไร สิ่งที่คุณจะทำกับหมายเลขโทรศัพท์นั้นมีความสำคัญจริงๆ

หากธุรกิจของคุณต้องการโทรออกจากระบบของคุณแอปพลิเคชันจะดึงเฉพาะหมายเลข หากธุรกิจของคุณต้องการโทรระหว่างประเทศให้จัดเก็บรหัสประเทศและรหัสพื้นที่ในคอลัมน์แยกต่างหาก

หากธุรกิจของคุณต้องการรายงานแอปพลิเคชันจะจัดรูปแบบและแสดงพร้อมส่วนขยายและตัวเลขแยกกัน

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

สิ่งนี้อาจไม่ตอบคำถามของคุณ แต่จะช่วยขยายความเข้าใจของเรา ขอบคุณ.

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