Ich versuche, sqlcmd.exe auszuführen, um eine neue Datenbank über die Befehlszeile einzurichten . Ich verwende SQL Server Express 2012 unter Windows 7 64-Bit.
Hier ist der Befehl, den ich benutze:
SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log
Und hier ist ein Teil des Skripts zur Erstellung von SQL-Dateien:
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'
Bitte überprüfen Sie, ob die Wörter Akzente enthalten. Das ist die Beschreibung der Tabelle. Die Datenbank wird ohne Probleme erstellt. 'Sortieren' wird vom Skript verstanden, wie Sie im angehängten Screenshot sehen können. Trotzdem werden die Akzente beim Untersuchen der Tabelle nicht richtig angezeigt.
Ich würde jede Hilfe wirklich schätzen. Vielen Dank.
[Bearbeiten]: Hallo zusammen. Das Ändern der SQL-Dateicodierung mit Notepad ++ hat problemlos funktioniert! Vielen Dank für Ihre Hilfe: Ich habe mit diesem Problem etwas Interessantes gelernt!
quelle
Antworten:
Wie aus den Kommentaren hervorgeht, liegt das Problem nicht genau bei der Tabelle oder der Art und Weise, wie SQLCMD die Sonderzeichen importiert. In der Regel hängen problematische Importe mit dem Format des Skripts selbst zusammen.
Management Studio selbst bietet die Möglichkeit, mit einer bestimmten Codierung zu speichern, um das Problem in Zukunft zu lösen. Wenn Sie eine Datei zum ersten Mal speichern (oder Speichern unter verwenden), klicken Sie auf den kleinen Pfeil neben der Schaltfläche Speichern , um die Option Mit Codierung speichern zu verwenden .
Standardmäßig wird die Datei in Westeuropa (1252) gespeichert . Wann immer ich Sonderzeichen habe, verwende ich UTF8 (obwohl vielleicht eine andere einschränkende Kodierung passen würde), weil es normalerweise die schnellste Lösung ist.
Ich bin mir nicht sicher (siehe Bild), ob Sie SSMS verwenden. Stellen Sie daher sicher, dass Ihr eigener Editor die Option hat, die Datei in einer anderen Codierung zu speichern. Wenn nicht, funktioniert das Konvertieren der Datei in einem intelligenten Editor (wie Sie es bereits in Notepad ++ versucht haben) normalerweise. Dies funktioniert jedoch möglicherweise nicht, wenn Sie von einer breiten Codierung zu einer schmaleren und dann zurück zu einer breiten Codierung konvertieren (z. B. von Unicode zu ANSI und zurück zu Unicode).
quelle
Eine andere Option, die ich gerade gelernt habe, stammt aus der
sqlcmd
Dokumentation . Sie müssen die Codepage so einstellensqlcmd
, dass sie mit der der Dateicodierung übereinstimmt. Im Fall von UTF-8 lautet die Codepage 65001, Sie möchten also:SQLCMD -S .\MSSQLSERVER08 -V 17 -E -i %~dp0\aqualogyDB.sql -o %~dp0\databaseCreationLog.log -f 65001
quelle
Diese Art von Dingen ist sehr knifflig, weil so viel getan wird, ohne es dir zu sagen.
Als erstes würde ich sqlcmd verwenden, um die Zeichenfolge anzuzeigen. Wenn es im Fenster cmd.exe richtig angezeigt wird, ist dies eine nützliche Tatsache. Als nächstes wähle ich die Zeile aus, in der
convert
der String varbinary ist, um zu sehen, welche Bytes tatsächlich vorhanden sind. Ich denke, cartografía wird als0x636172746f67726166c3ad61
angezeigt, wo das akzentuierte "i" durch die Bytes c3ad dargestellt wird, die die UTF-8-Codierung für dieses Zeichen ist. Es ist nicht gut, UTF-8 in einer modernen spanischen Spalte zu haben (Windows 1252). Der Bytewert in Windows 1252 für dieses Zeichen ist 237 Dezimal (hexadezimal ED).Wenn die Spalte falsch codierte Daten enthält, liegt der Fehler darin, wie sie eingefügt wurden. Wenn Sie möglicherweise das führende N in den Zeichenfolgenkonstanten entfernen
N'string'
, um SQL Server anzuweisen, eine Unicode-Zeichenfolge zu generieren, aber einfach'string'
anzugeben, dass die Zeichen die Client-Codierung verwenden, wird statt Unicode modernes Spanisch eingefügt.Wenn die Spalte korrekt codierte Daten enthält, haben Sie einen Fehler in der GUI-Anzeige gefunden.
Wenn Sie sqlcmd nicht dazu bringen können, die Daten korrekt einzufügen (führendes N oder nicht), möchten Sie sich bei Microsoft beschweren. Wenn Sie dies tun, ist es wichtig, dass Sie die in der Spalte gespeicherten Bytes mithilfe von
convert(colname as varbinary)
anzeigen können, um zu erklären, was falsch läuft.quelle