berner
Goto Top

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. БеЛьІ&#1081 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

Content-ID: 665353

Url: https://administrator.de/contentid/665353

Ausgedruckt am: 23.11.2024 um 17:11 Uhr

ukulele-7
Lösung ukulele-7 02.04.2021 aktualisiert um 23:36:12 Uhr
Goto Top
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:
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));
--Б	Б
https://stackoverflow.com/questions/49817637/how-to-decode-html-encoded- ...
Berner
Berner 03.04.2021 um 19:24:47 Uhr
Goto Top
Hallo ukulele-7
Vielen Dank für Deine prompte Antwort. Ich bin jeweils erst so ab 18Uhr bis 23 Uhr aktiv im Forum.
Zitat von @ukulele-7:
Wie genau schreibst du die Zeichen in die Tabelle?
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));
--Б Б
Muss ich nun für jeden einzelnen Buchstaben eine Variable (@string) definieren, ihr den dezimalen Unicode zuweisen und mit Select ....die Konvertierung vornehmen?
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
Berner
Berner 03.04.2021 um 20:06:34 Uhr
Goto Top
Vermutlich klapp auch die vereinfachte Eingabe (gemäss stack overflow):

select cast(cast(''Б' as xml) as nvarchar(10))

Gruss von Berner
Berner
Berner 03.04.2021 um 23:09:28 Uhr
Goto Top
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'&#1041';
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
SachsenHessi
SachsenHessi 04.04.2021 um 20:32:51 Uhr
Goto Top
Schreibe mal:
SET @string = N'&#1041;';  
VG
SH
Berner
Berner 04.04.2021 um 22:36:04 Uhr
Goto Top
Guten Abend SachsenHessi
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'&#1041;';  
SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));


Gruss
Berner
MadMax
Lösung MadMax 06.04.2021 aktualisiert um 16:58:58 Uhr
Goto Top
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:
DECLARE @string NVARCHAR(50); SET @string = N'&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;'; 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 ('&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;' as xml) as nvarchar (256)))  
update Tabelle set Wert = cast (cast ('&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;' 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
Berner
Berner 06.04.2021 um 16:47:14 Uhr
Goto Top
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
Berner
Berner 08.04.2021 um 22:44:02 Uhr
Goto Top
Hallo MadMax
Ich habe im SSMS mit dem von Dir angegebenen update Befehl den gewünschten Eintrag gemacht:
update Tabellenname set Feldname/Spaltenname = cast (cast ('&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;' as xml) as nvarchar (256)) where Artikelname = 'Suchbegriff'  
und mit der anschliessenden Überprüfung mit dem select Befehl
select Feldname/Spaltenname from Tabellenname where Artikelname = 'Suchbegriff'  
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
DECLARE @string NVARCHAR(50); SET @string = N'&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;'; SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));  
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)
Berner
Berner 09.04.2021 um 22:54:45 Uhr
Goto Top
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 &#1111;), können nur via SSMS und entsprechenden Befehlen wie update oder insert gemacht werden.
Beispiel:
update Tabellenname set Feldname/Spaltenname = cast (cast ('&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;' as xml) as nvarchar (256)) where Artikelname = 'Suchbegriff'  
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 mit
DECLARE @string NVARCHAR(50); SET @string = N'&#1041;&#1077;&#1051;&#1100;&#1030;&#1081;'; SELECT @string,cast(cast(@string AS XML) AS NVARCHAR(10));  
umwandeln.
Danke für eure Mithilfe
Gruss Berner
ukulele-7
ukulele-7 12.04.2021 um 09:56:10 Uhr
Goto Top
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 face-smile 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.