mysql 문자 집합 디코딩 문제 해결 방법 소개

8735 단어
character-set-server/default-character-set: 서버 문자 집합, 기본적으로 사용됩니다.
character-set-database: 데이터베이스 문자 집합.
character-set-table: 데이터베이스 테이블 문자 집합.
우선 순위가 순차적으로 증가합니다.따라서 일반적인 상황에서character-set-server를 설정하고 데이터베이스와 테이블을 만들 때 문자 집합을 따로 지정하지 않으면character-set-server 문자 집합을 통일적으로 사용합니다.
character-set-client: 클라이언트의 문자 집합입니다.클라이언트 기본 문자 집합입니다.클라이언트가 서버에 요청을 보낼 때, 요청은 이 문자 집합으로 인코딩됩니다.
character-set-results: 결과 문자 집합.서버가 클라이언트에게 결과나 정보를 되돌려 줄 때, 결과는 이 문자 집합으로 인코딩됩니다.
클라이언트에서 character-set-results를 정의하지 않으면character-set-client 문자 집합을 기본 문자 집합으로 사용합니다.따라서character-set-client 문자 집합만 설정하면 됩니다.
중국어를 처리하려면character-set-server와character-set-client를 모두 GB2312로 설정하고, 다국어를 동시에 처리하려면 UTF8로 설정할 수 있습니다.
ySQL 중국어 문제
디코딩을 해결하는 방법은 SQL 문장을 실행하기 전에 MySQL 아래 세 개의 시스템 파라미터를 서버 문자 집합character-set-server와 같은 문자 집합으로 설정하는 것이다.
character_set_client: 클라이언트의 문자 집합입니다.
character_set_results: 결과 문자 집합입니다.
character_set_connection: 문자 집합을 연결합니다.
이 세 가지 시스템 매개 변수를 설정하여 MySQL에 보내는 문장: set names gb2312
GBK, GB2312, UTF8 UTF-8: Unicode Transformation Format-8bit에 대해서는 BOM이 허용되지만 일반적으로 BOM이 포함되지 않습니다.국제적인 문자를 해결하기 위한 다중 바이트 인코딩으로 영어는 8바이트(즉 한 바이트), 중국어는 24바이트(세 바이트)로 인코딩한다.UTF-8은 전 세계 모든 국가가 필요로 하는 문자를 포함하고 국제 인코딩으로 통용성이 강하다.UTF-8 인코딩된 문자는 각 국가에서 UTF8 문자 세트를 지원하는 브라우저에 표시됩니다.예를 들어 UTF8 인코딩이라면 외국인의 영어 IE에도 중국어를 표시할 수 있으며 IE의 중국어 지원 패키지를 다운로드할 필요가 없다.
GBK는 국가 표준 GB2312를 바탕으로 확장 후 GB2312를 호환하는 표준이다.GBK의 문자 인코딩은 이중 바이트로 표시됩니다. 즉, 중국어, 영문 문자를 막론하고 모두 이중 바이트로 표시하고 중국어를 구분하기 위해 가장 높은 위치를 1로 설정합니다.GBK는 모든 중국어 문자를 포함하고 국가 인코딩이며 UTF8보다 통용성이 낮지만 UTF8이 차지하는 데이터베이스는 GBD보다 크다.
GBK, GB2312 등과 UTF8 사이는 유니코드 인코딩을 통해 서로 변환되어야 합니다.
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
웹 사이트, 포럼의 경우 영어 문자가 많으면 UTF-8을 사용하여 공간을 절약하는 것이 좋습니다.그러나 현재 많은 포럼의 플러그인은 일반적으로 GBK만 지원한다.
GB2312는 GBK의 서브집합이고, GBK는 GB18030의 서브집합이다
GBK는 한중일 문자를 포함하는 대문자 집합입니다.
중국어 사이트라면 GB2312GBK를 추천하는데 문제가 있을 때가 있어요.
모든 디코드 문제를 피하기 위해서는 UTF-8을 사용해야 하며, 앞으로 국제화를 지원하는 것도 매우 편리하다
UTF-8은 대부분의 문자 인코딩을 포함하는 큰 문자 세트로 볼 수 있습니다.
UTF-8을 사용하는 장점 중 하나는 다른 지역의 사용자(예를 들어 홍콩, 대만)가 간단한 중국어 지원을 설치하지 않아도 당신의 문자를 정상적으로 볼 수 있다는 것이다.
gb2312는 중국어 간체 코드입니다.
gbk 간체 중국어 및 번체 중국어 지원
big5 중국어 번체 지원
utf-8은 거의 모든 문자를 지원합니다.
우선 코드가 엉망인 상황을 분석한다. 1.데이터베이스에 쓸 때 디코딩으로 쓰기
2. 검색 결과는 난수로 반환
도대체 난리가 났을 때 어떤 상황일까요?
mysql 명령줄에 입력하겠습니다.
show variables like '%char%';
mysql 문자 세트 설정 보기:
mysql> show variables like '%char%';
+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | gbk |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | gbk |
| character_set_system | utf8 |
| character_sets_dir |/usr/local/mysql/share/mysql/charsets/|
+--------------------------+----------------------------------------+
검색 결과에서 mysql 데이터베이스 시스템에서 클라이언트, 데이터베이스 연결, 데이터베이스, 파일 시스템, 조회를 볼 수 있다
결과, 서버, 시스템의 문자 집합 설정
여기서 파일 시스템의 문자 집합은 고정되어 있으며, 시스템, 서버의 문자 집합은 설치할 때 확정되며, 디코딩 문제와 무관하다
디코딩 문제는 클라이언트, 데이터베이스 연결, 데이터베이스, 조회 결과의 문자 집합 설정과 관련이 있다
*주: 클라이언트는 mysql 데이터베이스에 접근하는 방식으로 명령행을 통해 접근하고 명령행 창은 클라이언트입니다.
JDBC와 같은 연결 액세스를 통해 클라이언트
우리는 mysql에 중국어 데이터를 쓸 때, 클라이언트, 데이터베이스 연결, 데이터베이스에 쓸 때, 각각 인코딩을 해야 한다
바꾸다
조회를 실행할 때, 반환 결과, 데이터베이스 연결, 클라이언트에서 각각 인코딩 변환을 진행한다
이제 우리는 데이터베이스, 클라이언트, 조회 결과와 데이터베이스 연결에서 발생하는 오류가 그 중 하나 이상에 발생한다는 것을 잘 알아야 한다
한 부분
이제 저희가 이 문제를 해결해 보도록 하겠습니다.
데이터베이스에 로그인할 때, 우리는 mysql--default-character-set= 문자집-uroot-p로 연결합니다. 이때 우리는
showvariables like'%char%'를 사용합니다.명령은 클라이언트, 데이터베이스 연결,
검색 결과의 문자 집합은 로그인할 때 선택한 문자 집합으로 설정되었습니다.
로그인한 경우 setnames 문자 집합을 사용할 수 있습니다.명령은 다음 명령과 동일합니다.
set character_set_client = 문자 세트
set character_set_connection = 문자 세트
set character_set_results = 문자 세트
JDBC를 통해 데이터베이스에 접속하는 경우 다음과 같이 URL을 쓸 수 있습니다.
URL=jdbc:mysql://localhost:3306/abs?useUnicode=true&characterEncoding=문자 세트
JSP 페이지와 같은 터미널에서도 적절한 문자 집합을 설정해야 합니다
데이터베이스 문자 집합은 mysql의 시작 설정을 수정하여 문자 집합을 지정할 수도 있고create 데이터베이스에 추가할 수도 있습니다
defaultcharacterset 문자 집합으로 데이터베이스 문자 집합을 강제로 설정합니다
이러한 설정을 통해 전체 데이터 쓰기 읽기 프로세스에서 문자 집합이 통일되면 혼란이 발생하지 않을 것이다
왜 명령줄에서 중국어를 직접 쓰고 설정하지 않아도 혼란이 발생하지 않습니까?
명확한 것은 명령줄에서 클라이언트, 데이터베이스 연결, 조회 결과의 문자 집합 설정에 변화가 없다는 것이다
입력한 중국어는 일련의 디코딩을 거쳐 초기의 문자 집합으로 되돌아왔는데, 우리가 본 것은 당연히 디코딩이 아니다
그러나 이것은 중국어가 데이터베이스에 정확하게 중국어 문자로 저장된다는 것을 의미하지는 않는다
예를 들어 현재 utf8 인코딩 데이터베이스가 있습니다. 클라이언트 연결은 GBK 인코딩을 사용하고,connection은 기본값을 사용합니다.
의 ISO8859-1 (즉 mysql의 latin1), 우리는 클라이언트에게'중국어'라는 문자열을 보냅니다. 클라이언트
GBK 형식의 바이너리 코드를 connection 층에 보내고, connection 층은 ISO8859-1 형식으로 이 부분을
2진 코드는 데이터베이스에 전송되고 데이터베이스는 이 인코딩을utf8 형식으로 저장합니다. 우리는 이 필드를utf8로
형식이 읽히면 틀림없이 디코딩을 받을 것이다. 즉, 중국어 데이터는 데이터베이스에 쓸 때 디코딩 형식으로 저장된다.
같은 클라이언트가 조회 작업을 할 때, 쓰기와 상반되는 작업을 했습니다. 잘못된 utf8 형식의 바이너리
코드가 올바른 GBK 코드로 변환되어 올바르게 표시됩니다.
/*****************java, jsp에서 인코딩 설정 ************************/
우선 자바에 있는 곳에서는 인코딩을 설정할 수 있어요.
다음 두 가지 인코딩 형식 설정 방법은 jsp 페이지(*.jsp)에 적용됩니다.
다음 방식은 jsp, servlet, action에 적합합니다 (*.java)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
다음은 html 페이지(*.htm;*.html)에 적합합니다.
Tomcate 설정 인코딩(server.xml)
mysql 인코딩 명령 설정
SET character_set_client = utf8;
SET character_set_connection = utf8;
SET character_set_database = utf8;
SET character_set_results = utf8;/*여기 주의하세요 유용합니다*/
SET character_set_server = utf8;
SET collation_connection = utf8_bin;
SET collation_database = utf8_bin;
SET collation_server = utf8_bin;
my.ini에서 기본 인코딩 설정
default-character-set=utf8
연결 데이터베이스 설정 인코딩
jdbc:mysql://192.168.0.5:3306/test?characterEncoding=utf8
 
  
/*****************************************java mysq ****************************************/
java UTF-8;GBK;GB2312;ISO-8859-1;
mysql utf8;gbk;gb2312;latin1

