แต่ความหมายของ varchar กล่าวว่ามันจะช่วยให้สตริงที่ไม่ใช่ Unicode ข้อมูล แต่เครื่องหมายการค้า (™) และลงทะเบียน (®) สัญลักษณ์ Unicode ตัวอักษร คำจำกัดความขัดแย้งกับคุณสมบัติของประเภทข้อมูล varchar หรือไม่
ในขณะที่คำตอบอื่น ๆ ไม่ถูกต้องฉันคิดว่ามันจะช่วยชี้ให้เห็นความสับสนในคำศัพท์พื้นฐาน ฉันได้เน้นสองคำในการอ้างอิงข้างต้นจากคำถามเป็นตัวอย่างของความสับสนนี้ เมื่อเอกสาร SQL Server พูดถึง Unicode และไม่ใช่ Unicode ข้อมูลที่พวกเขาจะไม่ได้พูดคุยเกี่ยวกับตัวละคร พวกเขากำลังพูดถึงลำดับของไบต์ที่เป็นตัวแทนของตัวละครบางตัว ความแตกต่างหลักระหว่างประเภท Unicode ( NCHAR
, NVARCHAR
, XML
และเลิก / ชั่วNTEXT
) และประเภทที่ไม่ใช่ Unicode ( CHAR
, VARCHAR
และเลิก / ชั่วTEXT
) คือสิ่งที่ประเภทของลำดับไบต์ที่พวกเขาสามารถเก็บ
ประเภทที่ไม่ใช่ Unicode จัดเก็บหนึ่งในการเข้ารหัส 8 บิตหนึ่งในขณะที่ประเภท Unicode จะจัดเก็บการเข้ารหัส Unicode 16 บิตเดียว: UTF-16 Little Endian ดังที่ได้กล่าวไปแล้วคำตอบอื่น ๆ อักขระที่สามารถเก็บไว้ในการเข้ารหัส 8 บิต / ไม่ใช่ Unicode ขึ้นอยู่กับหน้ารหัสซึ่งกำหนดโดย Collation ในขณะที่คนอื่น ๆ ตั้งข้อสังเกตว่าค่า byte ของ "ตัวอักษร" สามารถแตกต่างกันไปตามหน้ารหัสที่พบในนั้นค่า byte สามารถแตกต่างกันไปในหน้ารหัสเดียวกันเมื่อจัดการกับหนึ่งในหลายหน้ารหัส EBCDIC (รูปแบบของ Windows- 1252) ซึ่งพบได้ใน SQL Server ที่เก่ากว่าเท่านั้นไม่ควรใช้จริง ๆ (เช่นชื่อที่ขึ้นต้นด้วยSQL_
)
ดังนั้นคำจำกัดความที่ถูกต้อง: อักขระใด ๆ ที่คุณสามารถจัดการเพื่อจัดเก็บในรูปแบบที่ไม่ใช่ Unicode จะเป็น 8 บิตเสมอ (แม้ว่าพวกเขาจะใช้ค่า 8 บิตสองชุดในการรวมกันเป็น "ตัวละคร" เดียวซึ่งเป็นสิ่งที่ Double- อนุญาตให้ใช้ชุดอักขระไบต์ / โค้ดเพจ DBCS ได้) และ Unicode datatypes นั้นอยู่ที่ 16 บิตเสมอแม้ว่าบางครั้งพวกเขาก็ใช้ค่า 16- บิตสองค่าในการรวมกันเป็น "อักขระ" เดียว (เช่นคู่ตัวแทนแทนซึ่งจะแสดงถึงอักขระเสริม)
และเนื่องจาก SQL Server สนับสนุนการเข้ารหัส UTF-8 VARCHAR
และCHAR
ประเภทข้อมูลตั้งแต่ SQL Server 2019
VARCHAR
ไม่สามารถเรียกได้ว่า "non-Unicode" อีกต่อไป ดังนั้นเริ่มต้นด้วยเบต้าสาธารณะครั้งแรกของ SQL Server 2019 ในเดือนกันยายน 2018 เราควรอ้างถึงVARCHAR
ว่าเป็น "ประเภทข้อมูล 8 บิต" แม้ว่าจะพูดในแง่ของรุ่นก่อนหน้า SQL Server 2019 คำศัพท์นี้จะเป็นจริงสำหรับทั้ง 4 ประเภท ของการเข้ารหัสที่สามารถใช้กับVARCHAR
:
- ASCII เพิ่มเติม
- ชุดอักขระแบบไบต์คู่ (DBCS)
- EBCDIC
- UTF-8 (Unicode)
เฉพาะTEXT
ประเภทข้อมูล (เลิกใช้แล้วใน SQL Server 2005 ดังนั้นอย่าใช้) คือ "non-Unicode" แต่นั่นเป็นเพียงด้านเทคนิคและอ้างถึงว่าเป็น "ประเภทข้อมูล 8 บิต" นั้นถูกต้อง
NVARCHAR
, NCHAR
และNTEXT
สามารถอ้างถึงเป็น "UTF-16" หรือ "ประเภทข้อมูล 16 บิต" ฉันเชื่อว่า Oracle ใช้คำศัพท์เฉพาะ "Unicode-only" สำหรับNVARCHAR
แต่ก็ไม่ได้ตัดทอนความเป็นไปได้ของการใช้ UTF-8 (เช่นการเข้ารหัส Unicode) ซึ่งไม่สามารถใช้งานได้ สองตัวเลือกแรก
สำหรับรายละเอียดเกี่ยวกับการเข้ารหัส UTF-8 ใหม่โปรดดูโพสต์ของฉัน:
สนับสนุน UTF-8 ดั้งเดิมใน SQL Server 2019: Savior หรือ False Prophet?
ป.ล. ฉันกำลังทำงานอย่างช้า ๆ ในการปรับปรุงเอกสาร SQL Server เพื่อให้สอดคล้องกับการเปลี่ยนแปลงเหล่านี้
PPS Microsoft ได้อัปเดตบางหน้าด้วยข้อมูล UTF-8 แล้วรวมถึงเอกสารchar และ varchar ที่อ้างอิงในคำถาม ไม่มีวลี "ที่ไม่ใช่ Unicode" อีกต่อไป แต่นั่นเป็นเพียง FYI; มันไม่เปลี่ยนคำถามเนื่องจากนี่เป็นเรื่องเกี่ยวกับการเข้ารหัสที่ไม่ใช่ Unicode ที่มีอักขระที่คิดว่าผิดพลาดว่าเป็น Unicode เท่านั้น