การจัดเก็บข้อมูลข้อความล้วนใช้พื้นที่น้อยกว่าการจัดเก็บข้อความเทียบเท่าในไบนารีหรือไม่


32

ในฐานะนักพัฒนาเว็บฉันมีความเข้าใจน้อยมากเกี่ยวกับข้อมูลไบนารี

ถ้าฉันใช้ประโยค "Hello world." แปลงเป็น binary และเก็บเป็น binary ในฐานข้อมูล SQL ดูเหมือนว่า 1 และ 0 จะใช้พื้นที่มากกว่าตัวอักษร ดูเหมือนว่าฉันชอบใช้ตัวอักษรจะเหมือนกับการใช้การบีบอัดที่สัญลักษณ์หนึ่งย่อมาจากหลาย ๆ

แต่นั่นเป็นวิธีการทำงานจริงเหรอ?

การจัดเก็บข้อมูลข้อความล้วนใช้พื้นที่น้อยกว่าการจัดเก็บข้อความเทียบเท่าในไบนารีหรือไม่


126
คุณไม่ทราบว่าขั้นต่ำแน่นอนว่านักพัฒนาทุกคนต้องรู้เกี่ยวกับการเข้ารหัสตัวอักษร โชคดีที่ผู้ก่อตั้งเว็บไซต์นี้เขียนบทความให้คุณ อ่านก่อนที่คุณจะเขียนโปรแกรมอีกครั้ง joelonsoftware.com/2003/10/08/…
Eric Lippert

16
@EricLippert อ่านที่ดีและฉันดีกว่าเป็นผลขอบคุณ
john doe

4
ฉันขอแนะนำutf8everywhere.org
Basile Starynkevitch

2
การเป็นนักพัฒนาเว็บไม่ใช่ข้ออ้างที่จะไม่รู้ว่าการเข้ารหัสอักขระและข้อมูลไบนารีทำงานอย่างไร คุณจำเป็นต้องเพิ่มพูนทักษะของคุณจริงๆ ...
ต. Sar - Reinstate Monica

คำตอบ:


134

ข้อความธรรมดาเป็นไบนารี

เมื่อคุณเขียนHลงในฮาร์ดไดรฟ์หัวเขียนไม่ได้แกะสลักเส้นแนวตั้งสองเส้นและเส้นแนวนอนเข้าไปในแผ่นเสียงมันเข้ารหัสบิตแม่เหล็ก010010001ลงในแผ่นเสียง

จากนั้นควรจะเห็นได้ชัดว่าการจัดเก็บข้อมูลข้อความล้วนใช้พื้นที่จำนวนเท่ากันกับการจัดเก็บข้อมูลไบนารี

แต่ธรรมดาเป็นเพียงหนึ่งใน2รูปแบบไบนารีโดยเฉพาะอย่างยิ่ง

ข้อความธรรมดาสามารถแปลงกลับเป็นรูปแบบไบนารีอื่น ๆ การแปลงสภาพทั่วไปอย่างหนึ่งคือการบีบอัดซึ่งโดยทั่วไปแล้วจะส่งผลให้เกิดการแทนแบบกะทัดรัดมากขึ้นหมายถึงบิตที่น้อยกว่าที่ใช้เพื่อแสดงข้อมูลเดียวกัน

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

ตัวอย่างเช่นตัวเลข5และ1234567สามารถแทนด้วยข้อความธรรมดาโดยใช้อักขระตัวเลขส่งผลให้ลำดับบิตเหล่านี้บนดิสก์3 :

00110101 00000000
00110001 00110010 00110011 00110100 00110101 00110110 00110111 00000000

หรือคุณสามารถใช้ส่วนประกอบ 32 บิตสอง :

00000000 00000000 00000000 00000101
00000000 00010010 11010110 10000111

ซึ่งเป็นตัวแทนที่มีขนาดกะทัดรัดน้อยแต่เป็นตัวแทนของขนาดกะทัดรัดมากขึ้น51234567

และมีตัวแทนจำนวนอื่น ๆ ที่ไม่มีขีด จำกัด อย่างแท้จริงซึ่งจะมีระดับความกะทัดรัดและความยืดหยุ่นที่แตกต่างกันถึงแม้ว่าในทางปฏิบัติจะน้อยกว่าการใช้ตัวแทนจำนวนมากจริง ๆ


1สมมติว่า UTF-8 ลำดับที่แน่นอนของบิตสำหรับอักขระขึ้นอยู่กับการเข้ารหัสเฉพาะที่คุณใช้

2หรือจริงๆหลายรูปแบบที่กำหนดต่างๆการเข้ารหัส

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


6
ข้อแตกต่างเล็กน้อยประการหนึ่งคือการแสดง End-of-line ซึ่งใน Unix / binary ใช้หนึ่งไบต์ (LF) ในขณะที่ Windows / ข้อความใช้เวลาสองไบต์ (CR-LF)
เกล็นแรนเดอร์ส - เพอร์สัน

