ความแตกต่างระหว่าง VARCHAR และ CHAR คืออะไร?


366

ความแตกต่างระหว่าง VARCHAR และ CHAR ใน MySQL คืออะไร?

ฉันกำลังพยายามเก็บแฮช MD5


15
MD5 แฮชมี 32 อักขระเสมอ ดังนั้นเพื่อประสิทธิภาพสูงสุดของคุณให้ใช้ CHAR (32) เนื่องจาก CHAR นั้นมีความยาวคงที่ (ดูคำตอบด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง CHAR และ VARCHAR)
— Augustin

คำตอบ:


361

VARCHAR มีความยาวผันแปรได้

CHAR ความยาวคงที่คือ

CHARถ้าเนื้อหาของคุณมีขนาดคงที่คุณจะได้รับประสิทธิภาพที่ดีขึ้นด้วย

ดูหน้า MySQL บนCHAR และ VARCHAR Typesสำหรับคำอธิบายโดยละเอียด (โปรดอ่านความคิดเห็นด้วย)


51
@steven: เมื่ออานนท์ บอกว่า "เนื้อหาของคุณมีขนาดคงที่" หมายความว่าแถวของตารางของคุณต้องมีฟิลด์ขนาดคงที่ทั้งหมด คุณจะไม่ได้รับการปรับปรุงประสิทธิภาพหากคุณใช้ CHAR กับ VARCHAR ในหนึ่งฟิลด์ แต่ตารางนั้นมีฟิลด์อื่น ๆ ที่เป็น VARCHAR
— Marco Demaio

2
ประเภทข้อมูลถ่านไม่มีการเพิ่มประสิทธิภาพ ... ในขณะที่การดำเนินการแบบสอบถาม sql จะสร้างแผนการดำเนินการ สมมติว่ามี 2 คอลัมน์ charcol ถ่าน (2000) และ VarcharCol Varchar (2000) ในแผนการดำเนินการขนาดของแถวโดยประมาณสำหรับประเภท varchar ของคอลัมน์อาจอยู่ภายใต้การประมาณ ดังนั้นจึงนำไปสู่การรั่วไหลไปยังฐานข้อมูลอุณหภูมิ ดังนั้นการใช้ถ่านจึงดีต่อการปฏิบัติงาน
— vignesh

1
ความหมายของค่าใน paranthesis ของ VARCHAR (n) คืออะไร?
— Sivagami Nambi

@Marco Demaio คุณรู้เหตุผลเบื้องหลังนี้ไหม?
— Dehan de Croos

1
@ jdc91: เพื่อให้มีการเพิ่มประสิทธิภาพทั้งแถวจะต้องมีความกว้างคงที่ MySQL ได้ประโยชน์จากการคำนวณความต้องการพื้นที่และชดเชยแถวในประเภทของตารางนั้น
— Marco Demaio

225

CHAR

  1. ใช้ในการเก็บค่าสตริงลักษณะของความยาวคงที่
  2. จำนวนสูงสุด ของตัวละครถือชนิดข้อมูลสามารถเป็น255 ตัวอักษร
  3. มันเร็วกว่า VARCHAR 50%
  4. ใช้จัดสรรหน่วยความจำแบบคงที่

VARCHAR

  1. ใช้เพื่อเก็บข้อมูลตัวอักษรและตัวเลขความยาวตัวแปร
  2. จำนวนข้อมูลสูงสุดที่ถือได้นั้นขึ้นอยู่กับ
    • Pre-MySQL 5.0.3: 255 ตัวอักษร
    • Post-MySQL 5.0.3: 65,535 ตัวอักษรใช้ร่วมกันสำหรับแถว
  3. มันช้ากว่า CHAR
  4. ใช้จัดสรรหน่วยความจำแบบไดนามิก

3
ฉันแปลกใจเล็กน้อยที่คำตอบนี้ได้รับการอัปเดตบ่อยครั้ง สถานะเอกสาร MySQLValues in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.
— DroidOS

2
ไม่ต้องพูดถึงว่าคุณสามารถเก็บข้อมูลตัวอักษรและตัวเลขใน char ได้เช่นกัน
— ninjabber

44
สิ่งนี้เร็วขึ้น 50% จากอะไร เร็วขึ้น 50% ในการทำอะไร เงื่อนไขอะไรบ้าง และคุณหมายถึงอะไรโดยการจัดสรรหน่วยความจำแบบคงที่เทียบกับแบบไดนามิกในบริบทนี้
— Martin Smith

