เนื่องจาก MS SQL Server รองรับ UTF-8 ได้ไม่ดีเมื่อเทียบกับ RDBMS อื่น
MS SQL Server เป็นไปตามข้อตกลงที่ใช้ภายใน Windows เองสตริง "แคบ" ( char
ใน C ++ CHAR
หรือVARCHAR
ใน SQL) จะถูกเข้ารหัสในแบบดั้งเดิม "รหัสหน้า" ปัญหาของโค้ดเพจคือมีจำนวนอักขระ จำกัด (ส่วนใหญ่เป็นการเข้ารหัสแบบไบต์เดียวซึ่ง จำกัด จำนวนรายงานที่ 256 ตัวอักษร) และได้รับการออกแบบรอบ ๆ ภาษาเดียว (หรือกลุ่มของภาษาที่มีตัวอักษรที่คล้ายกัน) ทำให้การจัดเก็บข้อมูลหลายภาษาเป็นเรื่องยาก ตัวอย่างเช่นคุณไม่สามารถเก็บข้อมูลทั้งรัสเซียและภาษาฮิบรูเพราะหน้ารหัสใช้รัสเซีย1251และภาษาฮิบรูใช้รหัสหน้า1255
Unicodeแก้ปัญหานี้โดยการใช้ชุดอักขระที่มีรหัสขนาดยักษ์ตัวเดียวพร้อมห้องมากกว่าหนึ่งล้านตัวอักษรเพียงพอที่จะเป็นตัวแทนของทุกภาษาในโลก มีหลายรูปแบบการเข้ารหัส Unicode; ไมโครซอฟท์ชอบที่จะใช้UTF-16สำหรับเหตุผลทางประวัติศาสตร์ เนื่องจาก UTF-16 แสดงถึงสตริงเป็นลำดับของหน่วยรหัส 16 บิตแทน 8 บิตแบบดั้งเดิมจึงจำเป็นต้องใช้ประเภทอักขระแยกต่างหาก ใน MSVC ++ wchar_t
นี้เป็น และใน MS SQL มันหรือNCHAR
ย่อมาจาก "แห่งชาติ"ซึ่งดูเหมือนว่าข้างหลังกับผมเพราะเป็นเรื่องเกี่ยวกับ Unicode ระหว่าง -nationalization แต่ที่คำศัพท์มาตรฐาน ISONVARCHAR
N
การใช้ SQL อื่น ๆ ช่วยให้คุณเก็บข้อความUTF-8ไว้ในVARCHAR
คอลัมน์ UTF-8 คือการเข้ารหัสความยาวผันแปร (1-4 ไบต์ต่อตัวอักษร) ที่ปรับให้เหมาะกับกรณีเมื่อข้อมูลของคุณส่วนใหญ่อยู่ในช่วง Basic Latin (ซึ่งแสดงเป็น 1 ไบต์ต่ออักขระเหมือน ASCII) แต่สามารถแทนได้ อักขระ Unicode ใด ๆ ดังนั้นคุณจะหลีกเลี่ยงปัญหา "พื้นที่สองเท่า" ที่กล่าวถึงโดย bwalk2895
น่าเสียดายที่ MS SQL Server ไม่รองรับ UTF-8VARCHAR
ดังนั้นคุณต้องใช้ UTF-16 แทน (และเปลืองเนื้อที่สำหรับข้อความ ASCII) ใช้หน้ารหัสที่ไม่ใช่ Unicode (และสูญเสียความสามารถในการแสดงอักขระต่างประเทศ) หรือเก็บ UTF-8 ในBINARY
คอลัมน์ (และจัดการกับความไม่สะดวกเช่นฟังก์ชั่นสตริง SQL ทำงานไม่ถูกต้องหรือต้องดูข้อมูลในรูปแบบฐานสิบหกใน GUI DB manager ของคุณ)