nodejs 와 C 언어 가 my sql 데이터베이스 어 지 러 운 문 제 를 삽입 하 는 해결 방법
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 데이터 베 이 스 를 삽입 하 는 어 지 러 운 문제 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Node.js를 AWS서버에서 사용하는 실습간단한 예제와 함께 AWS에서 Node.js를사용하는 법을 배워보도록 하겠다. 해당 github에 있는 레포지토리로 사용을 할 것이다. 3000번 포트로 Listen되는 예제이고 간단히 GET, POST, DELET...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.