ฟิลด์ MySQL ทั่วไปและประเภทข้อมูลที่เหมาะสม


111

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

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

ประเภทข้อมูลใดที่เหมาะสมสำหรับช่องฐานข้อมูลทั่วไป ช่องต่างๆเช่นหมายเลขโทรศัพท์อีเมลและที่อยู่?

คำตอบ:


71

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

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

โดยทั่วไปแล้วฉันดูเหมือนจะใช้เฉพาะ:

  • INT (11) สำหรับสิ่งที่เป็น ID หรืออ้างอิง ID อื่น
  • DATETIME สำหรับการประทับเวลา
  • VARCHAR (255) สำหรับสิ่งที่รับประกันว่ามีอักขระไม่เกิน 255 ตัว (ชื่อหน้าชื่อ ฯลฯ )
  • TEXT สำหรับสิ่งอื่น ๆ

แน่นอนว่ามีข้อยกเว้น แต่ฉันพบว่ามันครอบคลุมเหตุการณ์ส่วนใหญ่


2
นอกจากนี้จำนวนเต็มยังรองรับมูลค่าได้ถึง 2 พันล้านเท่านั้น นั่นคือ 2,000,000,000 ซึ่งจริงๆแล้วมีพื้นที่ไม่เพียงพอเมื่อคุณต้องการจัดเก็บหมายเลขโทรศัพท์ระหว่างประเทศให้กรอกรหัสประเทศ ฉันไม่เห็นด้วยซ้ำว่าคุณจะหาพื้นที่เพียงพอในการจัดเก็บหมายเลขเช่น 655-405-4055 (6,554,054,055) ได้อย่างไร
Kibbee

29
แถมยังผิดแค่นั้น มีคนฉลาดกว่าฉันมากบอกฉันตอนที่ฉันเริ่มต้น (ด้วยฐานข้อมูล) เพียงเพราะบางอย่างดูเหมือนตัวเลขไม่ได้หมายความว่าเป็นหรือควรได้รับการปฏิบัติเช่นนั้น ...
da5id

14
การใช้ varchar (255) แบบสุ่มสี่สุ่มห้าเป็นความคิดที่ไม่ดี อย่างน้อยก็ใช้ความพยายามพื้นฐานในการเดาความยาว
Morgan Tocker

4
@Morgan Tocker: เป็นแนวทางปฏิบัติที่ดีที่สุดสิ่งที่ต่ำกว่า 255 ตัวอักษรจะใช้พื้นที่เท่ากัน
คลั่งไคล้

7
@Raveren: นี่เป็นเครื่องมือจัดเก็บข้อมูลเฉพาะ - และพื้นที่จัดเก็บไม่ใช่ต้นทุนเดียว การเรียงลำดับข้อมูลและตารางชั่วคราว (เครื่องมือความจำ) จะใช้จำนวนคงที่
Morgan Tocker

44

นี่คือประเภทข้อมูลทั่วไปที่ฉันใช้ (ฉันไม่ค่อยเป็นมืออาชีพ):

| Column           | Data type     | Note
| ---------------- | ------------- | -------------------------------------
| id               | INTEGER       | AUTO_INCREMENT, UNSIGNED                                                          |  
| uuid             | CHAR(36)      | or CHAR(16) binary                                                                |  
| title            | VARCHAR(255)  |                                                                                   |  
| full name        | VARCHAR(70)   |                                                                                   |  
| gender           | TINYINT       | UNSIGNED                                                                          |  
| description      | TINYTEXT      | often may not be enough, use TEXT 
                                     instead          
| post body        | TEXT          |                                                                                   |  
| email            | VARCHAR(255)  |                                                                                   |  
| url              | VARCHAR(2083) | MySQL version < 5.0.3 - use TEXT                                                  |  
| salt             | CHAR(x)       | randomly generated string, usually of 
                                     fixed length (x)    
| digest (md5)     | CHAR(32)      |                                                                                   |  
| phone number     | VARCHAR(20)   |                                                                                   |  
| US zip code      | CHAR(5)       | Use CHAR(10) if you store extended 
                                     codes      
| US/Canada p.code | CHAR(6)       |                                                                                   |  
| file path        | VARCHAR(255)  |                                                                                   |  
| 5-star rating    | DECIMAL(3,2)  | UNSIGNED                                                                          |  
| price            | DECIMAL(10,2) | UNSIGNED                                                                          |  
| date (creation)  | DATE/DATETIME | usually displayed as initial date of 
                                     a post                                       |  
| date (tracking)  | TIMESTAMP     | can be used for tracking changes in a 
                                     post                                        |  
| tags, categories | TINYTEXT      | comma separated values *                                                          |  
| status           | TINYINT(1)    | 1  published, 0  unpublished,  You 
                                     can also use ENUM for human-readable 
                                     values
| json data        | JSON          | or LONGTEXT       

4
@yentsun - อีเมลมีเพียง 254 เท่านั้น อ่านความคิดเห็นของคำถามที่ Neil McGuigan โพสต์
RustyTheBoyRobot

16