/******************************************** *********************************************/
// (SetCharacterEncodingFilter.java)
package com.sorc;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SetCharacterEncodingFilter extends HttpServlet implements Filter{
private FilterConfig filterConfig;
private String encoding=null;
//Handle the passed-in FilterConfig
public void init(FilterConfig filterConfig){
this.filterConfig=filterConfig;
encoding=filterConfig.getInitParameter("encoding");
}
//Process the request/response pair
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain){
try{
request.setCharacterEncoding(encoding);
filterChain.doFilter(request,response);
} catch(ServletException sx){
filterConfig.getServletContext().log(sx.getMessage());
} catch(IOException iox){
filterConfig.getServletContext().log(iox.getMessage());
}
}
//Clean up resources
public void destroy(){
}
}
//web.xml (web.xmd)

setcharacterencodingfilter
com.sorc.SetCharacterEncodingFilter

encoding
utf8



setcharacterencodingfilter
/*


/*************** 위의 기초 아래 면접 완료 솔루션이 있음 *******************/
1. GBK 인코딩을 이용한 솔루션
이 가장 간단한 인코딩 설정은 GBK 데이터베이스 gbk를 사용하고 필터를 사용하여 인코딩을 gbk로 하는 것입니다.
효과 추가 데이터 무분별 읽기 무분별 데이터베이스 관리 도구 무분별 곳곳 sql 구조와 데이터 무분별
2. UTF-8 인코딩 솔루션 사용
모든 인코딩이 UTF-8로 설정됨
데이터베이스 인코딩utf8
필터 인코딩 설정 utf8
데이터베이스 연결?characterEncoding=utf8
그리고 데이터베이스 관리 도구나 mysql 명령줄에서 SET character_set_results = gbk;
효과는 데이터 무분별 읽기 무분별 데이터베이스 관리 도구 무분별 여기저기 sql 구조와 데이터가 있을 때 혼란
3. 페이지는 UTF8 데이터베이스를 사용하여 latin1 솔루션을 사용합니다.
jap java tomcat UTF-8 설정
필터 utf8
데이터베이스 연결?characterEncoding=latin1
데이터베이스 기타 latin1
그리고 데이터베이스 관리 도구나 mysql 명령줄에서 SET character_set_results = gbk;
효과는 데이터 무분별 읽기 무분별 데이터베이스 관리 도구 무분별 여기저기 sql 구조와 데이터가 있을 때 혼란
페이지나 자바 코드에서 수동으로 코드를 바꿀 필요가 없습니다.

좋은 웹페이지 즐겨찾기