2014-10-22 4 views
1

Java의 MySQL 데이터베이스에 UTF-8로 저장된 문자열을 검색하려고합니다.MySQL Java Connector UTF8 인코딩 문제

파이썬에서 또는 명령 줄을 통해 검색하면 올바른 인코딩이 생성되고 모든 특수 문자가 나타나게됩니다. 그러나 자바에서 검색 한 후에는 대부분의 특수 문자가 엉망이됩니다.

결과는 다음과 같습니다 RT @okay_password : A-à¸μà¹à¹ € à £ า๠€ à¸à¹ ‡ บ๠€ à £ า๠€ สà¸μภ¢ à¹åà¸à¸à¹ ‡ à¹,à¸-ภ© ๠€ ¸, า๠"ม๠¹"ภ"๠‰ à¸à¸μà¸à¸ à¸à¸μà¸à¸ à¸à à¹à¸ ™ à¹à ¸«¸¸ ภ° à¸à¹ ‡ ๠€ ภ๠‡ ภ™ à¸à¸ ¢ ูà¸å¸¸ààา๠€ à¸àา๠"ม๹¹"ภ"à ¹ ‰ ๸¸"ภ£ ์๠€ ¸ £ à¸ à ¸ ¸ ¸ à¹à¹ € ภ£ à¸à ¸ ¸ ¢ ภ‡ ¸ ‡ ๠€ ¸¸ ¸ ¸¸ ¸¸¸¸¸¸ ° AA ¢ ูà¹à¸ • à £ ‡ ™ ± ๠‰ ™ ๠€ AA ‡ http://t.co/UIA € |

또는 바이트 (resultSet.getBytes에서) : 52 54 20 40 6F 6B 61 79 5F 70 61 73 73 77 6F 72 64 3A 20 C3 A0 C2 B8 E2 80 94 C3 A0 C2 B8 C2 B5 C3 A0 C2 B9 CB. ..

올바른 결과이어야 반면 : RT의 @okay_password : ที่ เรา เจ็บ เรา เสียใจ ก็ โทษ เขา ไม่ ได้ อีก นั่นแหละ ก็ เห็น อยู่ ว่า เขา ไม่ ได้ แคร์ เรา แต่ เรา ยัง เลือก จะ อยู่ ตรง นั้น เอง http://t.co/uI ...

(명령 줄을 통해 동일한 MySQL 테이블에서 검색)

,451,515,

또는 바이트 : 52 54 20 40 6F 6B 61 79 5 F 70 61 73 73 77 6 층 (72) (64) (3A) 20 E0 B8 97 E0 B8 B5의 E0의 B9 88 E0 B9 80 E0 B8 A3 E0의 B8의 B2 ...

서양 문자에 해당하는 처음 19 바이트가 일치하고 어떻게 갈라지는 지 확인하십시오.

실제 출력은 1043과 달리 2103 바이트입니다.

다른 게시물에서 권장하는대로 useUnicode = true & characterEncoding = UTF8 및 -Dfile.encoding = utf-8을 설정했지만 아무런 효과가없는 것으로 보입니다.

나는 자바가 지원하는 모든 인코딩으로 문자열 디코딩을 시도했지만 잘못된 부분의 모든 부분 문자열을 올바르게 디코딩 할 수 없었습니다.

나는 현명하다. 나는 무엇을 놓치고 있습니까? 어떤 도움이라도 대단히 감사합니다.

은 편집 :

표는 NOT이 mydb을 존재하는 경우 테이블 만들기 로 만들었습니다. tweet (...) DEFAULT CHARACTER SET = utf8;

MySQL은 다음을 보여줍니다 :

'char %';

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.10 sec) 

이 것이 문제가됩니까?

편집 2 :

ALTER 명령을 시도했습니다. 이제 문자 세트는 다음과 같이 나타납니다. 그러나 바이트는 여전히 같은 방식으로 나타납니다.

 mysql> show variables like 'char%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

8 행 세트 (0.10 초)

한편 나는 파이썬에서이 문제를 재현 할 수 있음을 깨달았다. 일반적인 mysql 커넥터를 통해 쿼리를 실행하면 다음과 같습니다.

import MySQLdb 
... 
     conn = MySQLdb.connect(host=MySQL_host , user=MySQL_user, passwd=MySQL_pass, db=MySQL_db__) 
     cursor = conn.cursor() 
     cursor.execute("""select * from tweet where user_id = '426586170' and time = '2014-03-21+15:10:30';""") 
     data = cursor.fetchall() 
print data[0][3] 

결과가 정상적으로 나타납니다. 한편,이 같은 오라클의 커넥터를 사용하는 경우 :

import mysql.connector 
... 
      cursor = cnx.cursor() 

query = ("SELECT * from tweet WHERE user_id = '426586170' and time = '2014-03-21+15:10:30'") 

cursor.execute(query) 

for (tweet_id, user_id, time, text) in cursor: 
    print text 

나는 다시 잘못된 출력을 얻을 : RT의 @okay_password을 : A-à¸μà¹à¹ € à £ า๠€ à¸à¹ ‡ à ¸šà¹ € ภ£ า ...

누구나 이해할 수 있습니까?

+0

인코딩 된 데이터베이스 테이블은 어떤 문자 집합 및 데이터 정렬입니까? Latin-1 테이블에 UTF-8 문자를 저장했을 수도 있습니다. –

답변

0

당신은 아마 당신의 MySQL의 JDBC 커넥터 URL에

useUnicode=yes;characterEncoding=utf8; 

를 추가해야합니다. 예 :

url = "jdbc:mysql://dbserver/db?useUnicode=yes&characterEncoding=utf8" 

편집 : 내가 붙여 넣은 서버 변수를 잘못 읽었습니다. 데이터베이스 문자 집합은 여전히 ​​latin1입니다. 시도하십시오

ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
+0

나는 이미 그것을 시도했다. 내 코드는 다음과 같습니다. connect = DriverManager.getConnection ("jdbc : //"+ host + "/" + database + "?" + "useUnicode = true & characterEncoding = UTF8 &"+ "user =" + user + "& password ="+ password); 불행히도 효과가없는 것 같습니다. –

+0

@MuratOzgul 붙여 넣은 데이터베이스 문자 세트가 누락되었습니다. 방금 내 대답을 업데이 트했습니다. – mindex