อะไรคือความแตกต่างระหว่างประเภทข้อมูล VARCHAR ของ Oracle และ VARCHAR2


19

เมื่อโอนย้ายตารางที่มาจาก DBMS อื่นไปยัง Oracle หนึ่งในภารกิจมาตรฐานคือการแทนที่VARCHAR(n)ฟิลด์ทั้งหมดด้วยVARCHAR2(n)ฟิลด์ (ระบุ n <= 4000)

เหตุใด Oracle จึงเรียกประเภทข้อมูลนี้VARCHAR2และไม่VARCHARเหมือนกับ DBMS อื่น ๆ

คำตอบ:


26

มันจะดูเหมือนว่า Oracle ที่ครั้งหนึ่งมีแผนจะให้ความหมายที่แตกต่างกันเพื่อVARCHARกว่าที่จะVARCHAR2 มันได้บอกลูกค้าที่นี้และขอแนะนำให้ใช้VARCHAR ไม่ว่าแผนการของพวกเขาก็เป็นของ 11.2.0.2 VARCHARเป็นเหมือนVARCHAR2 นี่คือสิ่งที่การอ้างอิงภาษา SQL 11g รีลีส 2บอกว่า:

อย่าใช้ชนิดข้อมูล VARCHAR ใช้ชนิดข้อมูล VARCHAR2 แทน แม้ว่าชนิดข้อมูล VARCHAR นั้นมีความหมายเหมือนกันกับ VARCHAR2 แต่ชนิดข้อมูล VARCHAR นั้นถูกกำหนดเวลาให้มีการกำหนดใหม่เป็นประเภทข้อมูลแยกต่างหากที่ใช้สำหรับสตริงอักขระความยาวผันแปรเมื่อเปรียบเทียบกับซีแมนทิกส์เปรียบเทียบที่แตกต่างกัน

ผู้ใช้ PL / SQL คู่มือและเอกสารอ้างอิง 10g Release 2ทำให้มันด้วยวิธีนี้:

ปัจจุบัน VARCHAR มีความหมายเหมือนกันกับ VARCHAR2 อย่างไรก็ตามในรุ่นอนาคตของ PL / SQL เพื่อรองรับมาตรฐาน SQL ที่เกิดขึ้นใหม่ VARCHAR อาจกลายเป็นประเภทข้อมูลแยกต่างหากที่มีความหมายเปรียบเทียบที่แตกต่างกัน มันเป็นความคิดที่ดีที่จะใช้ VARCHAR2 มากกว่า VARCHAR

เอกสารDatabase Concepts 10g Release 2บอกสิ่งเดียวกันในแง่ที่ดีกว่า:

ประเภทข้อมูล VARCHAR มีความหมายเหมือนกันกับประเภทข้อมูล VARCHAR2 เพื่อหลีกเลี่ยงการเปลี่ยนแปลงพฤติกรรมที่เป็นไปได้ให้ใช้ประเภทข้อมูล VARCHAR2 เพื่อเก็บสตริงอักขระที่มีความยาวผันแปรได้

The Oracle 9.2 และเอกสาร 8.1.7 พูดเป็นหลักสิ่งเดียวกันดังนั้นแม้ว่าออราเคิลอย่างต่อเนื่องลดการใช้งานของVARCHARเพื่อให้ห่างไกลที่พวกเขาไม่ได้ทำอะไรที่จะเปลี่ยนมันของความเท่าเทียมกันกับVARCHAR2


ฉันจำ varchar2 ใน Oracle 8i ได้ แต่ฉันไม่แน่ใจว่า varchar2 นั้นเหมือนกันหรือไม่
bernd_k

มันเป็น ดูdownload.oracle.com/docs/cd/A87860_01/doc/server.817/a76965/...
Leigh Riffel

มีข้อบ่งชี้ว่าในบางจุดก่อน 8i นิยามอาจแตกต่างกัน
Leigh Riffel

ฉันเคยคิดว่ามีการจำกัดความยาวที่แตกต่างกันไปvarcharก่อนหน้ารุ่น 8 แต่ฉันไม่สามารถหาสิ่งที่มีชื่อเสียงมาสำรองได้และตอนนี้สงสัยว่ามันเป็นเพียงตำนาน
แจ็คดักลาส

@Jack Douglas - ฉันไม่พบอะไรเลยในเอกสารของ Oracle 7 เกี่ยวกับเรื่องนี้ จากdocs.oracle.com/cd/A57673_01/DOC/dcommon/oin/indexj.htm >> เซิร์ฟเวอร์ Oracle 7 เซิร์ฟเวอร์ >> แนวคิดเซิร์ฟเวอร์ >> Oracle Datatypes (ไม่สามารถเชื่อมโยงโดยตรงกับมัน) บอกสิ่งเดียวกันในภายหลัง รุ่น ในส่วนอื่นของเอกสารคู่มือเวอร์ชัน 7 ระบุว่าในเวอร์ชัน 6 Varchar และ Varchar2 มีความหมายเหมือนกันสำหรับอักขระ char
Leigh Riffel

25

ปัจจุบันทั้งสองมีความหมายเหมือนกัน

VARCHAR เป็นประเภทข้อมูลมาตรฐาน ANSI แต่การใช้งาน VARCHAR ของประเภทข้อมูลของ Oracle นั้นละเมิดมาตรฐาน ANSI โดยพิจารณาสตริงว่างเปล่าให้เป็น NULL (การใช้งานของ Oracle ได้มาตรฐาน ANSI) ตามที่ Leigh ชี้ให้เห็น Oracle ได้ระบุว่าความหมายของประเภทข้อมูล VARCHAR อาจเปลี่ยนแปลงได้ในอนาคตตามการปฏิบัติต่อสตริงว่าง ถ้าและเมื่อสิ่งนั้นเกิดขึ้นความหมายของประเภทข้อมูล VARCHAR2 จะยังคงเหมือนเดิม การใช้ประเภทข้อมูล VARCHAR2 นั้นปลอดภัยกว่าเพราะคุณไม่ต้องกังวลว่า Oracle เวอร์ชันในอนาคตบางรุ่นจะทำลายรหัสของคุณโดยการทำให้สตริงว่างเปล่าจะไม่ถือว่าเป็น NULL อีกต่อไป


3

เนื่องจากในมาตรฐาน SQL ดั้งเดิม VARCHAR มีอักขระได้ 255 ตัวและอย่างน้อย Oracle ก็มีการปฏิบัติตามมาตรฐานอย่างถูกต้องในสมัยนั้น


ที่ให้ความหวังที่จะเห็น Oracle varchar3 (สูงสุด) ในบางปี
bernd_k

Sql-server ไม่มีปัญหาในการเพิ่มความยาวที่อนุญาตจาก 255 เป็น 8000 (และตอนนี้ถึงสูงสุด) เหตุใด Oracle จึงต้องการประเภทข้อมูลที่แตกต่าง
bernd_k

1
ไม่จำเป็นต้องvarchar(max)ใช้เพียงแค่ใช้CLOB
a_horse_with_no_name

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