ความแตกต่างระหว่าง 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.