09. juni 2003 - 16:26Der er
25 kommentarer og 1 løsning
Mysql, danske tegn
Jeg har problemer med de danske tegn i mysql. Problmet er at de har en forkert encoding eller sådan noget. Jeg kan ikke sammenligne et navn der står rigtigt i databasen som indeholder æøå med en anden streng med æøå. Eks. ser Århus således ud: Ã…rhus . Hvordan sætter jeg hvilken encoding den skal læse med således at det er muligt at sammenligne to strenge. Den streng der skal sammenlignes med, er en hjemmeside. Dvs. om ordet står på denne side (urls[] er et array over alle de hjemmesider den skal læse fra ):
for(int i=0;i<urls.length;i++){ URL liste = new URL(urls[i]); BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream())); String inputLine; String sqlTxt="SELECT navn from tabelnavn"; try{ while ((inputLine = in.readLine()) != null){ ResultSet r=DriverManager.getConnection(url).createStatement().executeQuery(sqlTxt); while(r.next()){ if(inputLine.indexOf(r.getString("navn"))>0){...
Håber der er en der ved hvordan man skal håndtere disse tegn.
Prøv at udføre kommandoen mysqladmin -u root -p show variables og kig efter character_set, der står hvad der bruges, hos mig står der latin1 (der er det samme som iso-8859-1), og under character_sets står der hvilke karaktersæt der understøttes.
Hvis jeg henter fra databasen har søndag værdien: (83, -61, -72, 110, 100, 97, 103). Mens den fra en hjemmeside har værdien: (83, -17, -65, -67, 110, 100, 97, 103)
Jeg får også latin one. Skrevet til consollen får jeg Århus men til en fil noget mærkeligt noget.
Jeg har ikke behov for at gemme i en fil pt. Kun at sammenligne med en hjemmeside. Grunden til at jeg skrev at det var anderledes i en fil var at jeg redirectede outputtet (med >) fra skærmen til en fil så jeg havde lidt bedre tid til at læse det.
Prøv at køre det her: import java.net.*; import java.io.*; import java.sql.*;
public class test { public static void main(String[] args) throws Exception { String url = "jdbc:mysql://localhost/aktier?user=root"; Class.forName("org.gjt.mm.mysql.Driver");
String sqlTxt; sqlTxt="SELECT navn from aktier";
try{ URL liste = new URL("http://www.xcse.dk/dk/aktier/25/index.asp"); BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream())); String inputLine; while ((inputLine = in.readLine()) != null){ if(inputLine.indexOf("Søndagsavisen")>0){ System.out.println(inputLine); System.out.println(inputLine.substring(200,206)); } } byte[] b = {83, -17, -65, -67, 110, 100, 97, 103}; System.out.println("XCSE:" + new String(b, "UTF-8")); byte[] ba = {83, -61, -72, 110, 100, 97, 103}; System.out.println("DB:" + new String(ba, "UTF-8")); } catch(Exception e){System.out.println(e);} } } Det kan være det hjælper.. (Måles er at lave min egen database med historisk data over mine aktier, uden at gøre det manuelt hver uge)
BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(), "UTF-8")); BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(),"ISO-8859-1"));
BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(),"ISO-8859-1"));
Ser ud til at virke bortset fra at jeg får nogle java.lang.StringIndexOutOfBoundsException: String index out of range: -43 nu.. Meeeen det burde da være muligt at løse...:-)
Nu er der igen problemer med æøå i databasen. Det var ikke muligt at opdatere et felt med æøå i primærnøglen, dvs. i where-sætningen. Det problem løste jeg efter mange hårde timer ved at opdatere min connection-driver til nyeste version "mysql-connector-java-3.0.8" istedet for min gamle "mm.mysql-2.0.11". Dette løste problemet. Dog er der opstået et nyt. De data jeg henter er i et forkert format så jeg ikke længere kan sammenligne med det fra min BufferedReader!!!:-( Jeg er ret træt af danske tegn. Er det virkeligt nødvendigt at konvertere frem og tilbage hver gang, og hvor mange tegn skal så konverteres? (æøåÆØÅ - men hvad med é og andre special tegn)
Jeg har testet det både i Windows og linux, og fejlen går igen begge steder!
Hvis ÆØÅ virker med noget encoding så vil det formentlig være alle de sprog-specifikke (ihvertfald vesteuropæiske) tegn der OK:
Det er specielt på nyere Linux med Java at det driller - jeg har en mistannke om at Linux og Java folket ikke har fået koordineret skiftet fra ISO-8859-1 til UTF-8 godt nok.
Og resultatet er et mareridt for programmørerne.
Når nu du har opdateret driver så starter du forfra !
HEHE så virker det! BufferedReader in = new BufferedReader(new InputStreamReader(liste.openStream(), "ISO-8859-1"));
og
new String(r.getBytes("navn"), "UTF-8")
og om den så ikke dæleme knurme vil have new String(key.getBytes(), "ISO-8859-1") når man skriver det i where-sætningen i sin update...
Ja den var jo ikke sådan lige at lure.. tak for hjælpen... den trak altså også hår ud!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.