mboost-dp1
Unicode eller non-Unicode
- Forside
- ⟨
- Forum
- ⟨
- Tagwall
Jeg sidder og bøvler med at konvertere en access db til en mssql db og der er jo en god portion flere datatyper til hver kolonne
Nu er jeg så løbet ind i det problem, at jeg ikke kan huske om jeg skal bruge nvarchar (non-Unicode) eller varchar (unicode)
Jeg har brugt nvarchar og så det som en selvfølge, men kan se på en anden mssql database jeg har lavet, bruger jeg varchar.. og så blev jeg jo i tvivl
Siden der skal bruge databasen bruger charset iso-8859-1 (hvis det har nogen relevans) og der kan gemmes æøå i databasen, men oftest bliver det lavet om til ø osv.
Hvad skal jeg bruge? Og hvorfor?
Jeg har en liste over datatyperne her: http://msdn.microsoft.com/en-us/library/aa258271.a..., men de giver ikke megen hjælp
Nu er jeg så løbet ind i det problem, at jeg ikke kan huske om jeg skal bruge nvarchar (non-Unicode) eller varchar (unicode)
Jeg har brugt nvarchar og så det som en selvfølge, men kan se på en anden mssql database jeg har lavet, bruger jeg varchar.. og så blev jeg jo i tvivl
Siden der skal bruge databasen bruger charset iso-8859-1 (hvis det har nogen relevans) og der kan gemmes æøå i databasen, men oftest bliver det lavet om til ø osv.
Hvad skal jeg bruge? Og hvorfor?
Jeg har en liste over datatyperne her: http://msdn.microsoft.com/en-us/library/aa258271.a..., men de giver ikke megen hjælp
Nu er jeg så løbet ind i det problem, at jeg ikke kan huske om jeg skal bruge nvarchar (non-Unicode) eller varchar (unicode)
"n" i nvarchar står for uNicode og ikke non-unicode.
nvarchar fylder dobbelt så meget som varchar, men du kan gemme et langt større regnsæt med nvarchar end varchar.
I bund og grund kommer det an på hvad data du forventer du skal gemme..
#2 ja okay, fik lige byttet om på dem :) men med den viden i baghovedet at jeg gerne vil kunne tillade, men ikke særligt ofte bruge æøå i koden, hvilken skal jeg så vælge?
Kan nemlig se at ø forbliver stående korrekt i begge datatyper? Ihvertfald ifølge sql management studio
nvarchar, der er unicode, gemmer information om tegnsættet også, og derfor fylder det dobbelt så meget (lige meget plads, halvt så mange bogstaver), men hvad skal jeg bruge unicode til, hvis æøå stadig virker? Der kommer ikke til at optræde nogen latinske tegnsæt i databasen, de bliver alle ændret til deres html-entity
Kan nemlig se at ø forbliver stående korrekt i begge datatyper? Ihvertfald ifølge sql management studio
nvarchar, der er unicode, gemmer information om tegnsættet også, og derfor fylder det dobbelt så meget (lige meget plads, halvt så mange bogstaver), men hvad skal jeg bruge unicode til, hvis æøå stadig virker? Der kommer ikke til at optræde nogen latinske tegnsæt i databasen, de bliver alle ændret til deres html-entity
#3
Unicode og f.eks ISO-8859-1 er to forskellige måder er representere tegn på. Forskellen ligger i at unicode dækker over "alle" tegn i et tegnsæt, hvor ISO-8859-1 dækker over et subset af disse tegn.
Det er derfor begge typer kan begge ÆØÅ, da ÆØÅ er i ISO-8859-1
Som #2 siger så fylder unicode dobbelt så meget, så hvis de tegn du skal bruge ligger i et ISO tegnsæt, så kan du spare noget plads her. Du kan altid senere konvertere til unicode, hvis du får brug for tegn som ikke ligger i det ISO tegnsæt (oftest ISO-8859-1) som du vælger at bruge.
Unicode og f.eks ISO-8859-1 er to forskellige måder er representere tegn på. Forskellen ligger i at unicode dækker over "alle" tegn i et tegnsæt, hvor ISO-8859-1 dækker over et subset af disse tegn.
Det er derfor begge typer kan begge ÆØÅ, da ÆØÅ er i ISO-8859-1
Som #2 siger så fylder unicode dobbelt så meget, så hvis de tegn du skal bruge ligger i et ISO tegnsæt, så kan du spare noget plads her. Du kan altid senere konvertere til unicode, hvis du får brug for tegn som ikke ligger i det ISO tegnsæt (oftest ISO-8859-1) som du vælger at bruge.
æøå og de fleste hvis ikke alle tegn i det romerske alfabet er omfattet af iso-8859-1. Hvis du derimod får brug for specieltegn, japanske, kinesiske eller hebraiske tegn skal du bruge nvarchar.
Hvis du f.eks udelukkende skal have dansk og evt engelsk i din database, så er varchar fint tilstrækkeligt.
Du skal også op i en vis størrelse før det har nogen betydning at nvarchar fylder dobbelt så meget.
Jeg plejer at benytte nvarchar til alt bruger-input fordi jeg ikke ved hvad de ønsker at proppe ind på min tagwall, forum, kontaktformular eller lignende.
Hvis du f.eks udelukkende skal have dansk og evt engelsk i din database, så er varchar fint tilstrækkeligt.
Du skal også op i en vis størrelse før det har nogen betydning at nvarchar fylder dobbelt så meget.
Jeg plejer at benytte nvarchar til alt bruger-input fordi jeg ikke ved hvad de ønsker at proppe ind på min tagwall, forum, kontaktformular eller lignende.
Okay, dvs. at hvis jeg kun skal bruge tegn fra et iso-tegnsæt, så er nvarchar ikke nødvendig?
Hvis der, af uransagelige årsager, skulle snige sig et ikke iso-tegn ind, får brugeren så en fejl eller forsvinder de "ulovlige" tegn bare?
Hvis der, af uransagelige årsager, skulle snige sig et ikke iso-tegn ind, får brugeren så en fejl eller forsvinder de "ulovlige" tegn bare?
6 skrev:Okay, dvs. at hvis jeg kun skal bruge tegn fra et iso-tegnsæt, så er nvarchar ikke nødvendig?
Korrekt. I så fald er narchar tilstrækkeligt.
6 skrev:Hvis der, af uransagelige årsager, skulle snige sig et ikke iso-tegn ind, får brugeren så en fejl eller forsvinder de "ulovlige" tegn bare?
De vil enten ikke blive vist, eller blive vist forkert. F.eks i form af et spørgsmålstegn eller en firkant. Brugeren får ingen fejl i den forbindelse.
Okay, det er fuldstændigt til at acceptere :) tak for hjælpen
Nu vi er ved den database, så har jeg oplevet et problem, jeg aldrig før har set.. jeg har en kolonne med text (samme problem ved ntext), der indeholder noget html (fra en editor), men når det skrives ud, er det totalt tomt..
Ingen fejl, ingen mærkelige output, bare ingenting - hvorfor?
Nu vi er ved den database, så har jeg oplevet et problem, jeg aldrig før har set.. jeg har en kolonne med text (samme problem ved ntext), der indeholder noget html (fra en editor), men når det skrives ud, er det totalt tomt..
Ingen fejl, ingen mærkelige output, bare ingenting - hvorfor?
Har lige undersøgt det lidt nærmere.. værdien er ikke null, men den har en længde på 0.. Indholdet bliver ikke trukket ud andre steder fra det recordset
Koden ser sådan her ud:
Den boolean kolonne jeg tjekker for i InformationsBox virker. Den midterste række er en boks og den bliver postet som en boks (if sætningen er sand)
Andre tekster på siden virker, men alle text-kolonner virker ikke
Koden ser sådan her ud:
strSQL = "Select * from viewInformations order by InformationsPriority asc"
Set rs = objConn.Execute(strSQL)
If NOT rs.EOF then
Do
If rs("InformationsBox") then
Response.write "<div class=""box"">" & rs("InformationsContent") & "</div>"
Else
Response.write rs("InformationsContent")
End if
rs.MoveNext
Loop while NOT rs.EOF
End if
Den boolean kolonne jeg tjekker for i InformationsBox virker. Den midterste række er en boks og den bliver postet som en boks (if sætningen er sand)
Andre tekster på siden virker, men alle text-kolonner virker ikke
For lige at gøre det endnu mere mærkeligt, så har jeg nu fundet ud af, at hvis jeg trækker kolonneværdierne ud uden at bruge all (*), så virker det HVIS text kolonnen er angivet til sidst!
Jeg læste så en post på asp.net forums, der skrev at man bare skulle lave en varchar(max), der burde tillade samme datamængde - det har jeg så gjort, men problemet fortsætter, hvilket er endnu mere mærkeligt, da andre varchars fungerer, men ikke dem der står til max
Det virker altså som om det er kolonner med datamængder over en bestemt størrelse, er påvirket af problemet og ikke bare fordi det er en text kolonne
Jeg læste så en post på asp.net forums, der skrev at man bare skulle lave en varchar(max), der burde tillade samme datamængde - det har jeg så gjort, men problemet fortsætter, hvilket er endnu mere mærkeligt, da andre varchars fungerer, men ikke dem der står til max
Det virker altså som om det er kolonner med datamængder over en bestemt størrelse, er påvirket af problemet og ikke bare fordi det er en text kolonne
Jeg har svært ved at gennemskue problemet, da der er en sammenblanding af flere forskellige elementer der giver et resultat der ikke virker.
I din sample kode skriver du noget ASP.NET i VB.NET. Resultatet kommer ud i noget HTML og data bliver trukket ud fra en SQL server.
I samme sample kode bliver der refereret til nogen variable som ikke er erklæret i sample koden hvilket får mig til at gætte på variable typerne, dog uden at vide dem med sikkerhed.
Til slut er jeg i tvivl om dit spørgsmål går på om du skal bruge UNICODE eller single character strings, men du skriver også at du har problemer med at trække resultatet ud.
Hvis jeg var i samme situation ville jeg gribe situationen an således:
1) Først beslutte at bruge NVARCHAR, da de kan indeholde tegn fra Asien.
2) Bruge management studio til at kigge i databasen efter om værdierne i tabellerne er det som det formodes de er.
3) Hvis der er views involveret så checke om der kommer det rigtige resultat ud af dem.
4) Skrive indholdet fra hver felt ud i et simpelt format, uden nogen HTML elementer. At bruge debug output ville også være et godt sted at prøve.
5) Køre koden i en debugger og se på værdierne i hver variabel.
6) Læse felt værdierne ind i en variabel inden de bliver skrevet ud, så det er lettere at læse værdien mens programmet bliver kørt i en debugger.
I din sample kode skriver du noget ASP.NET i VB.NET. Resultatet kommer ud i noget HTML og data bliver trukket ud fra en SQL server.
I samme sample kode bliver der refereret til nogen variable som ikke er erklæret i sample koden hvilket får mig til at gætte på variable typerne, dog uden at vide dem med sikkerhed.
Til slut er jeg i tvivl om dit spørgsmål går på om du skal bruge UNICODE eller single character strings, men du skriver også at du har problemer med at trække resultatet ud.
Hvis jeg var i samme situation ville jeg gribe situationen an således:
1) Først beslutte at bruge NVARCHAR, da de kan indeholde tegn fra Asien.
2) Bruge management studio til at kigge i databasen efter om værdierne i tabellerne er det som det formodes de er.
3) Hvis der er views involveret så checke om der kommer det rigtige resultat ud af dem.
4) Skrive indholdet fra hver felt ud i et simpelt format, uden nogen HTML elementer. At bruge debug output ville også være et godt sted at prøve.
5) Køre koden i en debugger og se på værdierne i hver variabel.
6) Læse felt værdierne ind i en variabel inden de bliver skrevet ud, så det er lettere at læse værdien mens programmet bliver kørt i en debugger.
#14 jeg burde nok oprette en ny tråd til mit nye spørgsmål.. men unicode tvivlen er afgjort :)
Det eneste problem jeg har nu er det med databaseudtrækket - det er forresten classic asp
Så vidt jeg kan se, så er der ingen variabler, der kommer udefra det kodestykke .. ud over objConn, der er min database forbindelse.. og det er et objekt hvis du er i tvivl
Recordset kolonnen InformationsBox er en boolean, der bestemmer om indholdet skal ind i en boks eller ej.. den virker
Kolonnen InformationsContent er den lange tekst-streng jeg har, nogle gange med massivt meget html i.. (ikke mere end der er plads til det i varchar(max) eller text)
Men som beskrevet, så er kolonnen tom (ikke null) når jeg trækker den ud på normal vis.. MED MINDRE - og nu kommer det mest mærkelige: Jeg angiver alle kolonner jeg vil bruge og angiver InformationsContent som det sidste, der bruges
Kolonnen InformationsPriority (tinyint - 0 til 255) trak jeg ud efter InformationsContent, men skrev den ikke ud i den test.. og der kom Content ud, som det skulle.. men hvis jeg så angiver InformationsContent (via sql-strengen) før et element jeg skal skrive ud, så er den tom
Det virker altså, hvis InformationsContent er det sidste element, der trækkes ud af database.. why, i really dont know! :S
Det eneste problem jeg har nu er det med databaseudtrækket - det er forresten classic asp
Så vidt jeg kan se, så er der ingen variabler, der kommer udefra det kodestykke .. ud over objConn, der er min database forbindelse.. og det er et objekt hvis du er i tvivl
Recordset kolonnen InformationsBox er en boolean, der bestemmer om indholdet skal ind i en boks eller ej.. den virker
Kolonnen InformationsContent er den lange tekst-streng jeg har, nogle gange med massivt meget html i.. (ikke mere end der er plads til det i varchar(max) eller text)
Men som beskrevet, så er kolonnen tom (ikke null) når jeg trækker den ud på normal vis.. MED MINDRE - og nu kommer det mest mærkelige: Jeg angiver alle kolonner jeg vil bruge og angiver InformationsContent som det sidste, der bruges
Kolonnen InformationsPriority (tinyint - 0 til 255) trak jeg ud efter InformationsContent, men skrev den ikke ud i den test.. og der kom Content ud, som det skulle.. men hvis jeg så angiver InformationsContent (via sql-strengen) før et element jeg skal skrive ud, så er den tom
Det virker altså, hvis InformationsContent er det sidste element, der trækkes ud af database.. why, i really dont know! :S
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.