mboost-dp1

Unicode eller non-Unicode


Gå til bund
Gravatar #1 - karga
20. aug. 2008 08:04
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
Gravatar #2 - milandt
20. aug. 2008 08:38
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..
Gravatar #3 - karga
20. aug. 2008 08:53
#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
Gravatar #4 - plazm
20. aug. 2008 09:02
#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.
Gravatar #5 - milandt
20. aug. 2008 09:05
æøå 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.
Gravatar #6 - karga
20. aug. 2008 09:08
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?
Gravatar #7 - milandt
20. aug. 2008 09:18
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.
Gravatar #8 - karga
20. aug. 2008 09:31
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?
Gravatar #9 - Windcape
20. aug. 2008 09:35
Visuelt Output, eller slet intet output at all ? (View Source)
Gravatar #10 - karga
20. aug. 2008 09:39
Nothing at all.. jeg har ikke testet for null eller ingenting, men kunne forestille mig det er null
Gravatar #11 - karga
20. aug. 2008 10:29
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:
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
Gravatar #12 - karga
20. aug. 2008 11:06
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
Gravatar #13 - karga
21. aug. 2008 10:15
*Bump*

Ingen der kender problemet?
Gravatar #14 - Mort
21. aug. 2008 11:01
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.
Gravatar #15 - karga
21. aug. 2008 11:19
#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
Gå til top

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.

Opret Bruger Login