ใน 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
)
ใน 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
)
คำตอบ:
ให้เราสมมติว่าชุดอักขระฐานข้อมูลคือ UTF-8 ซึ่งเป็นการตั้งค่าที่แนะนำใน Oracle เวอร์ชันล่าสุด ในกรณีนี้อักขระบางตัวใช้เวลามากกว่า 1 ไบต์ในการจัดเก็บในฐานข้อมูล
หากคุณกำหนดฟิลด์เป็นVARCHAR2(11 BYTE)
Oracle สามารถใช้พื้นที่จัดเก็บได้สูงสุด 11 ไบต์ แต่จริงๆแล้วคุณอาจไม่สามารถเก็บอักขระได้ 11 ตัวในฟิลด์เนื่องจากบางอันใช้พื้นที่มากกว่าหนึ่งไบต์ในการจัดเก็บเช่นอักขระที่ไม่ใช่ภาษาอังกฤษ
โดยการกำหนดฟิลด์ตามที่VARCHAR2(11 CHAR)
คุณบอก Oracle สามารถใช้พื้นที่เพียงพอในการจัดเก็บอักขระ 11 ตัวไม่ว่าจะใช้กี่ไบต์ในการจัดเก็บแต่ละตัว อักขระหนึ่งตัวอาจต้องการได้ถึง 4 ไบต์
หนึ่งมีพื้นที่ตรงสำหรับ 11 ไบต์อื่น ๆ สำหรับ 11 ตัวอักษร ชุดอักขระบางตัวเช่นชุดอักขระ Unicode อาจใช้มากกว่าหนึ่งไบต์ต่ออักขระดังนั้นเขตข้อมูล 11 ไบต์อาจมีที่ว่างน้อยกว่า 11 ตัวอักษรขึ้นอยู่กับการเข้ารหัส
ดูเพิ่มเติมhttp://www.joelonsoftware.com/articles/Unicode.html
ขึ้นอยู่กับการกำหนดค่าระบบขนาดของ CHAR ที่ตรวจพบใน BYTES อาจแตกต่างกันไป ในตัวอย่างของคุณ:
ฉันไม่แน่ใจเนื่องจากฉันไม่ใช่ผู้ใช้ Oracle แต่ฉันคิดว่าความแตกต่างอยู่เมื่อคุณใช้ชุดอักขระแบบหลายไบต์เช่น Unicode (UTF-16/32) ในกรณีนี้ 11 ไบต์สามารถคิดได้น้อยกว่า 11 ตัวอักษร
นอกจากนี้ชนิดของเขตข้อมูลเหล่านั้นอาจได้รับการปฏิบัติแตกต่างกันโดยคำนึงถึงอักขระหรือกรณีที่เน้นเสียงเช่น 'binaryField (ete) = "été"' จะไม่ตรงกันในขณะที่ 'charField (ete) = "été"' อาจ (อีกครั้งไม่แน่ใจเกี่ยวกับ Oracle) .
VARCHAR2
ไบต์สำหรับ การประกาศ aVARCHAR2(4000 CHAR)
จะอนุญาตให้มีอักขระน้อยกว่า 4,000 ตัวหากอักขระบางตัวต้องการพื้นที่เก็บข้อมูลหลายไบต์