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_options
및
MYSQL_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()
이 영향을받는 방법. 그렇게하는 올바른 방법은 무엇입니까?
글쎄, 루트 나 다른 수퍼 유저는 실행하지 않지만 어떻게 mysql_get_character_set_info() 함수의 결과에 영향을 미칠 수 있습니까? mysql_real_escape_string()이 영향을받는 방식으로 문자 집합과 데이터 정렬을 설정하려면 어떻게해야합니까? – gst
나는 당신이 말한 것을했으나 모든 것이 동일합니다! – gst