ความแตกต่างระหว่าง BYTE และ CHAR ในประเภทข้อมูลคอลัมน์


166

ใน Oracle ความแตกต่างระหว่าง:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

และ

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

คำตอบ:


265

ให้เราสมมติว่าชุดอักขระฐานข้อมูลคือ UTF-8 ซึ่งเป็นการตั้งค่าที่แนะนำใน Oracle เวอร์ชันล่าสุด ในกรณีนี้อักขระบางตัวใช้เวลามากกว่า 1 ไบต์ในการจัดเก็บในฐานข้อมูล

หากคุณกำหนดฟิลด์เป็นVARCHAR2(11 BYTE)Oracle สามารถใช้พื้นที่จัดเก็บได้สูงสุด 11 ไบต์ แต่จริงๆแล้วคุณอาจไม่สามารถเก็บอักขระได้ 11 ตัวในฟิลด์เนื่องจากบางอันใช้พื้นที่มากกว่าหนึ่งไบต์ในการจัดเก็บเช่นอักขระที่ไม่ใช่ภาษาอังกฤษ

โดยการกำหนดฟิลด์ตามที่VARCHAR2(11 CHAR)คุณบอก Oracle สามารถใช้พื้นที่เพียงพอในการจัดเก็บอักขระ 11 ตัวไม่ว่าจะใช้กี่ไบต์ในการจัดเก็บแต่ละตัว อักขระหนึ่งตัวอาจต้องการได้ถึง 4 ไบต์


55
โปรดทราบว่าความหมายยาวตัวอักษรไม่ได้ส่งผลกระทบต่อความยาวสูงสุด 4000 VARCHAR2ไบต์สำหรับ การประกาศ a VARCHAR2(4000 CHAR)จะอนุญาตให้มีอักขระน้อยกว่า 4,000 ตัวหากอักขระบางตัวต้องการพื้นที่เก็บข้อมูลหลายไบต์
Justin Cave

@ David Sykes ความหมายนี้เหมือนกันกับ NVARCHAR (11) หรือไม่
Nap

@ แนปไม่ไกลเท่าที่ฉันรู้ ฉันเชื่อว่าพารามิเตอร์ขนาดในการประกาศประเภท NVARCHAR มีความหมายเช่นเดียวกับใน VARCHAR2 คือเพื่อให้แน่ใจว่ามีพื้นที่เก็บข้อมูลเพียงพอสำหรับ 11 ตัวอักษร (ไม่ใช่ไบต์) ในชุดอักขระ NVARCHAR คุณจะต้องพูดว่า NVARCHAR (11 CHAR) หมายเหตุ: ฉันยังไม่ได้ตรวจสอบสิ่งนี้ ฉันไม่เคยใช้ NVARCHAR
David Sykes

เพื่อแสดงให้เห็นถึงความแตกต่างเพิ่มเติมระหว่างอักขระสองตัว: สี่ตัวของค่าเลขฐานสิบหก (เช่น "0xFF") หรืออักขระทศนิยมสามตัว (เช่น "255") อาจเป็น "บีบอัด" เมื่อแสดงเป็นไบต์เดียว: 11111111 จะมีประโยชน์สำหรับสถานะบิต (ถึง 8 การตั้งค่า) การดำเนินงานค่าที่เหมาะสม ฯลฯ
แมตต์บอร์

หมายเหตุที่ 1 เป็นตัวอักษร ASCII (49 ธันวาคม.) เป็น 1,001,001 ในขณะที่ 1 เป็นบิต 00000001.
แมตต์บอร์

21

หนึ่งมีพื้นที่ตรงสำหรับ 11 ไบต์อื่น ๆ สำหรับ 11 ตัวอักษร ชุดอักขระบางตัวเช่นชุดอักขระ Unicode อาจใช้มากกว่าหนึ่งไบต์ต่ออักขระดังนั้นเขตข้อมูล 11 ไบต์อาจมีที่ว่างน้อยกว่า 11 ตัวอักษรขึ้นอยู่กับการเข้ารหัส

ดูเพิ่มเติมhttp://www.joelonsoftware.com/articles/Unicode.html


17

ขึ้นอยู่กับการกำหนดค่าระบบขนาดของ CHAR ที่ตรวจพบใน BYTES อาจแตกต่างกันไป ในตัวอย่างของคุณ:

  1. จำกัด เขตข้อมูลไว้ที่ 11 BYTE
  2. Limits ฟิลด์ถึง 11 CHAR acters


สรุป: 1 CHAR ไม่เท่ากับ 1 ไบต์


4

ฉันไม่แน่ใจเนื่องจากฉันไม่ใช่ผู้ใช้ Oracle แต่ฉันคิดว่าความแตกต่างอยู่เมื่อคุณใช้ชุดอักขระแบบหลายไบต์เช่น Unicode (UTF-16/32) ในกรณีนี้ 11 ไบต์สามารถคิดได้น้อยกว่า 11 ตัวอักษร

นอกจากนี้ชนิดของเขตข้อมูลเหล่านั้นอาจได้รับการปฏิบัติแตกต่างกันโดยคำนึงถึงอักขระหรือกรณีที่เน้นเสียงเช่น 'binaryField (ete) = "été"' จะไม่ตรงกันในขณะที่ 'charField (ete) = "été"' อาจ (อีกครั้งไม่แน่ใจเกี่ยวกับ Oracle) .

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