4
@ มาร์ตินฉันจะถามเหมือนกัน .. อย่าคิดว่าข้อมูลนั้นถูกต้อง asktom.oracle.com/pls/asktom/…
— Ozgur Bar

2
-1; ประสิทธิภาพการเรียกร้องที่นี่มีความคลุมเครือและไม่แน่นอนความแตกต่างในกลยุทธ์การจัดสรรหน่วยความจำ (และทำไมจึงมีความสำคัญ) ไม่ได้เกิดขึ้นจริง คอลัมน์ varchar สามารถจัดเก็บอักขระที่ไม่ใช่ตัวอักษรและตัวเลขได้อย่างแน่นอนเช่นกัน!
— Mark Amery

122

CHAR Vs VARCHAR

CHAR ใช้สำหรับตัวแปรขนาดความยาวคงที่
VARCHAR ใช้สำหรับตัวแปรขนาดความยาวผันแปรได้

เช่น

Create table temp
(City CHAR(10),
Street VARCHAR(10));

Insert into temp
values('Pune','Oxford');

select length(city), length(street) from temp;

ผลผลิตจะได้

length(City)          Length(street)
10                    6

สรุป: ในการใช้พื้นที่เก็บข้อมูลอย่างมีประสิทธิภาพต้องใช้ VARCHAR แทน CHAR หากความยาวของตัวแปรเป็นตัวแปร


4
เมือง = char (10), ถนน = varchar (10), เมือง = Pune, ถนน = Oxford, ความยาว (เมือง) = 4, ความยาว (ถนน) = 6
— abdulwadood

2
แบบสอบถามนี้ (เลือกความยาว (เมือง), ความยาว (ถนน) จาก temp) ให้ผลลัพธ์ต่อไปนี้ใน mysql 5.7 mysql> เลือกความยาว (เมือง), ความยาว (ถนน) จาก temp; + -------------- + ---------------- + | ความยาว (เมือง) | ความยาว (ถนน) + -------------- + ---------------- + | 4 | 6 | + -------------- + ---------------- + 1 แถวในชุด (0.00 วินาที)
— Jasbeer Rawal

69

CHAR(x)คอลัมน์สามารถมีได้เพียงว่า xตัวละคร คอลัมน์สามารถมีได้ถึง
VARCHAR(x) xตัวละคร

เนื่องจาก MD5 แฮชของคุณจะมีขนาดเท่ากันคุณจึงควรใช้ CHARของคุณจะเป็นขนาดเดียวกันคุณอาจจะใช้

อย่างไรก็ตามคุณไม่ควรใช้ MD5 ตั้งแต่แรก มันรู้จักจุดอ่อน
ใช้ SHA2 แทน
หากคุณ hashing รหัสผ่านคุณควรใช้ bcrypt


44
"คอลัมน์ CHAR (x) สามารถมีได้เฉพาะอักขระ x ตัวเท่านั้น". ที่จริงแล้วคุณสามารถเพิ่มข้อมูลที่มีน้อยกว่า x chars ได้ แต่ฉันคิดว่าคุณหมายถึงมันจะสำรองหน่วยความจำ 10 ค่าไว้เบื้องหลัง
— Dan W

13
คุณไม่รู้ว่าทำไมพวกเขาถึงจัดเก็บ md5 hashes มีเหตุผลที่ถูกต้องมากมายในการใช้ md5 ที่ไม่เกี่ยวข้องกับความปลอดภัย การชนไม่ใช่เรื่องธรรมดาเลยและอัลกอริธึมนั้นเร็วกว่าความปลอดภัยที่มากขึ้น
— John Hunt

1
สมมติว่าคอลัมน์ CHAR (x) ไม่ได้บังคับใช้อักขระ x อย่างแน่นอนมีเหตุผลอะไรที่จะใช้มันผ่าน VARCHAR (x) แม้สำหรับข้อมูลขนาดคงที่?
— NeverEndingQueue

11

ความแตกต่างระหว่าง VARCHAR และ CHAR ใน MySQL คืออะไร?

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

ฉันกำลังพยายามเก็บแฮช MD5