จากประสบการณ์ของฉันช่องชื่อ / นามสกุลควรมีอย่างน้อย 48 ตัวอักษร - มีชื่อจากบางประเทศเช่นมาเลเซียหรืออินเดียที่มีความยาวมากในรูปแบบเต็ม

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

ใน MySQL คุณสามารถใช้ฟิลด์ VARCHAR สำหรับข้อมูลประเภทนี้ แม้ว่าจะฟังดูน่าเกียจ แต่ก็หมายความว่าคุณไม่จำเป็นต้องกังวลเกี่ยวกับขนาดขั้นต่ำที่เหมาะสมมากเกินไป


เพื่อสนับสนุนความคิดเห็นของคุณเพิ่มเติมเกี่ยวกับรหัสไปรษณีย์ในประเทศต่างๆเช่นสหราชอาณาจักรหรือแคนาดารหัสไปรษณีย์จะเป็นตัวเลขและตัวอักษร
Andy Baird

คุณอาจต้องกังวลเกี่ยวกับขนาดต่ำสุดที่เหมาะสมstackoverflow.com/questions/262238/…
Rohit Banga

@iamrohitbanga ในขณะที่คุณถูกต้องสำหรับข้อมูลที่กำหนดไว้อย่างดีสำหรับชื่อที่VARCHAR(255)เหมาะสม
สถิติ

9

เนื่องจากคุณจะต้องจัดการกับข้อมูลที่มีความยาวผันแปร (ชื่อที่อยู่อีเมล) ดังนั้นคุณจึงต้องการใช้ VARCHAR จำนวนพื้นที่ที่ใช้ในฟิลด์ VARCHAR คือ[field length]+ 1 ไบต์สูงสุดความยาว 255 ดังนั้นฉันจะไม่กังวลมากเกินไปกับการพยายามหาขนาดที่สมบูรณ์แบบ ลองดูสิ่งที่คุณคิดว่าอาจมีความยาวที่ยาวที่สุดจากนั้นเพิ่มเป็นสองเท่าและตั้งค่าเป็นขีด จำกัด VARCHAR ของคุณ ที่กล่าวว่า ... :

โดยทั่วไปฉันตั้งค่าฟิลด์อีเมลเป็น VARCHAR (100) - ฉันยังไม่พบปัญหาจากนั้น ชื่อที่ฉันตั้งเป็น VARCHAR (50)

ดังที่คนอื่น ๆ กล่าวไว้ว่าหมายเลขโทรศัพท์และรหัสไปรษณีย์ไม่ใช่ค่าตัวเลขจริงๆเป็นสตริงที่มีตัวเลข 0-9 (และบางครั้งก็มากกว่านั้น!) ดังนั้นคุณควรถือว่าเป็นสตริง VARCHAR (20) ควรเพียงพอ

โปรดทราบว่าหากคุณจะจัดเก็บหมายเลขโทรศัพท์เป็นจำนวนเต็มระบบต่างๆจะถือว่าตัวเลขที่ขึ้นต้นด้วย 0 เป็นเลขฐานแปด (ฐาน 8)! ดังนั้นหมายเลขโทรศัพท์ "0731602412" ที่ถูกต้องจะถูกใส่ลงในฐานข้อมูลของคุณเป็นเลขฐานสิบ "124192010" !!


1

ฉันกำลังทำสิ่งเดียวกันและนี่คือสิ่งที่ฉันทำ

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

คอลัมน์ NameID กลายเป็น smallint ในทุกตารางเพราะฉันค่อนข้างมั่นใจว่าจะไม่สร้างมากกว่า 32000 รายการ เกือบทุกอย่างเป็น varchar (n) ตั้งแต่ 20 ถึง 200 ขึ้นอยู่กับสิ่งที่คุณต้องการจัดเก็บ (วันเกิดความคิดเห็นอีเมลชื่อยาว ๆ ) ขึ้นอยู่กับประเภทของสิ่งที่คุณจัดเก็บ

ตาราง Numbers คือจุดที่ฉันเบี่ยงเบนไปจากนั้น ฉันตั้งค่าให้มีห้าคอลัมน์ชื่อ NameID, Phone #, CountryCode, Extension และ PhoneType ฉันพูดถึง NameID แล้ว Phone # คือ varchar (12) โดยมีข้อ จำกัด ในการตรวจสอบดังนี้: CHECK (Phone # like '[0-9] [0-9] [0-9] - [0-9] [0-9] [0 -9] - [0-9] [0-9] [0-9] [0-9] ') สิ่งนี้ช่วยให้มั่นใจได้ว่ามีเพียงสิ่งที่ฉันต้องการเท่านั้นที่ทำให้เข้าสู่ฐานข้อมูลและข้อมูลยังคงสอดคล้องกันมาก ส่วนขยายและรหัสประเทศที่ฉันเรียกว่า smallints ที่เป็นโมฆะ แต่อาจเป็น varchar ถ้าคุณต้องการ PhoneType คือ varchar (20) และไม่เป็นโมฆะ

หวังว่านี่จะช่วยได้!

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