ประเภทฟิลด์ฐานข้อมูลที่ดีที่สุดสำหรับ URL


352

ฉันต้องการเก็บ url ในตาราง MySQL การปฏิบัติที่ดีที่สุดสำหรับการกำหนดเขตข้อมูลที่จะเก็บ URL ด้วยความยาวที่ไม่ระบุคืออะไร


1
มันขึ้นอยู่กับสิ่งที่คุณต้องการการจัดทำดัชนีความสามัคคี?
โทมัส Decaux

2
ฉันคาดหวังคำตอบที่ตรงไปตรงมาพอสมควร แต่ที่นี่ก็ค่อนข้างแปลกใจที่คำตอบนั้นครอบคลุมรายการที่ฉันไม่ได้พิจารณา การอ่านที่น่าสนใจมากที่ฉันเพิ่มลงในบัญชีการศึกษาของฉัน
HPWD

1
เพียงไปกับTEXTประเภทและข้ามอ่านคำตอบเหล่านี้ด้านล่าง ในท้ายที่สุดนั่นคือสิ่งที่พวกเขาส่วนใหญ่แนะนำ :) แน่นอนถ้าคุณจำเป็นต้องมีการจัดทำดัชนีหรือเอกลักษณ์ไปVARCHARเนื่องจากTEXTไม่สามารถจัดทำดัชนีที่ได้อย่างง่ายดาย
Aleksandar

คำตอบ:


324
  1. ความยาวสูงสุดของตัวหารร่วมที่ต่ำที่สุดในบรรดาเว็บเบราว์เซอร์ยอดนิยม: 2,083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    ค่าในคอลัมน์ VARCHAR เป็นสตริงที่มีความยาวผันแปรได้ ความยาวสามารถระบุเป็นค่าตั้งแต่ 0 ถึง 255 ก่อน MySQL 5.0.3 และ 0 ถึง 65,535 ใน 5.0.3 และรุ่นที่ใหม่กว่า ความยาวสูงสุดที่มีประสิทธิภาพของ VARCHAR ใน MySQL 5.0.3 และใหม่กว่านั้นขึ้นอยู่กับขนาดแถวสูงสุด (65,535 ไบต์ซึ่งแบ่งใช้ระหว่างคอลัมน์ทั้งหมด) และชุดอักขระที่ใช้

  3. ดังนั้น ...
    <MySQL 5.0.3 ใช้TEXT
    หรือ
    > = MySQL 5.0.3 ใช้VARCHAR (2083)


14
คำตอบที่ดี แต่ส่วนตัวฉันจะจำกัดความยาว ขึ้นอยู่กับโครงการที่คุณอาจต้องการ จำกัด URL ที่ยอมรับ ใครใช้ url longet มากกว่า 200
จอห์น

2
พวกเขาควรหาประเภทของ uri ที่ "เข้าใจ" โครงสร้างของ uri เพื่อให้การจัดทำดัชนีและการค้นหาทำได้อย่างมีประสิทธิภาพเช่น oracle ได้ทำ ... รอ, mysql เป็นตอนนี้ของ oracle ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 / …
redben

80
คำตอบนี้ทำให้เข้าใจผิดเล็กน้อย โปรดทราบว่า "ตัวหารร่วมที่ต่ำที่สุด" ที่นี่ไม่มีความหมายคุณต้องการใช้จำนวนสูงสุดที่เบราว์เซอร์หรือเซิร์ฟเวอร์จะยอมรับ (ซึ่งไม่สอดคล้องกันและอาจเปลี่ยนแปลงได้) ในฐานะที่เป็นลิงค์ของคุณบอกว่า: " ... คุณสมบัติของโปรโตคอล HTTP ไม่ได้ระบุความยาวสูงสุดใด ๆ ... " จึงไม่รำคาญกับที่เพียงแค่การใช้งานVARCHAR(2083) TEXT
Wesley Murch

4
ตัวอย่างเช่นจากลิงก์ของคุณ: " หลังจาก 65,536 ตัวอักษรแถบที่ตั้งจะไม่แสดง URL ใน Windows Firefox 1.5.x อีกต่อไปอย่างไรก็ตาม URL จะใช้งานได้อีกต่อไปฉันหยุดการทดสอบหลังจาก 100,000 ตัว "
Wesley Murch

1
ทรัพยากร boutell.com หลุดออกจากเน็ต นี่คือข้อมูลอ้างอิงในหนังสือ O'Reilly ที่สแกน: books.google.ca/…
micahwittman

33

VARCHAR(512)(หรือคล้ายกัน) ควรจะเพียงพอ แต่เนื่องจากคุณไม่ทราบจริงๆความยาวสูงสุดของ URL TEXTในคำถามที่ผมอาจจะเพียงแค่ไปโดยตรงไปยัง อันตรายของสิ่งนี้คือการสูญเสียประสิทธิภาพเนื่องจากCLOBการช้ากว่าประเภทข้อมูลสตริงแบบVARCHARธรรมดา


