Inlägg

Inlägg som Christhebalrog har skrivit i forumet
Av Christhebalrog

Antar att du inte kodar xml-filen i flash, utan i typ notepad eller liknande? Det är den filen som måste ställas om. En smidig kodknackare är annars Notepad++ | 5.8.5 som även är gratis. Där väljer man bara "Encode in UTF-8" i Format-menyn.

Av Christhebalrog
Skrivet av Dosshell:

Varför inte javascript
1. Alla har inte javascript aktiverat
Man ska inte basera vitala funktioner för sidan på javascript. En hemsida ska gå lika bra utan som med javascript. Allt "krims krams" som inte är nödvändigt är perfekt för javascript.

2. Exponering
Du avslöjar för användaren hur många bilder det finns, vad de heter o.s.v. Det kan först se ganska oskyldigt ut och ganska bagatellartat men inom modern programmering anses det viktigt.

Du har kanske inte hört talats om AJAX? Det handlar om att minimera datatrafiken samtidigt som man maximerar serverkapaciteten. Kort och gott går det ut på att man endast hämtar data som behövs (i detta fallet endast bilderna) och inget annat, och detta med hjälp av XMLHttpRequest-objekt som är framtaget av W3C. Detta anser jag vara viktigt inom modern webbprogrammering, att hålla koll på vad standarder och rekommendationer säger. Summan av kardemumman är att det kan och det går att lösas med javascript. Av effektiviseringsskäl bör det lösas med javascript.

Skrivet av Dosshell:

Lösning med javascript?
Lät det jobbigt med php, asp eller liknande? Lugnt, det går att lösa det med javascript, inte vackert, men det går.

Enda nackdelen jag ser med serverside-språk är att du belastar servern mer än vad du egentligen behöver. Vid större webbsidor är det viktigt att tänka på.

Av Christhebalrog

Vad kodar du i för något program?
Filen måste vara kodad enligt UTF-8, det räcker inte att bara sätta encodingen i xml-taggen.

Av Christhebalrog
Skrivet av Dosshell:

Kan du accessa den lokalt från Fedora 10-maskinen?

Nej. Maskinen jag kör på har endast terminal. Dock så kan jag använda curl, men den returnerar inget svar. Detta är lite märkligt, eftersom jag inte ens får "couldn't connect to host"-meddelande vilket man får om man curlar en server som inte svarar...

Skrivet av Dosshell:

Vad säger netsat? Lyssnar den på 8080 ?

Icke. kör kommandot "netstat -vat" och får endast upp detta:

Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:ipp *:* LISTEN tcp 0 0 localhost:smtp *:* LISTEN tcp 0 0 192.168.0.2:ssh 192.168.0.3:49578 ESTABLISHED tcp 0 0 192.168.0.2:ssh 192.168.0.3:49536 ESTABLISHED tcp 0 0 *:ssh *:* LISTEN tcp 0 0 *:ipp *:* LISTEN tcp 0 0 localhost:mxi *:* LISTEN tcp 0 0 *:8009 *:* LISTEN tcp 0 0 *:webcache *:* LISTEN

De två SSH-anslutningarna är min koppling via putty...

Skrivet av Dosshell:

Har du kollat iptables?

Inget kommando jag använt tidigare... iptables -L får följande output:

Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ipp ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:https ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ipp ACCEPT udp -- anywhere anywhere state NEW udp dpt:ipp REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination

Är ju två stycken TCP-portar som säger sig acceptera http och https, men jag vet inte hur man tolkar denna info riktigt...

Av Christhebalrog

Tomcat under Fedora

Hej!

Jag försöker köra Tomcat 6 på en Fedora 10-maskin. Är inte superhaj på linux (vilket betyder att jag i princip inte kan nåt) så det kan vara något litet jag glömt.

För att hämta och installera tomcat körde jag

yum install tomcat6

och detta gick fint. Startade tjänsten sedan genom

service tomcat6 start

varpå jag får bekräftelse på att tjänsten startats. Detta visar sig också i loggfilerna där den tomcat talar om att den initieras, binder port 8080, och att den startat på runt 500ms.

Inga tecken på att det skulle vara något fel under uppstarten, men ändå så kan jag inte accessa http://192.168.0.2:8080 från min "vanliga" dator...

Någon som vet vad som kan vara ett problem?

Av Christhebalrog

Tror detta problem kan betraktas som löst.

