SQLCMDコマンドはアクセントを挿入できません


19

コマンドラインから新しいデータベースをセットアップするために、sqlcmd.exeを実行しようとしています。Windows 7 64ビットでSQL SERVER Express 2012を使用しています。

私が使用するコマンドは次のとおりです。

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log 

次に、SQLファイル作成スクリプトの一部を示します。

    CREATE DATABASE aqualogy 
    COLLATE Modern_Spanish_CI_AS
    WITH TRUSTWORTHY ON, DB_CHAINING ON;
    GO
    use aqualogy
    GO
    CREATE TABLE [dbo].[BaseLayers] (
    [Code] nchar(100) NOT NULL ,
    [Geometry] nvarchar(MAX) NOT NULL ,
    [IsActive] bit NOT NULL DEFAULT ((1)) 
    )

    EXEC sp_updateextendedproperty @name = N'MS_Description', @value = N'Capas de     cartografía base de la aplicaicón. Consideramos en Galia Móvil la cartografía(...)'
, @level0type = 'SCHEMA', @level0name = N'dbo'
, @level1type = 'TABLE', @level1name = N'BaseLayers'

さて、単語にいくつかのアクセントがあることを確認してください。これはテーブルの説明です。データベースは問題なく作成されます。添付のスクリーンショットでわかるように、「照合」はスクリプトによって理解されます。これにもかかわらず、表を調べるときにアクセントが正しく表示されません。照合問題

私はどんな助けも本当に感謝しています。どうもありがとうございました。

[編集]:こんにちは。Notepad ++を使用してSQLファイルエンコーディングを変更すると、うまくいきました!ご協力いただきありがとうございます。この問題に関して興味深いことを学びました。

ここに画像の説明を入力してください


1
SQLスクリプトファイルのエンコーディングは何ですか?
Pondlife

@Pondlifeのアイデアで行きます。テキストエディター(Notepad ++など)を入手し、そこで.sqlファイルを開き、エンコードに移動して、ファイルがANSI(またはその他のサポートされていないエンコード)でないことを確認します。ある場合は、ファイルを別のものに変換することを選択します。UTF8でそれを行うべきだと思います。それがどうなったのか教えてください。
マリアン

回答:


8

コメントからわかるように、問題はテーブルやSQLCMDが特殊文字をインポートする方法に正確にはありません。通常、問題のあるインポートは、スクリプト自体の形式に関連しています。

Management Studio自体は、特定のエンコーディングで保存するオプションを提供します。これにより、将来的に問題が解決するはずです。初めてファイルを保存するとき(または[名前を付けて保存 ]を使用するとき)、[ 保存 ]ボタンの近くにある小さな矢印をクリックして、[ エンコード付きで保存 ]オプションを使用する必要があります。

ここに画像の説明を入力してください

デフォルトでは、ファイルを西ヨーロッパ言語(1252)で保存します。特別な文字がある場合は常に、UTF8を使用します(ただし、他の制限的なエンコーディングが適合する場合があります)。

ここに画像の説明を入力してください

(写真から)SSMSを使用していることはわかりませんので、独自のエディターにファイルを別のエンコードで保存するオプションがあることを確認してください。そうでない場合は、(Notepad ++で既に試したように)スマートエディターでファイルを変換することが通常は機能します。ただし、幅の広いエンコードから幅の狭いエンコードに変換してから幅の広いエンコードに戻す場合(たとえば、UnicodeからANSIに、そしてUnicodeに戻す場合)は、動作しない可能性があります。


こんにちはマリアン。ありがとうございました。Navicatの「データ転送」機能を使用しました。これは、SQLスクリプトを生成する方法が好きだからです(迅速でmdfファイルに依存せず、現在では常に機能していました)。Navicatの「データ転送」機能でいくつかのパラメーターをチェックしましたが、出力ファイルのエンコーディングを変更する方法が見つかりませんでした。エンコードを変更するにはNotepad ++を使用して余分な作業を行う必要がありますが、大したことではありません。
Oskytar

まあ、問題ありません。ただし、通常、このサイトでの感謝は、回答が有用な場合はアップ投票機能(回答の近くにある上矢印)を使用して配信されます。 ):-)。詳細については、FAQを参照してください
マリアン

最後のコメントを修正しました。Navicatで「データ転送」を実行するときにファイル出力エンコーディングを選択することは可能です。
Oskytar

これで、手動変換ステップをバイパスできるようになります。それはさらに良いです。
マリアン

2
この答えは正しくないようです。Notepad ++でUTF-8でファイルを保存しました。SQLCMD.exeは文字を正しく転送しません。コンテンツをSSMSにコピーすると、正常に機能します。実際の解決策は、param -f 65001を追加するためにswasheckによって提供された答えでした。
トマスKubes

38

別のオプション、私が今学んだことはsqlcmdドキュメントから来てます。コードページをsqlcmdファイルエンコーディングのコードページと一致するように設定する必要があります。UTF-8の場合、コードページは65001なので、次のようにします。

SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001


1
これは私の命を救ったばかりで、power-scriptスクリプトを実行してCSVファイルをimport-csv -encoding UTF8で読み取ろうとしていました。おかげで
Spörri

私はNVARCHAR列にfadas(A、E、I、O、U)とアイルランドのテキスト値を挿入しなければならなかったとき、これは私のために働いた
noonand

これは正解です
-Pitchmatt

2

この種のことは、あなたに何も言わずに多くのことが行われるため、非常に注意が必要です。

最初に行うことは、sqlcmdを使用して文字列を表示することです。cmd.exeウィンドウに正しく表示される場合、それは1つの有用な事実です。次に、convert文字列をvarbinaryに追加する行を選択して、実際にそこにあるバイトを確認します。私が思うにcartografíaがとして表示されます0x636172746f67726166c3ad61アクセント「私は」バイトc3ad、その文字のUTF-8エンコーディングであるによって表される場合、。現代のスペイン語の列(Windows 1252)にUTF-8を含めるのは良くありません。その文字のWindows 1252のバイト値は、237の10進数(16進ED)です。

列に誤ってエンコードされたデータが含まれている場合、エラーは挿入された方法にあります。おそらく、文字列定数の先頭のNを削除します-N'string'と(SQL ServerにUnicode文字列を生成するように指示しますが、プレーン'string'はクライアントのエンコードを使用することを示します)、UnicodeではなくModern Spanishを挿入します。

列に正しくエンコードされたデータが含まれている場合、GUI表示にバグが見つかったと思います。

sqlcmdでデータを正しく挿入できない場合(先頭にNが付いているかどうか)、Microsoftに苦情を申し立てます。その場合、列に格納されているバイトを表示できる(使用convert(colname as varbinary)する)ことは、何が問題なのかを説明する上で重要になります。


こんにちはジェームス、詳細な回答をありがとうございます。いくつかのテストを行いましたが、Sqlcmd.exeに正しい文字列が表示されていません。これは明らかに、データの挿入方法に関する問題です。
Oskytar

Sql Profilerを使用して、SQl Server GUIクライアントを使用するときにSQL SERVERに送信されるセンテンスをデバッグしました。INSERT INTO [ElementType]([Code]、[Name]、[Description]、[GeometryType]、[stringId]、[CapturedGeometryType])VALUES( 'ESTACION'、 'Estación'、 'Estación'、 'Multipoint'、NULL、 'ポイント'); FINEが機能したため、すべてのアクセントが適切に挿入されました!これは、SQLスクリプトに表示されるのと同じ「文を挿入」です。SQLスクリプトファイルで文字コードを指定する必要がありますか?
オスキター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.