สิ่งที่เกี่ยวกับการเปรียบเทียบ?
kommradHomer

16

varchar(max) สำหรับ SQLServer2005

varchar(65535) สำหรับ MySQL 5.0.3 และใหม่กว่า

สิ่งนี้จะจัดสรรพื้นที่เก็บข้อมูลตามต้องการและไม่ควรส่งผลกระทบต่อประสิทธิภาพ


1
ในข้อมูลโค้ดของคุณmaxMagic specs ANSI SQL คือการขยายขนาด VARCHAR ตามความจำเป็นหรือเป็นเพียง meta-variable เพื่อเป็นตัวอย่าง?
Daniel Spiewak

4
ใน MySQL คุณมักจะไม่มี varchar ขนาดใหญ่เว้นแต่ว่าเป็นคอลัมน์เดียวในตาราง
carson

1
@Daniel Spiewak: "ความแตกต่างพื้นฐานระหว่าง TEXT และ VARCHAR (MAX) คือประเภท TEXT จะเก็บข้อมูลใน blob เสมอในขณะที่ประเภท VARCHAR (MAX) จะพยายามเก็บข้อมูลโดยตรงในแถวเว้นแต่ว่าจะเกิน 8k ข้อ จำกัด และ ณ จุดนั้นมันเก็บไว้ในหยด " stackoverflow.com/questions/834788/… แต่คำถามนั้นเกี่ยวกับ MySQL ดังนั้นมันจึงไม่เกี่ยวข้องกันที่นี่
Stijn Bollen

9

คุณจะต้องเลือกระหว่างคอลัมน์ TEXT หรือ VARCHAR ตามความถี่ที่จะใช้ URLและไม่ว่าคุณต้องการความยาวจริงหรือไม่

ใช้VARCHARพร้อม maxlength> = 2,083ตามที่micahwittmanแนะนำถ้า:

  1. คุณจะใช้ URL ต่อข้อความค้นหาจำนวนมาก (ไม่เหมือนกับคอลัมน์ TEXT VARCHARs จะถูกจัดเก็บไว้ในแถวเดียวกับแถว)
  2. คุณค่อนข้างแน่ใจว่า URL จะไม่เกินขีด จำกัด แถว 65,535 ไบต์

ใช้TEXTถ้า:

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

9

คุณควรใช้ VARCHAR ด้วยการเข้ารหัสอักขระ ASCII URL ถูกเข้ารหัสเป็นเปอร์เซ็นต์และชื่อโดเมนสากลใช้ Punycode ดังนั้น ASCII ก็เพียงพอที่จะเก็บไว้ สิ่งนี้จะใช้พื้นที่น้อยกว่า UTF8 มาก

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

5
UTF-8 ไม่ใช้พื้นที่มากกว่าหรือเปล่า
kommradHomer

7

นี้ขึ้นอยู่กับกรณีการใช้งานของคุณ (ดูด้านล่าง) แต่การจัดเก็บเช่นเดียวกับTEXTปัญหาด้านประสิทธิภาพและVARCHARเสียงที่ฟังดูเกินขนาดสำหรับกรณีส่วนใหญ่

วิธีการของฉัน:ใช้ใจกว้าง แต่ไม่ใหญ่มากเกินไปVARCHARความยาวเช่นVARCHAR(500)หรือดังนั้นและสนับสนุนให้ผู้ใช้ที่ต้องการ URL ที่มีขนาดใหญ่จะใช้ URL safe.mnให้สั้นลงเช่น

