Re: character encoding problems

Ronald Klop <[email protected]> Tue, 22 May 2007 12:53:55 +0200 (CEST)
Newsgroups gmane.comp.db.mysql.java
Message-ID <29112914.6541179831235882.JavaMail.tomcat@localhost>
On Tue May 22 06:35:21 CEST 2007 Daniel Kirk <[email protected]> wrote:
> Hi There,
> 
> I'm having troubles trying to convert 'everything' to UTF-8 format.
> 
> I'm using the db drivers from /mysql-connector-java-3.1.11-bin.jar 
> connected to a version 5.0.27 database on a linux platform.
> 
> I get a lot of data containing characters in multiple languages eg 
> Swedish (as below), Norwegian, Greek etc
> 
> Firstly, I have robots downloading data off the 'net. They should be 
> using UTF-8 encoding:
> br = new BufferedReader(new InputStreamReader(is, 
> "UTF-8"));
> 
> The robots then put some names of sports teams in a db, and they seemed 
> to be stored as you'd hope:
> mysql> select * from MissingTeams where competitionid = 336;
> +----------------------+---------------+-------------+
> | team | competitionid | bookmakerid |
> +----------------------+---------------+-------------+
> | B?linge | 336 | 54 |
> | Sunnan? SK | 336 | 54 |
> | KIF ?rebro DFF | 336 | 54 |
> | Kopparbergs/G?teborg | 336 | 54 |
> | Falk?pings KIK | 336 | 54 |
> | LdB FC Malm? | 336 | 54 |
> | Ume? IK | 336 | 54 |
> | Link?pings FC | 336 | 54 |
> +----------------------+---------------+-------------+
> 
> 
> But when I read this in through a result set, the encoding problem kicks in:
> 
> I'm just using a simple system.out.println:
> while(rs.next()) {
> String team = rs.getString(1);
> if (competitionid == 336) System.out.println("alias is : 
> " + team);
> 
> Which produced output like:
> 
> alias is : B???linge
> alias is : Falk???pings KIK
> 
> So I tried connecting using this as part of the query string: 
> &characterEncoding=UTF-8
> 
> Which did not have any effect at all.
> 
> So I tried setting all the character set variables before my query.
> 
> Databases.executeUpdate("set character set 'utf8'", con);
> Databases.executeUpdate("set character_set_connection = 
> 'utf8'", con);
> Databases.executeUpdate("set character_set_database = 
> 'utf8'", con);
> Databases.executeUpdate("set character_set_server = 'utf8'", 
> con);
> 
> And the output from my query changed, but still not right:
> alias is : B??linge
> alias is : Falk??pings KIK
> 
> So what I did next was change the character set variables where I add 
> the data into the "Missing Teams" table as above - so that its 
> Connection also used 'UTF-8'.
> 
> The result was that the characters were converted into a ? into the db:
> 
> mysql> select * from MissingTeams where competitionid = 336;
> +----------------------+---------------+-------------+
> | team | competitionid | bookmakerid |
> +----------------------+---------------+-------------+
> | B?linge | 336 | 54 |
> | Sunnan? SK | 336 | 54 |
> | KIF ?rebro DFF | 336 | 54 |
> | Kopparbergs/G?teborg | 336 | 54 |
> | Falk?pings KIK | 336 | 54 |
> | LdB FC Malm? | 336 | 54 |
> | Ume? IK | 336 | 54 |
> | Link?pings FC | 336 | 54 |
> +----------------------+---------------+-------------+
> 
> Does anyone have any suggestions how I can write the data to the db 
> using the correct encoding, and read it back out also using the correct 
> encoding?
> 
> thanks
> 
> -- 
> Daniel Kirk
> Managing Editor
> -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-
> web: http://www.sportspunter.com
> http://www.toptipper.com
> http://www.pickswarehouse.com
> email : [email protected]
> phone : +61(0)410 409 237
> fax : +61(0)2 66462847
> Internet Digital Media Australia
> ABN : 51275059681
> -~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- 
> 
> 
> -- 
> MySQL Java Mailing List
> For list archives: http://lists.mysql.com/java
> To unsubscribe: http://lists.mysql.com/[email protected]
> 
There are a lot of places where this can go wrong.
Check on every boundary between systems if the charset is handled correctly.

- Is the remote side sending you correct UTF-8?
- Is the data correct in the database? Send your 'SHOW VARIABLES' and 'SHOW CREATE TABLE ...'.
- When you read data from the database is it correct?
- Does your System.out.println() print the data correct. (if you have unix, does your xterm understand UTF-8?)

In stead of printing the String you can print the values of the bytes of String.getBytes("UTF-8"). So you are sure, the byte codes are correct.

Ronald.