MD5 แฮชไม่ใช่ตัวเลือกที่ดีที่สุดถ้าเรื่องความปลอดภัยเป็นเรื่องสำคัญ อย่างไรก็ตามหากคุณจะใช้ฟังก์ชั่นแฮชใด ๆ ให้พิจารณาBINARYพิมพ์มันแทน (เช่น MD5 จะสร้างแฮช 16 ไบต์ดังนั้นBINARY(16)จะเพียงพอแทนที่จะCHAR(32)เป็นอักขระ 32 ตัวที่เป็นตัวเลขฐานสิบหกซึ่งจะช่วยประหยัดพื้นที่ได้มากขึ้นและมีประสิทธิภาพ


จากการติดตามความคิดนี้ฉันจะใช้ CHAR สำหรับรหัสธุรกิจซึ่งมีความหมายต่อการอ่านง่ายและมีประสิทธิภาพ ฉันจะยังคงใช้ปุ่มหลักใหญ่ ๆ
— Archimedes Trajano

9

Varchar ตัดช่องว่างต่อท้ายหากอักขระที่ป้อนนั้นสั้นกว่าความยาวที่ประกาศในขณะที่อักขระถ่านจะไม่แสดง Char จะปัดช่องว่างและจะเป็นความยาวของความยาวที่ประกาศไว้เสมอ ในแง่ของประสิทธิภาพ varchar มีความเชี่ยวชาญมากขึ้นเพราะมีการตัดแต่งอักขระเพื่อให้สามารถปรับได้มากขึ้น อย่างไรก็ตามหากคุณทราบความยาวที่แน่นอนของถ่านถ่านจะทำงานด้วยความเร็วมากกว่าเดิม


7

ใน RDBMS ส่วนใหญ่วันนี้พวกเขามีความหมายเหมือนกัน อย่างไรก็ตามสำหรับระบบที่ยังคงมีความแตกต่างฟิลด์ CHAR จะถูกเก็บไว้เป็นคอลัมน์ที่มีความกว้างคงที่ หากคุณกำหนดเป็น CHAR (10) จะมีการเขียนอักขระ 10 ตัวลงในตารางโดยใช้ "ช่องว่างภายใน" (โดยทั่วไปคือช่องว่าง) เพื่อเติมช่องว่างที่ข้อมูลไม่ได้ใช้ ตัวอย่างเช่นการบันทึก "bob" จะถูกบันทึกเป็น ("bob" +7 ช่องว่าง) คอลัมน์ VARCHAR (อักขระแปรผัน) มีวัตถุประสงค์เพื่อจัดเก็บข้อมูลโดยไม่สูญเสียพื้นที่พิเศษที่คอลัมน์ CHAR ทำ

และเช่นเคยWikipediaพูดดังขึ้น


5

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


ในขณะที่ฉันเดาว่าการเรียกร้องเกี่ยวกับความเร็วและประสิทธิภาพการจัดเก็บที่นี่เป็นความจริง แต่ก็ไม่ได้พิสูจน์ในทางใดทางหนึ่ง (และเป็นไปได้อย่างสมบูรณ์แบบว่ามันเป็นเท็จ) ซึ่งทำให้คำตอบนี้ไม่มีประโยชน์ เพียงแค่ทำซ้ำสิ่งที่ผู้อ่านอาจคาดหวังไว้แล้วว่าจะเป็นจริงโดยไม่ทำอะไรเลยเพื่อยืนยันอย่างแท้จริง
— Mark Amery

1

CHAR มีความยาวคงที่และ VARCHAR เป็นความยาวแปรผัน CHAR ใช้พื้นที่เก็บข้อมูลจำนวนเท่ากันต่อหนึ่งรายการเสมอในขณะที่ VARCHAR ใช้จำนวนที่จำเป็นในการจัดเก็บข้อความจริงเท่านั้น


1

char เป็นชนิดข้อมูลอักขระความยาวคงที่ varchar เป็นชนิดข้อมูลอักขระความยาวผันแปร

เนื่องจาก char เป็นชนิดข้อมูลที่มีความยาวคงที่ขนาดหน่วยเก็บของค่าถ่านเท่ากับขนาดสูงสุดสำหรับคอลัมน์นี้ เนื่องจาก varchar เป็นชนิดข้อมูลที่มีความยาวผันแปรขนาดการจัดเก็บของค่า varchar คือความยาวจริงของข้อมูลที่ป้อนไม่ใช่ขนาดสูงสุดสำหรับคอลัมน์นี้

คุณสามารถใช้ถ่านได้เมื่อคาดว่ารายการข้อมูลในคอลัมน์จะมีขนาดเท่ากัน คุณสามารถใช้ varchar เมื่อรายการข้อมูลในคอลัมน์ถูกคาดหวังให้มีขนาดแตกต่างกันมาก


0

ตามหนังสือMySQL ประสิทธิภาพสูง :

VARCHARเก็บสตริงอักขระที่มีความยาวผันแปรได้และเป็นชนิดข้อมูลสตริงที่พบมากที่สุด สามารถใช้พื้นที่เก็บข้อมูลน้อยกว่าประเภทที่มีความยาวคงที่เนื่องจากใช้พื้นที่มากเท่าที่ต้องการ (กล่าวคือใช้พื้นที่น้อยในการจัดเก็บค่าที่สั้นกว่า) ข้อยกเว้นคือตาราง MyISAM ที่สร้างด้วย ROW_FORMAT = FIXED ซึ่งใช้พื้นที่จำนวนคงที่บนดิสก์สำหรับแต่ละแถวและอาจทำให้เสียพื้นที่ VARCHAR ช่วยเพิ่ม ประสิทธิภาพเนื่องจากช่วยประหยัดพื้นที่

CHARนั้นมีความยาวคงที่: MySQL จะจัดสรรพื้นที่เพียงพอสำหรับจำนวนอักขระที่ระบุเสมอ เมื่อจัดเก็บค่า CHAR MySQL จะลบช่องว่างต่อท้าย (นี่เป็นความจริงของ VARCHAR ใน MySQL 4.1 และเวอร์ชั่นที่เก่ากว่า - CHAR และ VAR CHAR เหมือนกันในเชิงตรรกะและแตกต่างกันในรูปแบบการจัดเก็บเท่านั้น) ค่าต่างๆมีการบุด้วยช่องว่างตามที่จำเป็นสำหรับการเปรียบเทียบ


2
" VARCHAR ช่วยเพิ่มประสิทธิภาพเพราะมันช่วยประหยัดพื้นที่ " มันช่วยประหยัดพื้นที่ใช่ แต่จะไม่ส่งผลเสียต่อ performace ใช่ไหม VARCHARจำเป็นต้องจัดสรรหน่วยความจำแบบไดนามิกและเมื่อจำเป็นจึงลดประสิทธิภาพเมื่อเทียบกับCHARใช่มั้ย
— Spikatrix

@Spikatrix ขึ้นอยู่กับ หากค่า VARCHAR มักจะมีขนาดเล็ก แต่อาจสูงถึง N ไบต์การจัดสรรแบบไดนามิกสามารถประหยัดพื้นที่จำนวนมากและ I / O ซึ่งมีประสิทธิภาพมากกว่าสำหรับข้อมูลจำนวนมาก ค่า CHAR ที่มีความยาวเท่ากันจะมีประสิทธิภาพมากกว่า การอ่านกับการเขียนอาจสร้างความแตกต่าง
— Andrew

-4

Char มีความยาวคงที่ (รองรับ 2,000 ตัวอักษร) มันเป็นตัวอักษรสำหรับชนิดข้อมูล

Varchar มีความยาวผันแปรได้ (รองรับ 4000 ตัวอักษร)


-1; ตัวเลขเหล่านี้ไม่ถูกต้องสำหรับ MySQL (ฉันคิดว่าพวกเขาอาจใช้กับ Oracle?)
— Mark Amery

-5

Char หรือ varchar- มันถูกใช้เพื่อป้อนข้อมูลแบบข้อความที่สามารถระบุความยาวในวงเล็บเช่นชื่อถ่าน (20)


นี่ไม่ได้ตอบคำถามเดิม OP ขอความแตกต่างระหว่างประเภทไม่ใช่ไวยากรณ์และวัตถุประสงค์ของประเภท นอกจากนี้(และ)เป็นวงเล็บไม่ใช่วงเล็บ
— 2mac

@ 2mac ประโยคสุดท้ายของคุณเป็นจริงของภาษาอังกฤษแบบอเมริกันเท่านั้น ในสหราชอาณาจักรเราเรียก(และ)วงเล็บเหลี่ยมและชาวอังกฤษหลายคนอาจไม่รู้ด้วยซ้ำว่ามีภาษาอังกฤษถิ่นที่คำว่า "วงเล็บ" สามารถอ้างถึงเครื่องหมายวรรคตอน มีกรณีที่ดีสำหรับการเลือก "วงเล็บ" เป็น "วงเล็บเหลี่ยม" ซึ่งอาจเป็นทางเลือกที่ชัดเจนที่สุดเมื่อกำหนดเป้าหมายผู้ชมต่างประเทศของโปรแกรมเมอร์ - แต่มันเป็นกรณีที่ซับซ้อนกว่า "วงเล็บ" ผิด
— Mark Amery

-11

CHAR:

  • รองรับทั้งตัวละครและตัวเลข
  • รองรับ 2,000 ตัวอักษร
  • ความยาวคงที่

วาร์ชาร์:

  • รองรับทั้งตัวละครและตัวเลข
  • รองรับ 4000 ตัวอักษร
  • ความยาวแปรผัน

มีคำแนะนำอะไรมั้ย......!!!!

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