MS SQL Server 2012, nvarchar-Spalte mit Unicode dez. funktioniert nicht
Hi
Ich habe eine Tabelle in MS SQL Server 2012 Express Edition auf einem Windows 7 PRO PC in einem isolierten Netzwerk ohne Internetzugang. Die Tabelle funktioniert auch tadellos, solange in den Spalten der Text auf Deutsch oder Englisch eingetragen wird. Die meisten Felder sind vom Datentyp nvarchar(256), so auch jene, die mir Probleme machen.
Neu sollen einige Spalten auch östliche Schriftzeichen enthalten: kyrillische, hebräische und arabische. Die Einträge habe ich anhand von dezimal Unicode-Tabellen im Format ✏ gemacht, wobei ich für das Kyrillische Zahlen von 1024 bis 1279 anstelle der 9999 eingesetzt habe, für das Hebräische Zahlen von 1425 - 1524 und für das Arabische solche zwischen 1536 und 1791.
Ein Eintrag lautet somit z.B. БеЛьІй und sollte so aussehen: Белый, tut es aber nicht.
Die Tabellen-Einträge werden von einer Drucksoftware abgerufen. Ein Layout besteht aus festen Feldern und variablen Feldern. In den festen Feldern kann ich Einträge ganz unproblematisch direkt mit einer dieser drei Schriftzeichenarten machen. Die Inhalte der festen Felder sind im Layout selbst abgespeichert. Variable Felder beziehen sich aber auf die SQL Tabelle. Der Anwender trifft eine Auswahl und der Inhalt wird von dort bezogen.
1.) Das Layout und der Druck der festen Felder erfolgt korrekt. In den variablen Felder steht aber Б etc.
2.) Wenn ich den Datensatz mit like%% abrufe, stehen im Feld die Unicodes
Was mache ich falsch?
Danke für Euer Input.
Berner
Ich habe eine Tabelle in MS SQL Server 2012 Express Edition auf einem Windows 7 PRO PC in einem isolierten Netzwerk ohne Internetzugang. Die Tabelle funktioniert auch tadellos, solange in den Spalten der Text auf Deutsch oder Englisch eingetragen wird. Die meisten Felder sind vom Datentyp nvarchar(256), so auch jene, die mir Probleme machen.
Neu sollen einige Spalten auch östliche Schriftzeichen enthalten: kyrillische, hebräische und arabische. Die Einträge habe ich anhand von dezimal Unicode-Tabellen im Format ✏ gemacht, wobei ich für das Kyrillische Zahlen von 1024 bis 1279 anstelle der 9999 eingesetzt habe, für das Hebräische Zahlen von 1425 - 1524 und für das Arabische solche zwischen 1536 und 1791.
Ein Eintrag lautet somit z.B. БеЛьІй und sollte so aussehen: Белый, tut es aber nicht.
Die Tabellen-Einträge werden von einer Drucksoftware abgerufen. Ein Layout besteht aus festen Feldern und variablen Feldern. In den festen Feldern kann ich Einträge ganz unproblematisch direkt mit einer dieser drei Schriftzeichenarten machen. Die Inhalte der festen Felder sind im Layout selbst abgespeichert. Variable Felder beziehen sich aber auf die SQL Tabelle. Der Anwender trifft eine Auswahl und der Inhalt wird von dort bezogen.
1.) Das Layout und der Druck der festen Felder erfolgt korrekt. In den variablen Felder steht aber Б etc.
2.) Wenn ich den Datensatz mit like%% abrufe, stehen im Feld die Unicodes
Was mache ich falsch?
Danke für Euer Input.
Berner
11 Antworten
- LÖSUNG ukulele-7 schreibt am 02.04.2021 um 23:35:24 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 19:24:47 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 20:06:34 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 23:09:28 Uhr
- LÖSUNG SachsenHessi schreibt am 04.04.2021 um 20:32:51 Uhr
- LÖSUNG Berner schreibt am 04.04.2021 um 22:36:04 Uhr
- LÖSUNG MadMax schreibt am 06.04.2021 um 16:04:38 Uhr
- LÖSUNG Berner schreibt am 06.04.2021 um 16:47:14 Uhr
- LÖSUNG Berner schreibt am 08.04.2021 um 22:44:02 Uhr
- LÖSUNG Berner schreibt am 09.04.2021 um 22:54:45 Uhr
- LÖSUNG ukulele-7 schreibt am 12.04.2021 um 09:56:10 Uhr
- LÖSUNG Berner schreibt am 09.04.2021 um 22:54:45 Uhr
- LÖSUNG Berner schreibt am 08.04.2021 um 22:44:02 Uhr
- LÖSUNG Berner schreibt am 06.04.2021 um 16:47:14 Uhr
- LÖSUNG MadMax schreibt am 06.04.2021 um 16:04:38 Uhr
- LÖSUNG Berner schreibt am 04.04.2021 um 22:36:04 Uhr
- LÖSUNG SachsenHessi schreibt am 04.04.2021 um 20:32:51 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 23:09:28 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 20:06:34 Uhr
- LÖSUNG Berner schreibt am 03.04.2021 um 19:24:47 Uhr
LÖSUNG 02.04.2021, aktualisiert um 23:36 Uhr
Ein leidiges Thema, treibt mich regelmäßig in den Wahnsinn.
Du hast zwar eine Spalte die Unicode speichern kann, deine Unicode-Zeichen sind aber tatsächlich in HTML codiert. Für SQL ist das kein Unicode sondern eine Zeichenkette a la ASCII. Wie genau schreibst du die Zeichen in die Tabelle?
Hier mal ein bischen Code zur Veranschaulichung:
https://stackoverflow.com/questions/49817637/how-to-decode-html-encoded- ...
Du hast zwar eine Spalte die Unicode speichern kann, deine Unicode-Zeichen sind aber tatsächlich in HTML codiert. Für SQL ist das kein Unicode sondern eine Zeichenkette a la ASCII. Wie genau schreibst du die Zeichen in die Tabelle?
Hier mal ein bischen Code zur Veranschaulichung:
DECLARE @string NVARCHAR(10);
SET @string = N'Б';
SELECT @string,unicode(@string);
--Б 1041
SET @string = N'Б'
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
--Б Б
LÖSUNG 03.04.2021 um 19:24 Uhr
Hallo ukulele-7
Vielen Dank für Deine prompte Antwort. Ich bin jeweils erst so ab 18Uhr bis 23 Uhr aktiv im Forum.
Ganz naiv:
- mit Browser von Internetexplorer und Login Tabelle holen
- mit "suchen" "Artikelname" (Spaltenname) "like%%" und Suchbegriff und "Daten zeigen von" Datensatz visualisieren
"ändern/bearbeiten" und im gewünschten Feld 1:1 БеЛ eintippen, Spalte links davon mit Auswahl NULL / (leer) / + / SQL auf (leer)
- speichern
Ich brauche also weder im Adminer 4.3.1 den Button SQL-Kommando noch das separate Programm SQL Server Management Studio dazu
Ich habe begriffen, dass das so falsch ist. Entweder brauche ich den HTML Encoder von SQLHTTP.NET oder ich muss die Eingabe in die Felder mit SQL Kommandos machen, wobei es mir noch nicht ganz klar ist wie.
Wie gelangt die Konvertierung ins richtige Feld des Datensatzen?
Muss da nur der Cursor drin stehen?
Entschuldige meine naiven Fragen..
Vielen Dank für Deine Präzisierung
Gruss Berner
Vielen Dank für Deine prompte Antwort. Ich bin jeweils erst so ab 18Uhr bis 23 Uhr aktiv im Forum.
Ganz naiv:
- mit Browser von Internetexplorer und Login Tabelle holen
- mit "suchen" "Artikelname" (Spaltenname) "like%%" und Suchbegriff und "Daten zeigen von" Datensatz visualisieren
"ändern/bearbeiten" und im gewünschten Feld 1:1 БеЛ eintippen, Spalte links davon mit Auswahl NULL / (leer) / + / SQL auf (leer)
- speichern
Ich brauche also weder im Adminer 4.3.1 den Button SQL-Kommando noch das separate Programm SQL Server Management Studio dazu
Ich habe begriffen, dass das so falsch ist. Entweder brauche ich den HTML Encoder von SQLHTTP.NET oder ich muss die Eingabe in die Felder mit SQL Kommandos machen, wobei es mir noch nicht ganz klar ist wie.
Zitat von @ukulele-7:
DECLARE @string NVARCHAR(10);
SET @string = N'Б'
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
--Б Б</code>
Muss ich nun für jeden einzelnen Buchstaben eine Variable (@string) definieren, ihr den dezimalen Unicode zuweisen und mit Select ....die Konvertierung vornehmen? DECLARE @string NVARCHAR(10);
SET @string = N'Б'
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
--Б Б</code>
Wie gelangt die Konvertierung ins richtige Feld des Datensatzen?
Muss da nur der Cursor drin stehen?
Entschuldige meine naiven Fragen..
Vielen Dank für Deine Präzisierung
Gruss Berner
LÖSUNG 03.04.2021 um 20:06 Uhr
Vermutlich klapp auch die vereinfachte Eingabe (gemäss stack overflow):
select cast(cast(''Б' as xml) as nvarchar(10))
Gruss von Berner
select cast(cast(''Б' as xml) as nvarchar(10))
Gruss von Berner
LÖSUNG 03.04.2021 um 23:09 Uhr
Datenbank mit Browser geöffnet:
Wenn ich im Adminer folgende SQL Kommandos eingebe
select cast(cast(N'Б' as xml) as nvarchar(10));
oder
select cast(cast('Б' as xml) as nvarchar(10));
wird wohl oben im kleinen Antwortrechteck das Zeichen Б ausgegeben.
Wenn ich das Zeichen mit CTRL+C kopiere und in die Tabelle mit ändern/bearbeiten in die richtige Spalte einfüge sieht das Zeichen noch gut aus. Auch die weiteren Zeichen kann ich so anhängen. Wenn ich aber die Tabelle abspeichere und neu öffne sind in besagter Spalte wieder Fragezeichen.
Die Eingabe Deines Codes
DECLARE @string NVARCHAR(10);
SET @string = N'Б';
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
ergibt mir leider beim Ausführen folgenden Fehler 137 aus: < Must declare the scalar variable "@string" >
Habe im Netz noch die Bemerkung gefunden: Bei Abfragen mit dem SSMS soll die Ausgabe von GRID auf TEXT geändert werden, weil je nach Schriftart GRID den Unicode nicht richtig anzeigt. Mit CTR + T oder rechter Maustaste Result to text kann das behoben werden.
Wünsche Dir und Deinen Frohe Ostern
Berner
Wenn ich im Adminer folgende SQL Kommandos eingebe
select cast(cast(N'Б' as xml) as nvarchar(10));
oder
select cast(cast('Б' as xml) as nvarchar(10));
wird wohl oben im kleinen Antwortrechteck das Zeichen Б ausgegeben.
Wenn ich das Zeichen mit CTRL+C kopiere und in die Tabelle mit ändern/bearbeiten in die richtige Spalte einfüge sieht das Zeichen noch gut aus. Auch die weiteren Zeichen kann ich so anhängen. Wenn ich aber die Tabelle abspeichere und neu öffne sind in besagter Spalte wieder Fragezeichen.
Die Eingabe Deines Codes
DECLARE @string NVARCHAR(10);
SET @string = N'Б';
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
ergibt mir leider beim Ausführen folgenden Fehler 137 aus: < Must declare the scalar variable "@string" >
Habe im Netz noch die Bemerkung gefunden: Bei Abfragen mit dem SSMS soll die Ausgabe von GRID auf TEXT geändert werden, weil je nach Schriftart GRID den Unicode nicht richtig anzeigt. Mit CTR + T oder rechter Maustaste Result to text kann das behoben werden.
Wünsche Dir und Deinen Frohe Ostern
Berner
LÖSUNG 04.04.2021 um 20:32 Uhr
Schreibe mal:
VG
SH
SET @string = N'Б';
SH
LÖSUNG 04.04.2021 um 22:36 Uhr
Guten Abend SachsenHessi
Habe Code abgeändert und ein Semikolon eingefügt nach der Zahl. Meldet aber leider immer noch den selben Fehler
Gruss
Berner
Habe Code abgeändert und ein Semikolon eingefügt nach der Zahl. Meldet aber leider immer noch den selben Fehler
DECLARE @string NVARCHAR(10);
SET @string = N'Б';
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
Gruss
Berner
LÖSUNG 06.04.2021, aktualisiert um 16:58 Uhr
Hallo Berner,
Dein Code ist fehlerfrei, im SSMS funktioniert er. Das einzige, was ich mir jetzt vorstellen kann ist, daß Adminer jede Zeile einzeln abschickt und nicht das Skript als ganzes verarbeitet. Das kannst Du ausprobieren, indem Du die Zeilenumbrüche entfernst, also:
Du mußt die Zeichen auch nicht einzeln umwandeln, Du kannst alle Zeichen in einen String packen.
Aber Du willst das ja sowieso in eine Tabelle schreiben, dann geht das auch direkt über einen insert- oder update-Befehl:
Danke übrigens ukulele, das mit dem Umwandeln der HTML-Codes kannte ich noch nicht (hab ich aber bis jetzt auch noch nicht gebraucht).
Gruß, Mad Max
Dein Code ist fehlerfrei, im SSMS funktioniert er. Das einzige, was ich mir jetzt vorstellen kann ist, daß Adminer jede Zeile einzeln abschickt und nicht das Skript als ganzes verarbeitet. Das kannst Du ausprobieren, indem Du die Zeilenumbrüche entfernst, also:
DECLARE @string NVARCHAR(50); SET @string = N'БеЛьІй'; SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
Du mußt die Zeichen auch nicht einzeln umwandeln, Du kannst alle Zeichen in einen String packen.
Aber Du willst das ja sowieso in eine Tabelle schreiben, dann geht das auch direkt über einen insert- oder update-Befehl:
insert into Tabelle (Wert nvarchar (256)) values (cast (cast ('БеЛьІй' as xml) as nvarchar (256)))
update Tabelle set Wert = cast (cast ('БеЛьІй' as xml) as nvarchar (256)) where ...
Danke übrigens ukulele, das mit dem Umwandeln der HTML-Codes kannte ich noch nicht (hab ich aber bis jetzt auch noch nicht gebraucht).
Gruß, Mad Max
LÖSUNG 06.04.2021 um 16:47 Uhr
Hallo Mad Max
Danke für Deinen Beitrag. Ich habe über Ostern gearbeitet und nehme deshalb heute und ev. morgen frei und werde deshalb nicht sofort Stellung dazu nehmen können. Der Rechner steht nicht bei mir zuhause...
Gruss
Berner
Danke für Deinen Beitrag. Ich habe über Ostern gearbeitet und nehme deshalb heute und ev. morgen frei und werde deshalb nicht sofort Stellung dazu nehmen können. Der Rechner steht nicht bei mir zuhause...
Gruss
Berner
LÖSUNG 08.04.2021 um 22:44 Uhr
Hallo MadMax
Ich habe im SSMS mit dem von Dir angegebenen update Befehl den gewünschten Eintrag gemacht:
und mit der anschliessenden Überprüfung mit dem select Befehl
den richtigen gewünschten Eintrag erhalten: Белый
Ich habe den Eindruck, dass das die Lösung war. Mit Sicherheit weiss ich es erst morgen Freitagabend, da werde ich den Versuch mit der Drucksoftware machen, die diesen Tabellen-Eintrag in einem variablen Feld wiedergeben sollte. Melde mich dann nochmals.
Was die Eingabe ohne Zeilenumbrüche
anbelangt, die geht im SSMS prima, aber der adminer "schluckt" sie nicht: Fehlermeldung 2 x Must declare the scalar variable "@string"
Bei dieser Gelegenheit möchte ich auf einen wirklich gut beschriebenen Link für die wichtigsten SQL-Befehle hinweisen:
SQL_Update_Befehl
Inzwischen danke ich auch ukulele-7 und SachsenHesssi
Gruss aus dem Seeland in der Schweiz
Berner (Nicolas)
Ich habe im SSMS mit dem von Dir angegebenen update Befehl den gewünschten Eintrag gemacht:
update Tabellenname set Feldname/Spaltenname = cast (cast ('БеЛьІй' as xml) as nvarchar (256)) where Artikelname = 'Suchbegriff'
select Feldname/Spaltenname from Tabellenname where Artikelname = 'Suchbegriff'
Ich habe den Eindruck, dass das die Lösung war. Mit Sicherheit weiss ich es erst morgen Freitagabend, da werde ich den Versuch mit der Drucksoftware machen, die diesen Tabellen-Eintrag in einem variablen Feld wiedergeben sollte. Melde mich dann nochmals.
Was die Eingabe ohne Zeilenumbrüche
DECLARE @string NVARCHAR(50); SET @string = N'БеЛьІй'; SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
Bei dieser Gelegenheit möchte ich auf einen wirklich gut beschriebenen Link für die wichtigsten SQL-Befehle hinweisen:
SQL_Update_Befehl
Inzwischen danke ich auch ukulele-7 und SachsenHesssi
Gruss aus dem Seeland in der Schweiz
Berner (Nicolas)
LÖSUNG 09.04.2021 um 22:54 Uhr
Hallo MadMax, Hallo ukulele-7
Das Mysterium ist gelöst: Spezielle Einträge in einer SQL Tabelle, die in HTML-Kodierung (NCR dezimal) erfolgen müssen (Format ї), können nur via SSMS und entsprechenden Befehlen wie update oder insert gemacht werden.
Beispiel:
Solche Einträge können nicht mit einem Internet-Browser erfolgen.
Viele einfache Anwender brauchen den Internet-Browser für Tabelleneinträge. Brauchen sie einen neuen Datensatz, nehmen sie den Ähnlichsten und klonen ihn.
Ganz bemerkenswert ist, dass nach einem Eintrag via SSMS der entsprechende Datensatz wohl noch mit dem Browser gesichtet werden kann, aber keine Änderungen mehr vorgenommen werden dürfen. Sobald nämlich dieser Datensatz im Browser-Modus abgespeichert wird, erscheinen in den Felder/Spalten mit den HTML-Einträgen Fragezeichen und die HTML-Einträge sind weg.
Für die Umwandlung von Zeichen zu HTML-Kodierung, bzw. Numeric Character Reference (NCR) dezimal, entweder dazu die notwendigen Werte dem folgendem Link durch Umwandlung entnehmen
Unicode_Zeichensaetze
oder wie von ukulele-7 und MadMax beschrieben mitumwandeln.
Danke für eure Mithilfe
Gruss Berner
Das Mysterium ist gelöst: Spezielle Einträge in einer SQL Tabelle, die in HTML-Kodierung (NCR dezimal) erfolgen müssen (Format ї), können nur via SSMS und entsprechenden Befehlen wie update oder insert gemacht werden.
Beispiel:
update Tabellenname set Feldname/Spaltenname = cast (cast ('БеЛьІй' as xml) as nvarchar (256)) where Artikelname = 'Suchbegriff'
Viele einfache Anwender brauchen den Internet-Browser für Tabelleneinträge. Brauchen sie einen neuen Datensatz, nehmen sie den Ähnlichsten und klonen ihn.
Ganz bemerkenswert ist, dass nach einem Eintrag via SSMS der entsprechende Datensatz wohl noch mit dem Browser gesichtet werden kann, aber keine Änderungen mehr vorgenommen werden dürfen. Sobald nämlich dieser Datensatz im Browser-Modus abgespeichert wird, erscheinen in den Felder/Spalten mit den HTML-Einträgen Fragezeichen und die HTML-Einträge sind weg.
Für die Umwandlung von Zeichen zu HTML-Kodierung, bzw. Numeric Character Reference (NCR) dezimal, entweder dazu die notwendigen Werte dem folgendem Link durch Umwandlung entnehmen
Unicode_Zeichensaetze
oder wie von ukulele-7 und MadMax beschrieben mit
DECLARE @string NVARCHAR(50); SET @string = N'БеЛьІй'; SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));
Danke für eure Mithilfe
Gruss Berner
LÖSUNG 12.04.2021 um 09:56 Uhr
Ja sry bin auch schwer beschäftigt und schreibe grade weniger.
Der Code war nur zur Veranschaulichung in SSMS und schreibt oder ließt erstmal nicht in der Tabelle, das müsste dann per UPDATE oder INSERT gemacht werden. Ich ging davon aus das du ein Front-End / Anwendung hast die die Tabelle mit Daten füttert und dort Probleme mit dem Zeichensatz entstehen. Natürlich kann prinzipiell jeder Client solche Probleme mit sich bringen aber auch ein Webclient müsste theoretisch in der Lage sein damit umzugehen.
Aber du hast es ja hin bekommen
Sollte es eine Randerscheinung bleiben kannst du dir mit cast() AS XML behelfen. Wenn du das öfters brauchst würde sich eventuell ein anderer SQL-Editor besser schlagen.
Der Code war nur zur Veranschaulichung in SSMS und schreibt oder ließt erstmal nicht in der Tabelle, das müsste dann per UPDATE oder INSERT gemacht werden. Ich ging davon aus das du ein Front-End / Anwendung hast die die Tabelle mit Daten füttert und dort Probleme mit dem Zeichensatz entstehen. Natürlich kann prinzipiell jeder Client solche Probleme mit sich bringen aber auch ein Webclient müsste theoretisch in der Lage sein damit umzugehen.
Aber du hast es ja hin bekommen