2013-12-17 3 views
2

내 데이터베이스에서 utf8_czech_ci 데이터 정렬을 사용하고 데이터베이스 연결을 설정하려고합니다. 기본값 인 utf8_general_ci가 필요하지 않으면 Mysqli_set_charset을 사용하여 데이터 정렬을 설정할 수 없습니다. Here은 먼저 mysqli_set_charset을 통해 charset을 설정 한 다음 SET NAMES를 통해 데이터 정렬을 설정하도록 제안되었습니다. 그래서 그것을했고 연결 정렬은 여전히 ​​utf8_general_ci입니다.mysqli를 사용하여 데이터 정렬을 설정하는 방법은 무엇입니까?

편집 : 지금은 기본적으로 코드 YourCommonSense를 사용 제안 :

$spojeni=mysqli_connect('mysql01','username','password', 'my_database'); 
    if (!$spojeni) die('Nepodařilo se připojit k databázi.'); 
    mysqli_set_charset($spojeni,'utf8'); 
    mysqli_query($spojeni, "SET COLLATION_CONNECTION = 'utf8_czech_ci';"); 

하지만, 난 그냥 Illegal mix of collations 오류에 직면했다. mysqli_get_charset()을 통해 연결 정렬을 테스트하는 동안 내 데이터 정렬이 "utf8_general_ci"가 아니라 "utf8_czech_ci"가되어야한다는 것을 알았습니다. 이것은 원래 받아 들여진 응답이 신비한 이유로 작동하지 않는다는 것을 의미합니다. 필자는 localhost와 hosted server 모두에서 데이터베이스를 테스트 했으므로 데이터베이스를 선언 한 직후에도 데이터 정렬을 변경하는 오류가 발생하지 않는 것 같습니다.

그럼 어떻게 다른 방식으로 데이터 정렬을 변경 하시겠습니까? 보관상의 이유로

내 전 코드 :

$spojeni=mysqli_connect('mysql01','username','password'); 
    if (!$spojeni) die('Nepodařilo se připojit k databázi.'); 
    mysqli_query($spojeni, "USE my_database"); 
    mysqli_set_charset($spojeni,'utf8'); 
    mysqli_query($spojeni, "SET NAMES 'utf8' COLLATE 'utf8_czech_ci';"); 

EDIT2 : show variables like "%collation%";collation_connectionutf8_general_ci 등의 값을 보여줍니다; 다른 데이터 정렬 변수는 utf8_czech_ci으로 설정됩니다. Adminer에서이 명령을 실행하면 SET NAMES 또는 SET COLLATION_CONNECTION (정확한 구문은 위 코드의 마지막 줄 참조) 중 하나를 실행 한 후에 만 ​​collation_connectionutf8_czech_ci이 표시됩니다. PHP 코드에서 show variables을 (mysqli_query을 통해) 실행하면 utf8_czech_ci으로 표시되지만 테이블에서 선택한 값과 클라이언트가 설정 한 값을 비교하면 여전히 illegal mix of collations에 대해 불평합니다.

내 세부 사항은 내 related question입니다.

EDIT3 : a good workaround for the errors을 찾았습니다. 나는 아직도 Adminer와 Mysqli 쿼리에 나타난 변수의 차이점을 이해하지 못한다. 그러나 나는 이미 follow-up question에 질문했다. 나의 의혹과는 달리, 원래 받아 들여진 답변은 적어도 대부분은 효과가 있으므로 다시 받아들입니다.

답변

4
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
$mysqli=mysqli_connect('mysql01','username','password', 'my_database'); 
mysqli->set_charset('utf8'); 
mysqli->query("SET collation_connection = utf8_czech_ci"); 
+0

그것은 오류를 던져서, 나는 적절한 해결책을 찾았고 (http://stackoverflow.com/a/13101585/1801588), 그것이 작동하고 코드를 수정했는지 테스트했다. 어쨌든, 당신의 답은 저에게 해결책을 안내해주었습니다. 그래서 +1하고 받아 들였습니다. –

+0

그래, 나는 = 기호를 깜빡했다. 이제 작동합니다. 다른 대답과 같이 의미를 거의 이해하지 못하는 스팸 일뿐만 아니라 적절한 명령을 사용해야합니다. –

+0

이 답변은 더 이상 유효하지 않은 것 같습니다. 내 질문 편집을 참조하십시오. –

0

나는 당신이 생각하지 않는다 는 연결에 특정 데이터 정렬을 지정합니다. 어느 쪽도 이해가되지 않습니다. 선택한 데이터 정렬에 관계없이 연결을 통해 전달되는 문자는 항상 동일합니다. 조합은 일치, 주문 등과 같은 서버 측 항목에 대해 유효합니다.

따라서 으로 잘되어야합니다.

+0

http://dev.mysql.com/doc/refman/5.1/en/charset-connection.html "collation_connection은 리터럴 스트링 비교를 위해 매우 중요합니다. 열 값 스트링을 비교하는 경우에는 collation_connection하지 않습니다 문제 " – Andrew

관련 문제