SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Linux 版の bcp と sqlcmd の日本語対応状況のメモ

leave a comment

SQL Server on Linux 向けのコマンドラインとして、Windows 版の SQL Server でも実装されている「bcp」「sqlcmd」は、Linux 向けもリリースされていますが、日本語の扱いが Windows 版と少し異なる点がありますので簡単にではありますがまとめてみました。

各コマンドの Linux 版の詳細については、次のドキュメントから確認することができます。

私が検証した限りでは、次の操作は気を付けておく必要があるかと。

  • char / varchar で CP932 固有の文字の「テキスト形式でのエクスポート」
  • 日本語名のテーブルの bcp を使用したエクスポート
  • char / varchar で CP932 固有の文字の「コンソールへの出力」
  • bcp のデフォルトの改行コードが LF となる

日本語を使用していても、nchar / nvarchar で UTF-16 を使用しているものについては問題なく実行することができており、char /varchar についても Native 形式のエクスポートであれば問題はありませんでした。

  • bcp を使用して char / varchar に CP932 固有の文字を使用していて、テキスト形式でデータをエクスポートする

というような運用が必要な場合、Linux 版のコマンドラインツールだと少し問題が出てくるかもしれませんね。

bcp のドキュメントに次のように記載されているので、CP932 の扱いが

このリリースでは、Latin-1 および UTF-16 文字がサポートされています。

Linux の SQL Server に対して、Windows 環境から bcp / sqlcmd を実行した場合は従来通りの動作となるかと。

各コマンドを検証した結果は次のようになりました。

bcp の検証結果

 

LANG=ja_JP.UTF-8
コンソール
=UTF-8

日本語名のデータベース

接続可能

日本語名のテーブル

エクスポート不可

日本語の列名

エクスポート可能

改行コード

LF で出力される

-r \\r\\n オプションを指定することで CR + LF で出力可能

(Windows の場合は CR + LF がデフォルト)

varchar (CP932) のエクスポート

デフォルトで UTF-8 のファイルで出力される。

(Windows の場合は、-C 65001 を指定しないと CP932 で出力される)

varchar のダブルバイトが文字化け

nvarchar (UTF-16) のエクスポート

デフォルトで UTF-8 のファイルで出力される

(Windows の場合は、-C 65001 を指定しないと CP932 で出力される)

nvarchar のダブルバイトもエクスポートされる

varchar (CP932) のインポート

ダブルバイトが入っていなければインポートできるがダブルバイトは NG

nvarchar (UTF-16) のインポート

インポート可能

varchar (CP932) のエクスポート

nvarchar (UTF-16) のエクスポート

varchar (CP932) のインポート

nvarchar (UTF-16) のインポート

(-n : ネイティブモードでの出力)

nvarchar / varchar ともにエクスポート / インポート可能

 

sqlcmd の検証結果

 

LANG=ja_JP.UTF-8
コンソール
=UTF-8

日本語名のデータベース

接続可能

日本語名のテーブル

操作可能

コンソールで varchar (CP932) 列の文字の表示

ダブルバイトが文字化け

nvarchar CAST することで表示可能

コンソールで nvarchar (UTF-16) 列の文字の表示

ダブルバイトも表示可能

SQL ファイル (CP932) varchar (CP932) 列の SELECT

ダブルバイトが文字化け

iconv -f Shift_JIS -t UTF-8 しても表示不可

SQL ファイル (CP932) nvarchar (UTF-16) 列の SELECT

ダブルバイトが文字化け

iconv -f Shift_JIS -t UTF-8 nvarchar は表示可能

SQL ファイル (UTF-8) varchar (CP932) 列を WHERE 句にしての SELECT

可能

SQL ファイル (UTF-8) nvarchar (UTF-16) 列を WHERE 句にしての SELECT

可能

Written by masayuki.ozawa

1月 8th, 2018 at 9:21 pm

Posted in SQL Server

Tagged with ,

Leave a Reply

*