ความแตกต่างระหว่าง varchar และ varchar2 คืออะไร?
ความแตกต่างระหว่าง varchar และ varchar2 คืออะไร?
คำตอบ:
สำหรับตอนนี้พวกเขามีความหมายเหมือนกัน
VARCHARถูกสงวนไว้โดยOracleเพื่อสนับสนุนความแตกต่างระหว่างNULLและสตริงว่างในอนาคตตามที่ANSIกำหนดมาตรฐาน
VARCHAR2ไม่แยกความแตกต่างระหว่างNULLสตริงและว่างและจะไม่
หากคุณอาศัยสตริงที่ว่างเปล่าและเป็นสิ่งเดียวที่คุณควรใช้NULLVARCHAR2
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
ปัจจุบันพวกเขาเหมือนกัน แต่ก่อนหน้านี้
VARCHAROracle สงวนไว้เพื่อรองรับความแตกต่างระหว่าง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 อาจเปลี่ยนซีแมนติกส์ในอนาคต