ฉันเชื่อว่านี่เป็นปัญหาการเข้ารหัสระหว่างเชลล์และbcp / SQL Server SQL Server คาดว่า UTF-16 Little Endian แต่ Linux ไม่ได้ใช้สิ่งนั้น ค่าเริ่มต้นสำหรับลินุกซ์ VM ของฉันคือ UTF-8 en_GB.UTF-8
ผ่าน
<TL; DR>ใช้คำสั่ง"queryout" bcpและระบุ"SELECT * FROM ..."
แทนการใช้คำสั่ง "out" และเพียงระบุชื่อตาราง
สิ่งที่ตามมาคือการทดสอบของฉัน ...
ฉันได้รับรายชื่อของสถานที่ / เข้ารหัสที่มีอยู่โดยใช้:
$ locale -a
กลับมาว่า:
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX
ฉันลองตัวเลือกเหล่านี้หลายตัวด้วยการตั้งค่า:
$ export LC_CTYPE=C.UTF-8
จากนั้นลองอีกครั้งโดยใช้:
$ export LC_ALL=C.UTF-8
ดูเหมือนจะไม่มีอะไรสร้างความแตกต่าง และทุกครั้งที่ผมพยายามกับชุดต่างๆของวงเล็บโดยไม่ต้อง-q
แล้วด้วยแล้วไม่มีวงเล็บทั้งที่มีและไม่มี-q
-q
ฉันยังพยายามฉีดไบต์ที่เทียบเท่ากับอักขระ UTF-16 LE ของä
ผ่าน$'\xe4\x00'
และแม้กระทั่ง$'\xe4'$'\x00'
แต่ไม่มีการปรับปรุง
อย่างไรก็ตาม
สิ่งที่ไม่ทำงานถูกเปลี่ยนBCPคำสั่งจากout
แทนที่จะเป็นqueryout
แล้วเปลี่ยนชื่อตารางเพื่อเป็นส่วนหนึ่งของSELECT
คำสั่ง (ฉันออก-r ~
สวิทช์เท่านั้นที่นี่เพื่อให้บรรทัดคำสั่งไม่เลื่อนแนวนอน แต่มันก็เป็นในการทดสอบของฉัน) ฉันสร้างตาราง[tempdb]
และวิ่งตามดังต่อไปนี้:
bcp "SELECT * FROM tempdb.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
ไม่มีปัญหา แต่น่าสนใจพอฉันเปลี่ยนสำเนียงä
เป็นการไม่เน้นเสียงa
:
bcp "SELECT * FROM tempdb.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
และได้รับข้อผิดพลาดต่อไปนี้:
SQLState = S1000, NativeError = 0
ข้อผิดพลาด = [Microsoft] [ODBC ไดรเวอร์ 13 สำหรับ SQL Server] ไม่สามารถแก้ไขการเปรียบเทียบระดับคอลัมน์
นั่นเป็นข้อผิดพลาดจากbcpและต้องอ้างถึง meta-data tempdb
เนื่องจากคอลัมน์เดียวในตารางทดสอบของฉันใช้INT
ประเภทข้อมูล
ตอนนี้การจัดเรียงระดับอินสแตนซ์ของฉันมีความอ่อนไหวสำเนียงดังนั้นฉันไม่ได้คาดหวังว่าจะไม่เน้นเสียงa
ในการทำงาน (แม้ว่าฉันคาดว่าจะมีข้อผิดพลาด "วัตถุที่ไม่ถูกต้อง") ดังนั้นเพื่อทดสอบการเน้นความรู้สึกตัวฉันได้สร้างฐานข้อมูลใหม่ด้วย Collation of Latin1_General_100_CI_AI_KS_WS_CS
สร้างตารางเดียวกันนั้นในฐานข้อมูลใหม่และเพิ่มแถวสองสามแถว จากนั้นฉันก็ทำการทดสอบสองข้อต่อไปนี้:
bcp "SELECT * FROM ImportTest.dbo.[Täble_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
bcp "SELECT * FROM ImportTest.dbo.[Table_Name]" queryout tab -c -k -S127.0.0.1 -Usa -Ppass
และทั้งสองทำงาน!
กลับไปที่คำสั่งbcpเริ่มต้นเพียงแค่ระบุชื่อตารางแทนการสืบค้นฉันสามารถรับImportTest.dbo.[Table_Name]
และImportTest.dbo.Table_Name
ใช้งานได้ อย่างไรก็ตามฉันยังคงไม่สามารถImportTest.dbo.[Täble_Name]
ทำงานร่วมกันได้ รูปแบบทั้งหมดมีข้อผิดพลาดเหมือนเดิม