Det visade sig att det inte var själva laddningen av klassen som var problemet, utan att det var i själva konstruktorn som problemet satt. Jag anropar en variabel i en klass som inte är tillgänglig i körningsögonblicket, så nu skall jag bara formulera om konstruktorn lite.

Tackar för all hjälp och alla tips!

Av Christhebalrog
Skrivet av KurreKula:

Inte hundra på hur de här funkar i java men kan det inte vara så att getInstance inte returnerar null utan ett standardobjekt om den inte hittar klassen?

Mycket möjligt att den skall göra det, men då borde ju inte jag få en nullpointer när jag anropar metoden getInstance(), utan snarare ett tomt objekt... Nullpointern uppträder på följande kodrad:

Object obj = classDef.newInstance();

Och eftersom referensen classDef använts tidigare (se tidigare postat kodexempel) så borde den referensen rimligtvis vara skild från null då ingen nullpointer uppträder där.

Problemet som jag ser det är att objektet classDef innehåller referenser till alla metoder som finns hos den klass den "håller". När man debuggar koden står klart och tydligt att arrayen med konstruktorer är null, och således blir det en nullpointer när den försöker skapa ett objekt med en "nullkonstruktor"...

Av Christhebalrog
Skrivet av jimih:

Finns det någon speciell anledning till att du inte loggar stacktracet så som koden ser ut nu? Om du inte har en reportError-metod i Framework-klassen som kan ta en Exception/Throwable som ett eget argument så bör du definitivt lägga till en sån.

Nej, faktiskt inte. Jag har nog bara glömt använda de metoderna, för jag har faktiskt metoder som tar in throwables som ett av argumenten. Skall faktiskt ändra detta nu så att man får all möjlig output. Tackar för tipset!

Skrivet av jimih:

Om de mystiska problemen fortsätter föreslår jag att du lägger in källkoden för hela java i eclipse (som en jar-fil, går att hitta på suns/oracles hemsida nånstans, dubbelkolla så du tar exakt rätt version), och sen konfigurerar upp remote-debugging mot din applikation så att du kan stega igenom koden direkt när den körs och se vad alla variabler har för värden etc, och förhoppningsvis se exakt vilket objekt som är null.

Har faktiskt javakoden attachad. Nu när jag stegade så ser jag lite mystiska saker. Det verkar som att den hittar klassen (eftersom den lyckas ladda namnet på klassen). Dock så lyckas den inte hitta några konstruktorer eller metoder. Dessa referenser står som null, och jag antar det är därför den smäller när den försöker anropa en defaultkonstruktor från en array (vilken är null)...

Här är min stacktrace, btw:

java.lang.NullPointerException at csun.framework.applications.CsunWebApplication.initConfiguration(CsunWebApplication.java:27) at csun.framework.applications.CsunWebApplication.<init>(CsunWebApplication.java:20) at csunApp.BlogTool.<init>(BlogTool.java:9) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at csun.framework.config.FrameworkApplication.loadApplications(FrameworkApplication.java:77) at csun.framework.config.FrameworkApplication.<init>(FrameworkApplication.java:23) at csun.framework.config.Framework.<clinit>(Framework.java:68) at org.apache.jsp.index_jsp._jspService(index_jsp.java:68) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:558) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) at java.lang.Thread.run(Thread.java:619)

Av Christhebalrog

Jo, det kanske. Tyvärr så är det inte så att jag inte vet hur man gör. Jag är redan familjär med konceptet, det är i implementeringen det går snett.

Skrivet av vg132:

Känns konstigt att du får en null pointer när classDef inte är null. Vad säger stack tracen? Den borde visa var i koden det smäller.

/Viktor

Precis min tanke! Jag har stegat igenom detta händelseförloppet en gång i eclipse, och kom fram till att det det smällde "långt ner" i koden... Har tyvärr inte tillgång till detta nu över helgen, men jag skall absolut köra en stacktrace och posta här!

Skrivet av Wishie:

Höll på att gorma med det här en hel del för några månader sedan, ska man inte anropa klassens konstruktor på något vänster? Via Class.getConstructor() eller så (sitter inte med koden framför mig så tar direkt ur minnet nu).

Både ja och nej. Man kan göra på flera sätt. Enligt definitionen hos metoden newInstance() så skall den returnera en ny instans av objektet genom anrop av default-constructorn, och kasta exception om sådan ej finnes.