วิธี Twitter:สำหรับ UX ที่ดีจริงๆให้ใช้ตัวย่อ URL แบบอัตโนมัติสำหรับ URL ที่ยาวเกินไปและจัดเก็บ "display display" ของลิงค์เป็นส่วนย่อยของ URL ที่มีจุดไข่ปลาอยู่ท้ายสุด (ตัวอย่าง: http://stackoverflow.com/q/219569/1235702จะแสดงเป็นstackoverflow.com/q/21956...และจะเชื่อมโยงไปยัง URL ย่อhttp://ex.ampl/e1234)

หมายเหตุและคำเตือน

  • เห็นได้ชัดว่าวิธีการ Twitter นั้นดีกว่า แต่สำหรับความต้องการของแอปของฉันการแนะนำให้ใช้ตัวย่อ URL ก็เพียงพอแล้ว
  • ตัวย่อ URL มีข้อบกพร่องเช่นความกังวลด้านความปลอดภัย ในกรณีของฉันมันไม่ได้มีความเสี่ยงมากเพราะ URL นั้นไม่ได้เป็นสาธารณะและไม่ได้ใช้งานอย่างหนัก อย่างไรก็ตามสิ่งนี้ไม่ได้ผลสำหรับทุกคน safe.mn ดูเหมือนจะบล็อกสแปมและ URL ฟิชชิงจำนวนมาก แต่ฉันจะยังคงแนะนำอย่างระมัดระวัง
  • โปรดทราบว่าคุณไม่ควรบังคับให้ผู้ใช้ของคุณใช้ตัวย่อ URL สำหรับกรณีส่วนใหญ่ (อย่างน้อยสำหรับความต้องการของแอปของฉัน) 500 ตัวอักษรนั้นเพียงพอสำหรับสิ่งที่ผู้ใช้ส่วนใหญ่จะใช้ ใช้ / แนะนำ URL ให้สั้นลงสำหรับลิงก์ที่ยาวเกินไป

10
หากคุณกำลังจัดทำ shortener url ในตัวคุณจะไม่จำเป็นต้องจัดเก็บ url แบบเต็มความยาวไว้ในฐานข้อมูลเพื่อให้ทำงานได้หรือไม่ :-)
Neil Neyman

2
แน่นอน; แต่ฉันสงสัยว่าคนส่วนใหญ่จะเขียนย่อของตัวเอง ตั้งแต่เขียนสิ่งนี้ฉันได้เรียนรู้ว่ามี URL ที่ทำให้ API สั้นลงจำนวนมาก (71 มีรายการอยู่ที่นี่: programmableweb.com/news/… ) ดังนั้นคุณสามารถทำให้กระบวนการโดยอัตโนมัติโดยไม่ต้องเขียนเอง มันยังคงขึ้นอยู่กับความรู้และความยินยอมของผู้ใช้แน่นอน
brokethebuildagain

4

เบราว์เซอร์ส่วนใหญ่จะให้คุณใส่ข้อมูลจำนวนมากใน URLและสิ่งต่าง ๆ มากมายจบลงด้วยการสร้าง URL ที่มีขนาดใหญ่มากดังนั้นหากคุณกำลังพูดถึงอะไรมากกว่าส่วนโดเมนของ URL คุณจะต้องใช้คอลัมน์ TEXT ตั้งแต่VARCHAR / CHAR จะถูก จำกัด


3

ผมไม่ทราบว่าเกี่ยวกับเบราว์เซอร์อื่น ๆ แต่IE7 มีขีด จำกัด 2,083 ตัวอักษรสำหรับการดำเนินงาน นอกจากเบราว์เซอร์อื่น ๆ ที่มีขีด จำกัด ต่ำกว่าฉันไม่เห็นสาเหตุที่คุณต้องการตัวละครมากกว่า 2083 ตัว


1

เว็บเซิร์ฟเวอร์ส่วนใหญ่มีการจำกัดความยาวของ URL (ซึ่งเป็นสาเหตุที่มีรหัสข้อผิดพลาดสำหรับ "URI ยาวเกินไป") ซึ่งหมายความว่ามีขนาดที่สูงขึ้นจริง ค้นหาขีดจำกัดความยาวเริ่มต้นสำหรับเว็บเซิร์ฟเวอร์ยอดนิยมและใช้ขนาดที่ใหญ่ที่สุดเป็นขนาดสูงสุดของฟิลด์ มันควรจะมากเกินพอ


1

คุณใช้ดีกว่าvarchar (สูงสุด)ซึ่ง (ในแง่ของขนาด) varchar (65535)หมายถึง สิ่งนี้จะเก็บที่อยู่เว็บที่ใหญ่กว่าของคุณและจะประหยัดพื้นที่ของคุณเช่นกัน

ตัวระบุสูงสุดขยายความสามารถในการเก็บข้อมูลของชนิดข้อมูล varchar, nvarchar และ varbinary varchar (สูงสุด), nvarchar (สูงสุด) และ varbinary (สูงสุด) เรียกรวมกันว่าชนิดข้อมูลขนาดใหญ่ คุณสามารถใช้ชนิดข้อมูลขนาดใหญ่เพื่อเก็บข้อมูลได้สูงสุด 2 ^ 31-1 ไบต์

ดูบทความนี้เกี่ยวกับ TechNet เกี่ยวกับการใช้ชนิดข้อมูลขนาดใหญ่


varchar (max)เป็นไวยากรณ์ของ SQLServer ไม่เหมาะสำหรับ MySQL (เหมือนในคำถามเดิม) ยิ่งไปกว่านั้นมันไม่ได้หมายความว่าvarchar (65535)ตั้งแต่ 65535 เป็นจำนวนสูงสุดของ ASCII chars ในหนึ่งแถวใน mysql ดังนั้นมันจึงขึ้นอยู่กับฟิลด์อื่น ๆ และในชุดอักขระ
furins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.