「日本語テーブルなシステムあり得ねぇ。」と思っているイケてる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してみます。
$ sqlcmd -S IPAddr -U sa -P Password
1> use 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> select * from 名前
2> go
ID 名前
----------- --------------------
1 yusuke
2 Microsoft love Linux
$ 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名も日本語テーブル名も問題なくインポートできます。
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 >
参考サイト
SQL ServerのBCPコマンド
Microsoftのは網羅的すぎて分かりずらいので、先ずはこちらで試してみた。