Nu till det lite pinsamma... Detta har fungerat förut. Problemet uppstod i samband med att jag gjorde lite omstruktureringar i min kod, vilket gjorde att denna kodsnutten flyttades till en annan klassfil. Dum som jag är så har jag inte sparat några tidigare versioner, men efter denna händelse installerade jag SVN... Men det kan ju kanske hjälpa lite att känna till

Mvh
/Crille

Av Christhebalrog

Förstår att jag det var lite luddigt. Här kommer den delen av koden som fallerar... Delar upp den lite och försöker förklara vad jag gör...

Framework är en klass som sköter all rapportering till system och loggfiler. De har således inget med laddningen av filer att göra, utan är enbart till för att jag skall kunna debugga systemet och logga fel.

try{ wCL.addRepository(appJar.toURI().toURL().toString()); }catch(MalformedURLException muE){ Framework.reportError("Unable to add file to classloader repository. " + muE); }catch(IllegalArgumentException iaE){ Framework.reportError("The repository does not exist. " + iaE); }

Det som sker här är att jag lägger till sökvägen till min jarfil (som i detta fallet är variabeln appJar) till classloadern wCL (Webapp ClassLoader). Detta genererar ingen exception, utan funkar som tänkt.

try{ Class <?> classDef = wCL.loadClass(entryClass); Framework.reportInfo("Class '" + classDef + "' loaded into classloader..."); Object obj = classDef.newInstance(); // Will throw ERROR if the web application is not the same version or type. webApp = obj instanceof CsunWebApplication ? (CsunWebApplication) obj : null; }catch(Exception e){ Framework.reportError("Exception while initializing class: " + e); continue; }catch(Error e){ Framework.reportError("Fatal error while initializing class: " + e); continue; }

Här kommer felet. I try-satsen överst så är det den tredje raden (classDef.newInstance()) som kastar NullPointerException. Observera att raden ovanför (Framework.reportInfo()) där också ett anrop till classDef görs, fungerar felfritt och den returnerar namnet på den klassen jag har laddat.

Lite mer bakgrund:

Jag skriver ett webbbaserat administrationssystem som skall ha möjligheten att implementera olika moduler. Till dessa har jag ett interface som systemet är skrivet emot. Således skall denna metod ladda in en jarfil och behandla den begärda klassen genom interfacet. Hoppas det gav en lite klarare bild av vad jag försöker göra.

Mvh
Crille

Av Christhebalrog

Ladda klasser dynamiskt i Java

Hej!

Jag har stött på lite patrull när det gäller att dynamiskt ladda in klasser i Java. Det är så att jag jobbar på en modulbaserad webbsida, vilken dynamiskt skall kunna ladda in JAR-filer innehållande nya funktioner.

Det jag har gjort är att jag lokaliserar filen som det gäller, kontrollera att den existerar (dvs. att jag har rätt sökväg) samt ladda in klassen i den aktuella classloadern. När jag sen vill instansiera objektet via

objekt.newInstance();

erhålls en NullPointerException. Detta trots att jag tidigare kontrollerat att objektet är av rätt typ. Detta vet jag genom att anropa metoden

objekt.toString();

på objektet innan instansiering, vilket ger "rätt" resultat (namnet på den klass jag vill ladda. Således har Java tagit emot definitionen).

NullPointer är inte väntad eftersom jag anropar metoden på ett objekt som bevisligen finns, samt att om det var felanrop skulle det bli en InstantiationException eller IllegalArgumentException. Konstruktorn på objektet jag försöker instantiera är en defaultkonstruktor (utan argument, dvs).

Någon som känns vid detta problem?

Av Christhebalrog
Skrivet av You:

Förutsatt att det är en char som castas till en int. Här är det ju en char[36], den kan du inte casta till en int utan vidare.

Du har en poäng.

Av Christhebalrog
Skrivet av vb:

En CHAR(36) tar dubbelt så mycket plats som en binary(16) (minsta typen där en 128-bitars UUID får plats) så jag skulle inte kalla den effektiv direkt.. Om du kodar för att lära dig tycker jag helt klart du ska köra på binary.

Googlar man på uuid så kommer den här artikeln upp i toppen typ: http://www.mysqlperformanceblog.com/2007/03/13/to-uuid-or-not... Enligt den gick det 200 gånger långsammare med CHAR(36) än med autoincrement int.

Tackar för det. Skall kolla lite extra på det med binary, det verkar onekligen värt att läsa på mer om!

Skrivet av You:

Nej, det är det inte.

Inom vanlig programmering kan du ju casta mellan INT och CHAR utan vidare. Jag antog att man "sparade" de på samma sätt här.

Skrivet av You:

Om det händer så har du gjort fel. Ger man sina tabeller unika deskriptiva namn så händer inte det här. Ser man dessutom till att inte köra e.g. "SELECT *" utan specificerar kolumnerna man vill ha så händer det garanterat inte, förutsatt att man har en någorlunda vettig databasstruktur.

Absolut har man det. Se min tidigare post, jag menade vid migrering av databaser.

Skrivet av You:

Det här är bara relevant när du har flera olika databaser som du rutinmässigt mergear. är det, som du säger, viktigt att IDn inte krockar. Men mellan tabeller spelar det ingen roll, och ska man inte lägga ihop databaser på det här sättet finns det ingen större anledning att använda UUID.

Det är förmodligen av denna anledning som de kör uuid och inte auto-inc int. Men båda har, som sagt, sina fördelar. Allt beror ju på användningsområdet. UUID har väl sina starka fördelar vid många förfrågningar samtidigt, då ID:t kan skapas direkt i klienten, som nämndes tidigare.

Får kanske bestämma mig för att byta till auto-inc int Vi får se hur det blir. Såg att det fanns mycket att läsa om detta på nätet. Tydligen är det inte första gången frågan har dykt upp.

Av Christhebalrog
Skrivet av Teknocide:

Klart att INT används i stora databassystem; det är det mest felsäkra och effektivaste sättet att unikt identifiera en rad i en databastabell. Beroende på typen av tabell är det förvisso ibland lämpligare att att använda en annan sorts primärnyckel.

Vid JOINs kommer ditt scenario aldrig att uppstå. Endast när två separata databaser med identiska tabeller -- exempelvis en databas som relativt nyligen tömts omskapats och en tidigare backup med samma tabellstruktur -- ska kombineras får man nyckelkollisioner.

Det är möjligt att det används i stora databassystem. De enda större databassystem jag har någon insyn i är de min pappa jobbar med (MIO, LKAB, Getinge, etc) och där används GUID istället för INT, och som jag förstod det så är det där mycket viktigt att varje rad i varje tabell är given ett globalt unikt värde, eftersom det oftast är flera databaser inblandade som sköter samma typ av transaktioner.

Ta t.ex. ett kassasytem för ett stort företag. För att klara den enorma mängden transaktioner som genomförs per dag måste det spridas på flera databaser. Kan tänka mig kanske 1 per varuhus. När dessa sedan skickas till "huvudkontorets" databas för att sammanställa dagens försäljning, så hade det blivit extremt knepigt ifall det hade kommit 2 miljoner rader med samma tabell-id fast med olika innehåll. Detta problemet löses med UUID eftersom det genereras delvis mha datorns MAC-adress. Resultatet blir att alla 2 miljoner raderna är unika, och kan migreras utan vidare behandling. - Man sparar tid här, men förlorar tid vid insättningen i tabellen.

Notera att jag inte säger att auto-inc int är dåligt på något sätt. Det, liksom UUID har sina fördelar och nackdelar. I ett mindre projekt (som t.ex. mitt i detta fallet) där man bara har en databas inblandad så finns det kanske ingen praktisk anledning att använda något annat än auto-inc int. Samtidigt så blir det inga större förluster att använda UUID när det handlar om så små volymer.

Anledningen till att jag väljer UUID är för att jag lätt vill kunna delegera arbetet på flera (och olika) databaser, t.ex. X10, MS SQL, postgreSQL, MySql, DB2, m.fl. Det är alltså i rent "utbildningssyfte", och inte en ren prestandaåtgärd.

Av Christhebalrog
Skrivet av Teknocide:

CHAR(36) sparas som en trettiosex tecken lång sträng. Om vi antar att varje tecken är en byte har vi alltså en minnesstruktur som är nio gånger större än en INT. För att väga två strängar mot varandra jämförs tecken för tecken. Dvs. 36 jämförelser vs. en jämförelse för INT.

Den verkliga kickern är dock "dryga databasfel". Jag förstår inte vad du menar alls här: Om du "råkar" jämföra två helt orelaterade tabeller så är problemet större än att ID:n krockar med varandra. Varför, och hur, skulle två okompatibla tabeller kunna komma att jämföras med varandra? Varför är det positivt att det inte blir ID-krockar om jämförelsen är ett resultat av felaktig query, men främst, vad är fördelen med att ha globalt unika ID:n över en mängd tabeller? En primärnyckel SKA finnas i andra tabeller -- det är så man knyter dem samman.

Det blir fler jämförelser, det är sant.

Håller med om att argumentet om "dryga databasfel" var lite missvisande. Det jag menar var ifall du har flera tabeller ihopkopplade och varje tabell har ett enskilt nummer kopplat till sig (som återfinns i andra tabeller) så kan det enklare uppstå "felkopplingar" vid t.ex. sammanslagning av tabeller. Då uppkommer problemet att du får samma ID på två ställen som refererar till olika poster. Detta blir inte fallet med UUID, då den är universiellt unik.

Detta är förmodligen även en av anledningarna till att auto-inc INT inte används ute i de större databaserna.

Av Christhebalrog
Skrivet av Teknocide:

Vilka fördelar ger det dig?
edit: ok, jag läste ovan. Gör som du tycker är bäst; personligen skulle jag använt INTs på grund av snabbhet och enkelhet.

När det gäller snabbhet så är kanske INT snabbare (borde ju vara), men jag tror inte det handlar om direkt långa fördröjningar. Vore ju trevligt att se siffror på detta. Som det är nu lagrar jag nyckeln i en CHAR(36), vilket egentligen är INT med en annan formatering. Vet dock inte hur databasen i sig lagrar det, det skiljer nog mellan olika databasmotorer...

Jag vet inte om det är så mycket mer enkelt att använda auto-inc INT. Som det är nu så har jag möjlighet att skapa UUID via programkoden (Java) alternativt direkt i databasanropet (mha funktionen UUID()). Plus att vid många tabeller behöver man inte oroa sig för dryga databasfel som uppstå pga att man förväxlat två tabellers id, vilket i fallet med INT resulterar i ett felaktigt svar (eftersom id:t med största sannolikhet existerar i båda tabeller)

Funderar dock på vad som är smidigast att spara UUID:er som i databasen? Jag använder, som jag tidigare nämnt, CHAR(36) för att det är en "primitiv datatyp" (iaf inom många programspråk) så det borde inte vara så mycket over-head. Nån som har koll på detta?

Av Christhebalrog
Skrivet av iXam:

Varför? Vad för slags app/db är det du fnular på?

Av den enkla anledningen att med UUID så blir nyckeln unik i hela databasen istället för bara i tabellen.

Av Christhebalrog
Skrivet av iXam:

Då tycker jag du ska fråga honom om detta. Och du får gärna rapportera tillbaka här med en förklaring för jag är nyfiken.

Sen kan det ju vara så att UI (eller GUI) har sin plats om det är så att flera databaser snabbt ska kunna spara en vissa data och ändå kunna indexera dessa unikt.

Ett databasschema/setup skiljer ju sig lite från "Jockes" CS-clansida mot en internationell banks

Svaret är helt enkelt att en UUID/GUID genereras för att vara unik "i tid och rum", det vill säga att det är i princip omöjligt att generera den igen (vilket inte är fallet med INT). Detta hade fördelar när man arbetar med många och stora databaser, då man ofta har många olika tabeller vars nycklar helt enkelt måste vara unika. I fallet med integer blir ju dessa inte unika då du i så fall börjar på 1 i varje ny tabell.

Skrivet av hagbarddenstore:

Dom använder nog GUID då... En ganska bra anledning till detta är att man kan skapa unika nycklar och använda dessa direkt vid klienten utan att behöva anropa databasen. Då kan man även optimera INSERT på relationer en hel del.

T.ex:

INSERT INTO [Users] ([Id], [Username]) VALUES ('000000-0000-0000-000000', 'Username'); INSERT INTO [Posts] ([Id], [User], [Text]) VALUES ('000000-0000-0000-000000', '000000-0000-0000-000000', 'Kalle Erik Petter');

Gentemot:

DECLARE @UserId INTEGER; INSERT INTO [Users] ([Username]) VALUES ('Username'); SET @UserId = SCOPE_IDENTITY(); INSERT INTO [Posts] ([User], [Text]) VALUES (@UserId, 'Kalle Erik Petter');

Kanske inte riktigt visar fördelen iofs... Men tänk dig att du ska spara ner en herarki på 1000-2000 objekt. Det blir GANSKA många frågor mot databasen. Kör man exempelvis en ORM så kan det handla om ÄNNU fler frågor.

En till fördel är att man kan cacha framtida frågor, t.ex så kan du vänta tills du har 10,000 objekt att spara innan du frågar databasen.

Detta går även att ordna med Hi/Lo-algoritmen som använder vanliga siffror.

Precis, där ligger förmodligen också en del. Som jag har förstått det så genereras UUID/GUID utifrån unix-timestamp, randomnummer (frö) och datorns id (typ ethernet-mac). Även om sannolikheten finns att denna 128-bitars nyckel inte skulle vara unik (även i en enorm databas), är den nog i likhet med att hitta ett riskorn i vårt solsystem...

Kan även tillägga att jag nu på nytt bestämt mig för att använda UUID istället för INT som primärnycklar.

Av Christhebalrog
Skrivet av Leedow:

Källa: MySQL :: MySQL 5.0 Reference Manual :: 13.2.14 Restrictions on InnoDB Tables

Nog för att Teknocide talade klarspråk. Jag ville bara komma med en officiell källa på hur stor en BIGINT faktiskt är.

Haha, du har alldeles rätt!

Skrivet av iXam:

*Smidigast* ÄR att använda en numretisk columntyp som du kan göra auto increment på. Ska du hitta på något mer *osmidigt* kommer du själv få sköta kollissionshantering/uppräkning osv. Kan det vara så att du tycker det ser tuffare/mer ELiTE ut med hex?

Nej, det har inget med att det ser "tuffare" ut. Min far jobbar nämligen med databaser i ganska stor skala (affärssystem och transaktionssystem) och vad jag har sett så kör de med "unique identifier" istället för auto-inc int. Antar att det finns en anledning till detta. Sedan kör de ju inte mysql i produktionsmiljöerna, tror det är oracle som är den stora hos dem.

Skrivet av vb:

Först ska du nog fundera på varför du inte vill ha en int som primary key, och vad det är du vill ha istället.

Men även om du är säker på din sak känns inte CHAR som rätt typ att spara i. Bara namnet på typen får varningsklockorna att ringa, du vill ju inte spara ner ett ord eller en lista på bokstäver, utan det du vill spara är någonting annat, ett ID. Typen på kolumnen ska säga vad den innehåller om möjligt och i det här fallet finns bättre alternativ.

CHAR är inte bra därför att den dels uppmuntrar att du sparar ner din hex-sträng som en sträng, tex 'AFCD' i en CHAR(4) och det vore ju väldigt onödigt prestanda och platsmässigt så det hoppas jag inte någon som pratade om CHARs tänkte föreslå

Om du istället sparar ner hexen som sina värden, dvs i mitt AFCD-exempel talet 45005, i en CHAR(2) så får du andra jobbiga problem. Sätter du inte binary som collation/charset på CHAR-kolumnen så är det bäddat för problem, ganska jobbigt om tex collation-inställningen är en som inte gör skillnad på A och a... Eller det faktum att du inte kan ge IDt till en annan person utan att se till att även den personen har rätt collation i databasen. Eller att om du skickar in 'AF' till en CHAR(4) så lägger MySQL in mellanslag istället för 0or för att fylla ut till 4 bytes.

Istället kan du använda BINARY. Eller så är det helt enkelt enklare med en int eller bigint om du inte kan komma på någon bra anledning till att ha något större än 64 bitar

(ska påpeka att jag mest använder MSSQL så ta inlägget med en nypa salt och rätta mig om jag har fel)

Jag är nog relativt övertygad nu i alla fall. Jag kör på int som primary key. Skulle det otroliga hända, att jag får problem med för lite rader så är det ett senare problem. Mycket senare problem...

Av Christhebalrog
Skrivet av Teknocide:

Den verkliga frågan är: räknar du med att din tabell kommer att ha mer än fyramiljardertvåhundranittiofyramiljonerniohundrasextiosjutusentvåhundranittiosex rader? Om svaret är ja behöver du köra BIGINT, annars inte.
Indexering på [VAR]CHARS (du vill troligtvis använda CHAR till en sträng med fast längd) ska inte bli direkt långsammare, jag gissar att databasen bygger upp någon sorts hashmap i bakgrunden. Däremot tar det ju extra utrymme och innebär overhead när hash-värdet för en rad ska räknas ut i samband med INSERT.

Haha, när du skriver det sådär så är det ju onekligen så att det verkar aningen för mycket. Fyra miljarder is the shit.

EDIT: Det är med unsigned du räknar då, antar jag? Annars så går det väl från -2^31 till +2^31?