nodejs 와 C 언어 가 my sql 데이터베이스 어 지 러 운 문 제 를 삽입 하 는 해결 방법

5878 단어 nodejsc 언어mysql
여기에 nodejs 과정 중의 일부 난 코드 상황 을 기록 하 였 는데,이곳 의 난 코드 는 주로 웹 페이지 의 인 코딩 방식 과 nodejs 의 기본 디 코딩 방식(utf 8)이 일치 하지 않 아서 생 긴 것 이다.이번에 말씀 드 리 고 싶 은 것 은 C 언어 와 nodejs 가 MySQL 과 상호작용 을 할 때 발생 하 는 어 지 러 운 문제 입 니 다.
       1.파충류 프로그램 이 여러 Docker 에서 실행 되 기 때문에 모든 docker 의 my sql 데 이 터 를 전체 my sql 데이터 시트 에 정기 적 으로 동기 화 해 야 합 니 다.nodejs 를 사용 하여 데 이 터 를 동기 화하 여 중국어 오류 가 발생 합 니 다.모든 docker 에서 중국 어 는 어 지 러 운 코드 가 존재 하지 않 는 다 는 것 을 알 아야 한다.nodejs 의 기본 처리 문 자 는 utf 8 이 고 my sql 은 기본적으로 latin 1 이 며 유럽인 이 개발 한 데이터 베이스 이기 때 문 입 니 다.분석 은 아래 와 같다.
       명령show variables like '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 | latin1  |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
       즉,데이터 베 이 스 를 만 들 때 특별히 지정 하지 않 으 면 데이터 베이스,데이터 시트 및 데이터 필드 의 인 코딩 형식 은 기본 값 이 고 기본 값 은 설정 파일 을 변경 하지 않 을 때 latin 1(기본 설치 형식)입 니 다.utf 8 은 비교적 통용 되 는 인 코딩 방식 이기 때문에 우 리 는 데이터베이스 의 모든 인 코딩 방식 을 utf 8 로 바 꿉 니 다.여기 서 설명 해 야 할 것 은 my sql 의 인 코딩 은 여러 차원 으로 나 뉘 는데 데이터 베이스 등급,데이터 시트 등급 과 데이터 필드 등급 등 을 포함한다.저 는 이런 부분 을 깊이 연구 하지 않 고 모든 필드,표 의 인 코딩 방식 을 설정 하지 않 고 모든 인 코딩 방식 을 utf 8 로 설정 합 니 다.구체 적 으로 다음 과 같다. 
      vi/etc/my.cnf 에서 my.cnf 파일 을 다음 과 같이 수정 합 니 다.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
default-character-set = utf8
character_set_server = utf8
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
default-character-set = utf8
[client]
default-character-set = utf8
       수정 후 mysql 서비스 서비스 다시 시작 mysqld restart
       명령show variables like 'char%';인 코딩 형식 을 다시 보면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.

+--------------------------+----------------------------+
| Variable_name | Value  |
+--------------------------+----------------------------+
| character_set_client | utf8  |
| character_set_connection | utf8  |
| character_set_database | utf8  |
| character_set_filesystem | binary  |
| character_set_results | utf8  |
| character_set_server | utf8  |
| character_set_system | utf8  |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
       모든 인 코딩 형식 이 utf 8 로 변 하 는 것 을 볼 수 있 습 니 다.이로써 데이터베이스 와 데이터 시트,데이터 필드 를 만 들 때 특별히 지정 하지 않 으 면 기본 인 코딩 방식,즉 현재 utf 8 을 사용 합 니 다.
       2.인 코딩 형식 이 latin 1 에서 utf 8 로 바 뀌 었 지만 저 는 다음 과 같은 문제 에 부 딪 혔 습 니 다.
Specified key was too long; max key length is 1000 bytes
       키 값 의 길이 가 1000 바이트 보다 크다 는 뜻 입 니 다.이 안의 키 값 길 이 는 키 값 을 정의 할 때의 길이 와 인 코딩 형식 바이트 수 를 곱 하 는 것 을 말 하 며 실제 길 이 를 가리 키 지 않 습 니 다.또한 1utf 8=3 바이트(이것 은 다른 사람들 이 모두 이렇게 말 하 는 것 을 보고 구체 적 으로 얼마나 가 져 가 는 지 는 확실 하지 않다)를 취하 기 때문에 이 를 3 에 곱 하면 1000 바이트 보다 크다.원래 latin 1 은 문제 가 없 었 습 니 다. 
       해결 방법 은(1)키 값 의 정의 길 이 를 줄 이 는 것 이다.(2),utf 8 인 코딩 을 사용 하지 않 습 니 다.(3)기본 DB engine 이 MyIsam 이기 때문에 innodb 로 바 꿉 니 다.나 는 사용 방식(3)을 사용 한 후에 잘못 을 없 앨 수 있다.
       3.이때 다음 과 같은 문제 가 발생 했다.

