2016-09-12 5 views
1

libmysqlclient를 사용하여 데이터를 (놀랍게도) 데이터베이스에 삽입하는 C 프로그램을 작성합니다. 테이블의 문자 세트가 그 코드에 삽입하고 정렬 것은입니다 : 나는 문자 집합을 변경하기 위해 mysql_set_character_set()를 사용하여 내 C 프로그램에서libmysqlclient를 사용하여 collation_connection 설정 C API

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

; 문제는이 함수가 문자 집합 만 변경하고 데이터 정렬은 변경하지 않는다는 것입니다. 내가 사용 mysql_get_character_set_info를 문자 집합 및 정렬을 조회하면 결과는 다음과 같습니다

char-set=utf8mb4, collation=utf8mb4_general_ci 

MySQL documentation에 따르면

세트 이름이 문자는 클라이언트가 서버에 SQL 문을 보내는 데 사용할 설정 것을 나타냅니다. 따라서 SET NAMES 'cp1251'은 서버에 "이 클라이언트의 향후 수신 메시지는 문자 집합 cp1251입니다"라고 알려줍니다. 또한 서버가 결과를 클라이언트로 보내기 위해 사용해야하는 문자 집합을 지정합니다.

그래서 나는 mysql_optionsMYSQL_INIT_COMMAND를 사용하여 연결 정렬을 변경하기로 결정 :

결과 함수 호출 (나는 mysql_real_connect() 전에이라고도 함)과 같다
SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'; 

:

if(mysql_options(conn, MYSQL_INIT_COMMAND, 
     "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';")) { 
    // log the errors and do proper actions 
} 

그러나이 보인다 이 명령은 문자 집합과 데이터 정렬을 변경할 수 없습니다! 지금은 쿼리 경우 문자 집합 mysql_get_character_set_info()를 사용하기 때문에 결과는 다음과 같습니다 여기

char-set=latin1, collation=latin1_swedish_ci 

흥미로운 점은 그 내가 로그를 활성화하고 MYSQL_INIT_COMMAND 명령을 실행하여 프로그램을 실행하면 MySQL의 측면에서! 그러나 mysql_get_character_set_info()은 이것을 보여주지 않습니다! 다시 libmysql의 설명서에 따라이 기능은 현재 연결에 대한 기본 문자 집합을 설정하는 데 사용됩니다

INT의 mysql_set_character_set (MYSQL * mysql을, CONST의 char *의 csname을). 문자열 csname은 유효한 문자 집합 이름을 지정합니다. 연결 데이터 정렬이 문자 집합의 기본 데이터 정렬이됩니다. 이 기능은 SET 명칭 문처럼 작동하지만 도는 mysql_real_escape_string가 사용하는 문자 세트를() mysql-> 캐릭터 세트의 값을 설정하고, 따라서 영향을

내가 문자 집합 및 정렬에서를 변경하려면

mysql_real_escape_string()이 영향을받는 방법. 그렇게하는 올바른 방법은 무엇입니까?

답변

0

init 명령은 root 사용자가 실행하지 않습니다. (구체적으로는 SUPER 사용자가 사용합니다.) 응용 프로그램에 대해 다른 사용자를 만들 것을 권장합니다.

테이블 열도 CHARACTER SET utf8mb4으로 선언되어야 함을 잊지 마십시오.

+0

글쎄, 루트 나 다른 수퍼 유저는 실행하지 않지만 어떻게 mysql_get_character_set_info() 함수의 결과에 영향을 미칠 수 있습니까? mysql_real_escape_string()이 영향을받는 방식으로 문자 집합과 데이터 정렬을 설정하려면 어떻게해야합니까? – gst

+0

나는 당신이 말한 것을했으나 모든 것이 동일합니다! – gst