97
+1 สำหรับ"หัวเขียนไม่ได้แกะสลักสองเส้นแนวตั้งและเส้นแนวนอนลงในแผ่นเสียง .
Tulains Córdova

@ BaardKopperud คุณพูดถูก! ;)
Tulains Córdova

2
@BaardKopperud มี / เคยเป็นLightScribeแต่นั่นไม่ได้มีไว้สำหรับการอ่านคอมพิวเตอร์ แต่บางทีสิ่งที่ Google Goggles สามารถอ่าน LightScribe บางป้ายได้ แต่การทำเช่นนั้นในด้านการจัดเก็บข้อมูลจริงจะน่าสนใจทีเดียว ทำให้ผมนึกถึงเพลงที่มีกราฟิกแฟนซีเมื่อวิ่งผ่านสโคป
8bittree

2
@ TulainsCórdovaแม้ว่าที่จริงแล้วทัวริงเครื่องจักรทำงานด้วยตัวอักษรโดยพลการดังนั้นพวกเขาในทางทฤษฎีสามารถเขียนจดหมายลงบนเทป มันแค่เกิดขึ้นเราได้ตัดสินโดยใช้ตัวอักษรสองสัญลักษณ์
Gardenhead

15

ฉันพบว่ามันเป็นสิ่งที่สนุกที่จะคิดเกี่ยวกับ ไบนารีไม่ใช่ 1s และ 0s ในแบบที่คุณพูดถึง

ลองนึกภาพว่ามีปริมาณฉันบอกได้เลยว่ามันมีปริมาณเท่าไรในหลาย ๆ วิธี:

  • Nine เป็นภาษาอังกฤษ
  • Neuf ในฝรั่งเศส
  • 9 เป็นเลขอารบิค
  • IX เป็นเลขโรมัน
  • 1001 ในไบนารีด้วยเลขอารบิค
  • on off off on ในแบบไบนารีพร้อมเปิด / ปิด
  • high low low high ใน Binary ที่แสดงด้วยแรงดันไฟฟ้าหรือระดับหรือระดับน้ำหรือค่าไฟฟ้า ... หรือคำภาษาอังกฤษ 'สูง' และ 'ต่ำ'

พวกเขาล้วนเป็นตัวแทนของสิ่งเดียวกัน จุดนี่คือไบนารีไม่ใช่ 1 และ 0 นั่นเป็นวิธีเดียวในการแทนค่า

เมื่อคุณพูดถึงการแปลง H เป็นไบนารี่คุณอาจจินตนาการว่าเห็น 10101010 บนหน้าจอ - แต่นั่นไม่ใช่ "ไบนารี่" นั่นคือตัวเลขหนึ่งหลักสำหรับแต่ละบิตบิท

ใช่ถ้าคุณแปลงHเป็น "binary" ตามปกติแล้วผู้คนจะพูดถึงมันและแสดงว่าเป็นเลขอารบิกแล้วเก็บไว้มันจะใช้พื้นที่มากขึ้นในลักษณะเดียวกับที่แปลงHเป็นaitchพื้นที่มากขึ้น

แต่คุณจะเห็นว่าไบนารี่เป็นวิธีหนึ่งในการแสดงปริมาณโดยตรรกะนั้นบอกว่า "ถ้าฉันแปลง H เป็นไบนารี่และแทนมันhigh low high low high low high lowก็จะใช้เวลา 35 ตัวอักษร! นั่นยิ่งมากกว่า10101010! แต่ทั้งสองนี้เป็นทั้งไบนารี .. ดังนั้นวิธีหนึ่งที่ใหญ่กว่าอีกหรือไม่

ด้านอื่น ๆ ของนี้คือการสงสัยว่าHจะถูกเก็บไว้โดยคอมพิวเตอร์และจะเห็นว่าHตัวเองเป็นเพียงวิธีการที่เป็นตัวแทนของปริมาณที่ - ปริมาณเดียวกัน72, 01001000หรือseventy twoหรือ ASCII Hรหัสอักขระ ซึ่งเป็นคำตอบของ 8bittree ว่าข้อความธรรมดาเป็นไบนารี แต่นี่คือฉันพยายามที่จะแสดงสิ่งที่หมายถึง

ดังนั้นคุณได้รูปแบบบิตในคอมพิวเตอร์01001000และมันหมายความว่าอย่างไร อะไรก็ได้ - สามารถพูดคุยเป็นตัวเลขได้ในฐานะที่เป็นส่วนหนึ่งของไฟล์ zip ในฐานะตัวละครขึ้นอยู่กับความตั้งใจของคนที่สร้างมันขึ้นมา ถ้าคุณรู้ว่ามันควรจะเป็นข้อความธรรมดามันมาจากการเข้ารหัสตัวอักษรH-> 01001000และคุณค้นหามันในแบบอื่นในตารางการเข้ารหัสตัวอักษร - ASCII, UTF-8, shift-jis ฯลฯ และค้นหาแบบอักษรที่ถูกต้อง ตัวละครและออกมาHหรืออะไรก็ตาม หรือออกมาเป็นตัวละครที่ไม่ถูกต้องหากคุณใช้การค้นหาการเข้ารหัสที่แตกต่างจากคนที่สร้างมันขึ้นมา นี่คือลิงก์ของ @Eric Lippert

