Help us understand the problem. What is going on with this article?

Ubuntuからsqlcmdとbcpを使う

More than 1 year has passed since last update.

「日本語テーブルなシステムあり得ねぇ。」と思っているイケてるWebエンジニアの皆さま、こんにちは。
Microsoft♡Linux。
MicrosoftはLinuxで動くSQL Serverのツール bcpとsqlcmdも提供してくれました。

ubuntuからbcpコマンドを使いcsvにExport、csvからテーブルにデータのImportをやってみたいと思います。
勿論、データベース名、テーブル名、カラム名、全て日本語です。

Ubuntu環境からbcpコマンド、sqlcmdコマンドを使ってみようと思います。

環境

Server

  • Windows2012R2 評価版
  • SQLServer 2016 Express Edition
    • データベース名 日本語システム
    • テーブル名 タイトル
    • カラム名 タイトルno,タイトル

Client

  • Ubuntu 16.04.2 LTS (x86_64)
  • 下記のパッケージがInstall済み
    • msodbcsql
    • unixodbc-dev
    • mssql-tools

msodbcsqlやmssql-toolsのインストール等はMicrosoft公式ドライバーでUbuntuからSQLServerを見に行くを参考にしてください。

bcpコマンドは×つかえない sqlcmdは○使える

結論から言うとデータベース名、テーブル名が日本語の場合は使えません。
sqlcmdは日本語データベース名だろうと、日本語テーブル名だろうと問題なく使えます。

bcpの場合はカラム名だけが日本語の場合はCSVにexportできます。

実験

日本語名DB名、日本語テーブル名の場合

日本語名でデータベース名を付け、日本語名でテーブルを付けてみました。
これをbcpコマンドでexportしてみます。

日本語DB名、日本語テーブル名の場合
$ sqlcmd -S IPAddr -U sa -P Password
1> use 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> select * from 名前
2> go
ID          名前
----------- --------------------
          1 yusuke
          2 Microsoft love Linux
csvにexportしてみる
$ bcp 日本語システム.dbo.名前 out name.csv -c -t ',' -S IPAddr -U sa -P Passowrd
SQLState = 37000, NativeError = 4060
Error = [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Sn�▒g▒BU▒_▒▒▒▒▒▒ "日本語システム" ▒▒Q~[▒�▒k1WW~W_
SQLState = 28000, NativeError = 18456
Error = [unixODBC][Microsoft][ODBC Driver 13 for SQL Server][SQL Server]▒▒▒▒ 'sa' o�▒gM~[▒gW_

へんな文字化けとともに失敗しました。
SQLState = 37000, NativeError = 4060 SQL State = 28000 , NativeError = 18456 で検索を掛けると接続エラーみたいなのですが、僕には日本語DB名と日本語テーブル名が原因で繋がらないとしか思えなかった。

そこで、下記のテーブルを作成してもう一度Exportしてみることにした。

日本語カラム名のテーブルをExport

日本語カラム名
~$ sqlcmd -S IPAddr -U sa -P Password
1> use test1
2> select * from namelist
3> go
データベース コンテキストが 'test1' に変更されました。
ID          名前
----------- --------------------
          1 yusuke
          2 Microsoft love Linux

下記のようにうまく動きます。

日本語カラム名のテーブル
$ bcp test1.dbo.namelist out name.csv -c -t ',' -S IPAddr -U sa -P Password

Starting copy...

4 rows copied.
Network packet size (bytes): 4096

下記のように中身も問題なし。

内容を表示
$ cat name.csv
1,yusuke
2,Microsort love Linux

Windows Server上のbcpコマンドなら?

日本語DB名も日本語テーブル名も問題なくインポートできます。

WindowsでデータをImport
PS > cat .\name.csv
1,yusuke

PS > bcp 日本語システム.dbo.名前 in c:\users\administrator\name.csv -c -t ',' -S localhost -T

コピーを開始しています...

1 行コピーされました。
ネットワーク パケット サイズ (バイト): 4096
クロック タイム (ミリ秒) 合計     : 15     平均 : (66.67 行/秒)
PS >

参考サイト

bcpユーティリティ

SQL ServerのBCPコマンド
Microsoftのは網羅的すぎて分かりずらいので、先ずはこちらで試してみた。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした