我相信这是Shell与bcp / SQL Server 之间的编码问题。SQL Server希望使用UTF-16 Little Endian,但Linux并未使用它。我的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
。
我什至尝试注入相当于ä
via $'\xe4\x00'
和even 的UTF-16 LE字符的字节$'\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] [SQL Server的ODBC驱动程序13]无法解决列级排序规则
这是bcp的错误,并且必须引用的元数据,tempdb
因为测试表中的唯一列使用的是INT
数据类型。
现在,我的实例级别的归类是对重音敏感的,因此我并不是真的希望非重音a
能够正常工作(尽管我确实期望出现“无效对象”错误)。因此,为了测试不区分重音的情况,我创建了一个新的Collation为的数据库,在新数据库中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]
工作。所有版本的错误均与以前相同。