แต่เมื่อฉันเขียนสิ่งนี้และอย่างที่คุณคิดก็Hคือหนึ่งไบต์และ010010008 ไบต์ใช่นั่นคือพื้นที่มากขึ้น และใช่มันเป็นเลขฐานสอง (แทนค่า) แต่มันอยู่ในระดับที่สูงกว่านามธรรมที่คอมพิวเตอร์ใช้ - ไบนารีแสดงเป็นตัวอักษร ASCII ซึ่งตัวละครแต่ละตัวจะถูกนำเสนอเบื้องหลังฉากที่มีรูปแบบไบนารีบิตโดยแต่ละตัวมีขนาดใหญ่เท่ากับตัวHเดียว


12

การจัดเก็บข้อมูลข้อความล้วนใช้พื้นที่น้อยกว่าการจัดเก็บข้อความเทียบเท่าในไบนารีหรือไม่

ไม่ไม่เคย.

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

ดูเหมือนว่าฉันชอบใช้ตัวอักษรจะเหมือนกับการใช้การบีบอัดที่สัญลักษณ์หนึ่งย่อมาจากหลาย ๆ

นั่นเป็นเรื่องจริง ตัวละครตัวหนึ่งจะเป็นตัวแทนของมากกว่าหนึ่งบิต ปัญหาคือพวกมันต่างขนาดกัน ใช้เวลาเพียงหนึ่งบิตในการจัดเก็บ 1 หรือ 0 แต่ 8 บิต (หรือมากกว่า) เพื่อจัดเก็บอักขระข้อความธรรมดา คุณไม่ได้รับอะไรเลยโดยใช้ตัวละคร

หากมีสิ่งใดคุณสามารถบีบอัดสิ่งของด้วยวิธีอื่นได้ หลังจากทั้งหมด 8 บิตเป็น 256 ค่าที่เป็นไปได้ที่แตกต่างกัน แต่โดยทั่วไปข้อความล้วน จำกัด อยู่ที่ตัวอักษรตัวเลขและอักขระเครื่องหมายวรรคตอนสองสามตัว ไม่จำเป็นต้องใช้บิตมากเท่าที่ควร


3
บางทีบางครั้งอาจเป็น :-) สองกรณีที่เป็นไปได้ 1) คุณมีสตริงข้อความสั้น ๆ ที่คุณบีบอัด ไฟล์บีบอัดมีข้อมูลเมตาบางส่วนซึ่งทำให้ไฟล์บีบอัดมีขนาดใหญ่กว่าสตริงเดิม 2) คุณมีค่าทศนิยมบางส่วนบอก 1.2 การจัดเก็บเป็นข้อความจะเป็น 3 ไบต์ (4 พร้อมด้วยเทอร์มิเนเตอร์) ในขณะที่การจัดเก็บไบนารี่ดับเบิลจะใช้เวลา 8 ไบต์
jamesqf

5
คำตอบนั้นขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย 'ไบนารี' ตัวอย่างเช่น UTF-32 ใช้พื้นที่มากเท่ากับ ASCII ถึงสี่เท่าดังนั้นหาก 'ข้อความธรรมดา' คุณหมายถึง ASCII และโดย 'ไบนารี' คุณหมายถึง UTF-32 ข้อความธรรมดาจะใช้พื้นที่น้อยกว่าไบนารี แต่คุณสามารถกลับคำจำกัดความและรับผลลัพธ์ตรงกันข้าม
David Conrad

1
@DavidConrad เอ่อนั่นแค่กระโปรงบน "ไม่มีสิ่งที่เป็นข้อความธรรมดา" สิ่งที่ใกล้เคียงที่สุดที่คุณมีคือไฟล์ไบนารีที่ไม่มีเมตาดาต้า / ส่วนหัวที่ระบุประเภทและคาดเดาว่า "ต้องเป็นข้อความที่เข้ารหัสเป็น XXX!" มีเวลาเมื่อ "ไฟล์ข้อความธรรมดา" หมายถึงบางสิ่งบางอย่างที่สมเหตุสมผลในบริบทที่ จำกัด แต่มันก็ไม่ได้อีกต่อไป สิ่งที่ดีที่สุดที่คุณจะได้รับคือ "ข้อมูลทั้งหมดในไฟล์ถูกเข้ารหัสเป็นข้อความ" ตรงกันข้ามกับ "บางส่วน / ทุกส่วนของข้อมูลไม่ได้เข้ารหัสเป็นข้อความ"
Luaan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.