ความแตกต่างระหว่าง varchar และ varchar2 คืออะไร?
ความแตกต่างระหว่าง varchar และ varchar2 คืออะไร?
คำตอบ:
สำหรับตอนนี้พวกเขามีความหมายเหมือนกัน
VARCHAR
ถูกสงวนไว้โดยOracle
เพื่อสนับสนุนความแตกต่างระหว่างNULL
และสตริงว่างในอนาคตตามที่ANSI
กำหนดมาตรฐาน
VARCHAR2
ไม่แยกความแตกต่างระหว่างNULL
สตริงและว่างและจะไม่
หากคุณอาศัยสตริงที่ว่างเปล่าและเป็นสิ่งเดียวที่คุณควรใช้NULL
VARCHAR2
VARCHAR2
เพราะในปัจจุบันไม่มีประเภทที่VARCHAR
ควรปฏิบัติ ที่จริงแล้วคุณไม่ควรใช้VARCHAR
เลยจนกว่าจะมีการใช้งานอย่างถูกต้อง
where x is NULL
ผลตอบแทนที่แตกต่างจากการwhere x = ''
ไม่ได้หมายความว่าNULL
และ''
มีความแตกต่างกันในทางใดทางหนึ่ง พฤติกรรมที่แตกต่างกันเกิดจากตัว=
ดำเนินการ
ปัจจุบัน VARCHAR ทำงานเหมือนกับ VARCHAR2 อย่างไรก็ตามประเภทVARCHAR
นี้ไม่ควรใช้เนื่องจากถูกสงวนไว้สำหรับการใช้งานในอนาคต
VARCHAR
ไม่ควรใช้ ฉันแก้ไขมัน
นำมาจาก Oracle เวอร์ชันล่าสุดที่เสถียร 12.2: ประเภทข้อมูล
ความแตกต่างที่สำคัญคือVARCHAR2
เป็นชนิดข้อมูลภายในและVARCHAR
เป็นชนิดข้อมูลภายนอก ดังนั้นเราต้องเข้าใจความแตกต่างระหว่างชนิดข้อมูลภายในและภายนอก ...
ภายในฐานข้อมูลค่าจะถูกเก็บไว้ในคอลัมน์ในตาราง ภายใน, Oracle หมายถึงข้อมูลในรูปแบบเฉพาะที่รู้จักกันเป็นชนิดข้อมูลภายใน
โดยทั่วไปแอปพลิเคชัน OCI (Oracle Call Interface) จะไม่ทำงานกับการแสดงประเภทข้อมูลภายในของข้อมูล แต่ด้วยประเภทข้อมูลภาษาโฮสต์ที่กำหนดไว้ล่วงหน้าโดยภาษาที่พวกเขาเขียน เมื่อข้อมูลถูกถ่ายโอนระหว่างแอปพลิเคชันไคลเอนต์ OCI และตารางฐานข้อมูลไลบรารี OCI จะแปลงข้อมูลระหว่างชนิดข้อมูลภายในและชนิดข้อมูลภายนอก
ประเภทภายนอกให้ความสะดวกสำหรับโปรแกรมเมอร์โดยทำให้สามารถทำงานกับชนิดภาษาโฮสต์แทนรูปแบบข้อมูลที่เป็นกรรมสิทธิ์ OCI สามารถทำการแปลงชนิดข้อมูลได้หลากหลายเมื่อถ่ายโอนข้อมูลระหว่างฐานข้อมูล Oracle และแอปพลิเคชัน OCI มีชนิดข้อมูลภายนอก OCI มากกว่าชนิดข้อมูลภายในของ Oracle
VARCHAR2
ชนิดข้อมูลเป็นตัวแปรสตริงที่มีความยาวของตัวอักษรที่มีความยาวสูงสุด 4000 ไบต์ หากพารามิเตอร์ init.ora max_string_size เป็นค่าเริ่มต้นความยาวสูงสุดของVARCHAR2
สามารถเป็น 4000 ไบต์ หากพารามิเตอร์ init.ora max_string_size = ถูกขยายความยาวสูงสุดของ a VARCHAR2
สามารถเป็น 32767 ไบต์
VARCHAR
สตริงร้านค้าประเภทข้อมูลตัวอักษรของความยาวที่แตกต่างกัน 2 ไบต์แรกประกอบด้วยความยาวของสตริงอักขระและไบต์ที่เหลือประกอบด้วยสตริง ความยาวที่ระบุของสตริงในการโยงหรือการเรียกกำหนดต้องมีความยาวสองไบต์ดังนั้นVARCHAR
สตริงที่ใหญ่ที่สุดที่สามารถรับหรือส่งได้มีความยาว 65533 ไบต์ไม่ใช่ 65535
การทดสอบอย่างรวดเร็วในฐานข้อมูลที่ 12.2 แสดงให้เห็นว่าเป็นชนิดข้อมูลภายในออราเคิลยังคงถือว่าVARCHAR
เป็นpseudotypeVARCHAR2
สำหรับ ไม่ใช่SYNONYM
ชนิดวัตถุจริงใน Oracle
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
นอกจากนี้ยังมีความหมายของVARCHAR
ตัวเลือก Precompiler ของProC / C ++ สำหรับโปรแกรมเมอร์ที่มีความสนใจลิงค์คือ: คู่มือโปรแกรมเมอร์ Pro * C / C ++
หลังจากการทดลองบางอย่าง (ดูด้านล่าง) ฉันสามารถยืนยันได้ว่า ณ เดือนกันยายน 2560 ไม่มีอะไรเปลี่ยนแปลงเกี่ยวกับการทำงานที่อธิบายไว้ในคำตอบที่ยอมรับ : -
NULL
สำหรับทั้งสองและVARCHAR
VARCHAR2
เหตุผลที่ผ่านมาสำหรับคำหลักสองคำนี้อธิบายได้ดีในคำตอบของคำถามอื่น
VARCHAR สามารถเก็บอักขระได้สูงสุด 2000 ไบต์ในขณะที่ VARCHAR2 สามารถเก็บอักขระได้มากถึง 4000 ไบต์
ถ้าเราประกาศประเภทข้อมูลเป็น VARCHAR มันจะใช้พื้นที่สำหรับค่า NULL ในกรณีของประเภทข้อมูล VARCHAR2 มันจะไม่ครอบครองพื้นที่ใด ๆ สำหรับค่า NULL เช่น,
name varchar(10)
จะสำรองหน่วยความจำ 6 ไบต์แม้ว่าชื่อจะเป็น 'Ravi__' ก็ตาม
name varchar2(10)
จะสำรองพื้นที่ตามความยาวของสายป้อน เช่นหน่วยความจำ 4 ไบต์สำหรับ 'Ravi__'
ที่นี่ _ แทน NULL
หมายเหตุ: varchar จะสำรองพื้นที่สำหรับค่า Null และ varchar2 จะไม่สำรองพื้นที่สำหรับค่า Null
VARCHAR
CHAR
ปัจจุบันพวกเขาเหมือนกัน แต่ก่อนหน้านี้
VARCHAR
Oracle สงวนไว้เพื่อรองรับความแตกต่างระหว่างNULL
และสตริงว่างในอนาคตตามมาตรฐาน ANSI ที่กำหนดไว้
VARCHAR2
ไม่แยกความแตกต่างระหว่างNULL
สตริงและว่างและจะไม่
Emp_name varchar(10)
- หากคุณป้อนค่าน้อยกว่า 10 หลักพื้นที่ที่เหลือจะไม่สามารถลบได้ ใช้ทั้งหมด 10 ช่องว่าง
Emp_name varchar2(10)
- หากคุณป้อนค่าน้อยกว่า 10 หลักพื้นที่ที่เหลือจะถูกลบโดยอัตโนมัติ
create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
VARCHAR เป็นคำพ้องความหมายของ VARCHAR2 อย่างไรก็ตามคุณไม่ควรใช้ VARCHAR เพราะ Oracle อาจเปลี่ยนซีแมนติกส์ในอนาคต