ERROR: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes
       이 문제 의 원인 은 utf 8 로 인 한 것 입 니 다.latin 1 인 코딩 형식 에서 저 는 VARCHAR(512)유형 을 메 인 키 로 설정 한 것 은 문제 가 없 지만 utf 8 은 안 됩 니 다.utf 8 인 코딩 은 3 바이트 이기 때 문 입 니 다.즉,256 개의 utf 8 인 코딩 형식의 VARCHAR 만 수용 할 수 있 습 니 다.따라서 정의 할 때 VARCHAR(255)문제 가 제거 되 거나 데이터 형식 을 바 꿀 수 있다 고 정의 합 니 다. 
       4.이로써 나 는 nodejs 를 사용 하여 데이터 베 이 스 를 읽 고 쓰 는 데 문제 가 없 었 다.그러나 나 는 C 언어 를 사용 할 때 utf 8 인 코딩 을 삽입 한 중국 어 를 발 견 했 는데 여전히 어 지 러 운 코드 를 보 여 주 었 다.이 유 는 여러 가지 가 있 을 수 있 습 니 다.이 안에서 제 가 만난 두 가지 상황 을 말씀 드 리 겠 습 니 다.먼저 로 컬 시스템 의 기본 인 코딩 방식 을 확인 하고 locale 명령 으로 보기(Linux)를 합 니 다.일반적인 상황 은 utf 8 이 어야 합 니 다.보험 기간 을 위해 저 는 C 언어 에 다음 과 같은 코드 를 추가 하여 지정 한 인 코딩 방식 을 표시 합 니 다.

#include <locale.h>
setlocale(LC_ALL, "en_US.UTF-8");
       이때 C 언어 는 my sql 을 실행 합 니 다.query 가 데 이 터 를 삽입 할 때 데이터 베 이 스 는 여전히 어 지 러 운 코드 를 표시 합 니 다.해결 방법 은 다음 과 같다.

mysql_query(g_pMyConn, "set character set utf8");
mysql_query(g_pMyConn, g_strSqlStatement)
       데이터베이스 삽입 명령 을 실행 하기 전에 표시 되 는 설명 을 한 줄 더 추가 하여 utf 8 방식 으로 실행 하 는 것 입 니 다.
       nodejs 가 삽입 되 었 을 때 C 언어 에 문제 가 없 었 기 때문에 저 는 다음 과 같은 원인 을 간단하게 구상 해 보 았 습 니 다.순 전 히 개인 적 인 추측 입 니 다.
       C 언어 는 mysql 이 공식 적 으로 제공 하 는 api 인 터 페 이 스 를 사용 하고 mysql 은 유럽인 들 이 개발 한 것 이기 때문에 처음에는 그렇게 광범 위 하 게 응 용 될 줄 몰 랐 기 때문에 latin 1 기본 인 코딩 을 사 용 했 습 니 다.mysql 응용 프로그램 이 점점 많아 지면 서 다른 인 코딩 을 지원 할 때 원래 의 인터페이스 에 패 치 를 해 야 하기 때문에 위 에 표 시 된 지 정 된 인 코딩 형식 이 나타 납 니 다.인터페이스 와 데이터베이스 기본 인 코딩 이 자동 으로 일치 하 는 상황 을 유지 하지 못 했 습 니 다. 
       nodejs 의 경우 데이터 베 이 스 를 연결 하 는 행 위 는 nodejs 에 의 해 패키지 되 고 고려 하 는 것 이 상대 적 으로 전면적 이기 때문에 C 언어 에 문제 가 없다.
       마지막 으로 DB engine 가 MyIsam 에서 innodb 로 바 뀌 었 다 는 것 을 알 게 되 었 습 니 다.읽 는 속도 가 좋아 지고 느 려 졌 습 니 다.무슨 영문 인지 알 고 있 는 번 거 로 움 을 알려 드 리 겠 습 니 다.
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 nodejs 와 C 언어 가 my sql 데이터 베 이 스 를 삽입 하 는 어 지 러 운 문제 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기