2013-07-09 10 views
3

12 가지 유사한 질문이 있다는 것을 알고 있습니다. 그러나이 경우 제안 된 해결책은 없습니다. 내가 페이지에 그것을 밖으로 인쇄 할 때UTF-8 인코딩을 사용하는 페이지는 UTF-8 인코딩을 사용하여 MySQL로 데이터를 전송하지만 엔트리가 스크램블 됨

$hometeam="Крылья Советов"; //Cyrrilic string 

이 제대로 출력합니다 :

나는대로 초기화 된 페이지에 PHP 변수를 가지고있다. 따라서 echo $hometeam은 문자열 Крылья Советов을 표시합니다.

헤더의 콘텐츠 메타 태그를 다음과 같이 설정 : 페이지의 맨 처음에,

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> 

을 그리고, 내가 가지고있는 (내 검색에서 발견 된 솔루션 중 하나에 제안) 다음 :

ini_set('default_charset', 'utf-8'); 

이렇게 좋을 것입니다.

이 테이블을 저장하려고하고있는 MySQL 테이블과 문제의 열은 utf8_bin을 인코딩으로 사용합니다. phpMyAdmin으로 가서 Крылья Советов을 수동으로 입력하면 필드에 올바르게 저장됩니다. 그러나

, 나는 다음과 같은 기본 쿼리를 사용하여 페이지에 쿼리를 저장하려고하면

MySQL의 항목은 다음과 같습니다
mysql_query("insert into tablename (round,hometeam) values ('1','$hometeam') "); 

:

c390c5a1c391e282acc391e280b9c390c2bbc391c592c391c28f20c390c2a1c390c2bec390c2b2c390c2b5c391e2809ac390c2bec390c2b2 

그래서 무슨 일이 일어나고 있는지 이리? 페이지에서 모든 것이 정상이라면, MySQL 자체에서 모든 것이 정상입니다. 문제는 어디에 있습니까? UTF-8로 인코딩 된 문자열을 유지하도록 쿼리 자체에 추가해야하는 것이 있습니까?

데이터베이스에 연결 한 후 페이지 상단에 mysql_set_charset('utf8');을 설정했음을 유의하십시오.

편집 : 그 목록 2 라틴 년대이 있기 때문에, 여기에 뭔가가있을 수처럼

Variable_name Value 
character_set_client utf8 
character_set_connection utf8 
character_set_database latin1 
character_set_filesystem binary 
character_set_results utf8 
character_set_server latin1 
character_set_system utf8 
character_sets_dir /usr/share/mysql/charsets/ 

이 보인다 : 쿼리 SHOW VARIABLES LIKE "%character_set%"를 실행하면 다음과 같은 수 있습니다. 어떻게 생각해?

또한 키릴 문자 문자열을 phpMyAdmin에 직접 입력하면 처음에는 괜찮아 보입니다 (저장 한 후에 올바르게 표시됩니다). 하지만 테이블을 다시로드하면 삽입 된 것과 같이 16 진수로 표시됩니다. 이 문제에 관한 잘못된 정보에 대해 사과드립니다. 결국, 문제는 phpMyAdmin 또는 데이터베이스 자체에 문제가 있음을 의미합니다.

편집 # 2 :이 무엇인지 show create table tablename 반환 :

CREATE TABLE `tablename` ( `id` int(11) NOT NULL AUTO_INCREMENT, `round` int(11), `hometeam` varchar(32) COLLATE utf8_bin NOT NULL, `competition` varchar(32) CHARACTER SET latin1 NOT NULL DEFAULT 'Russia', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=119 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 
+0

당신이 같은 쿼리 짓을 한거야 : 아마 최고의 아이디어는 테이블 정의의 끝에 다음 명령을 추가, 데이터베이스를 다시 작성하는 것입니다 전에 "의 명칭 'UTF8'을 SET"? http://stackoverflow.com/questions/2159434/set-names-utf8-in-mysql – steven

+0

@steven 나는 그 일을하지 않았다. 아니,하지만 지금은 문제가 동일하게 남아 있으므로 도움이 안된다. . – jovan

+0

@ jovan 소스 코드 파일의 인코딩은 무엇입니까? 비슷한 설정에서 키릴 문자 인코딩으로 테스트하면 빈 문자열 만 얻습니다. utf8로 모든 것이 예상대로 진행됩니다. – Salem

답변

1

, 내가 phpMyAdmin을에 직접 키릴 문자 문자열을 입력 할 때, 그것은 은 (내가 저장 한 후 올바르게 표시) 처음에 잘 나타납니다. 그러나 테이블을 다시로드하면 삽입 된 것과 같이 16 진수로 표시됩니다.

테이블에 문제가있는 것 같습니다. 실행 show create table tablename. 당신이 character_set_database 변수의 기본값으로 설정했기 때문에 utf8 대신 latin1이있을 것입니다. UTF8로

ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name; 

will convert 모든 varchar 필드 :

이를 변경하려면, 다음의 커멘드를 실행합니다. 그러나 이미 테이블에있는 레코드는 조심하십시오. 이미 형식이 잘못되어 있으므로 UTF8로 변환하면 형식이 잘못됩니다.

CREATE TABLE `tablename` (
    .... 
) ENGINE=<whatever you use> DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci 
+0

@ jovan으로 변경 한 다음 utf8_bin을 utf8_general_ci로 변경하십시오. 그리고 귀하의 칼럼 '경쟁'이 여전히 라틴어 1임을 명심하십시오. – TMS

+0

예, 테이블과 열의 데이터 정렬을 utf8_general_ci로 변경하지는 않았지만 작동합니다. 감사! – jovan

2

당신이 phpMyAdmin이 16 진수 문자열을받을 수 있나요? 나는 당신이 SELECT 때 예를 들어 삽입 된 값을 가정합니다. PHP 또는 MySQL 콘솔 클라이언트를 사용하면 예상 키릴 UTF8 문자열이 제공됩니다.

그렇다면 phpMyAdmin의 구성 문제입니다 (예 :여기서는 http://theyouri.blogspot.ch/2010/12/phpmyadmin-collated-db-in-utf8bin-shows.html

에 phpMyAdmin은 utf8_bin의 DB는

$의 CFG [ 'DisplayBinaryAsHex가'] = FALSE

대신 UTF8 텍스트 헥스 데이터를 도시 대조;

또한 SQL 인젝션에 완전히 열려 있기 때문에 mysql_query을 사용하지 마십시오. 또한 utf8_bin을 실제로 사용하고 싶은지 잘 모르겠습니다. 이 토론 : utf8_bin vs. utf_unicode_ci 나이 : 무슨 이상한 일이있다 UTF-8: General? Bin? Unicode?

편집. 주어진 16 진수 문자열을 UTF8 문자로 변환하면 "ÐšÑ € Ñ <Ð»ÑŒÑ Ð¡¾¾²ÐμÑ,ов"(예 : http://software.hixie.ch/utilities/cgi/unicode-decoder/utf8-decoder 참조)가됩니다. utf8_decode이 경우 원하는 "Крылья Советов"을 얻을 수 있습니다. 그래서 적어도 두번 인코딩 된 것 같습니다. (어딘가에 16 진수로 나타나는 문제 외에도).

전체 스크립트를 제공해 주시겠습니까? 너 어디서든 utf8_encode 문자열을합니까? 스크립트가 이것입니다 만이 (유효한 외에, MySQL의 연결 오픈) 경우

<?php 
$hometeam="Крылья Советов"; //Cyrrilic string 
// open mysql connection here 
mysql_set_charset('utf8'); 
mysql_query("INSERT INTO tablename (round, hometeam) VALUES ('1', '$hometeam')"); 
$result = mysql_query("SELECT * FROM tablename WHERE round = '1'"); 
$row = mysql_fetch_assoc($result); 
echo $row['hometeam']; 
?> 

을 그리고 페이지를 호출 결과 (브라우저의 페이지 소스에서에 표시되지 무슨 일이 무엇인가 브라우저)?

또 다른 답변에서 제안하는 것처럼, 데이터 정렬을 utf8_unicode_ci로 변경하면 어떻게되는지 확인하십시오. 적어도 바이너리 데이터를 표시 할 때 phpMyAdmin 문제를 다루고 어쨌든 당신이 원할 것입니다 (아마 ORDER BY 절이 예상대로 수행되기를 원하기 때문에 위의 링크 된 질문에있는 토론을 참조하십시오).

EDIT2 아마도 SHOW CREATE TABLE tablename 또는 SHOW VARIABLES LIKE "%character_set%"과 같은 일부 스 니펫을 제공 할 수도 있습니다. 도움이 될지도 몰라.

+0

데이터베이스에서 값을 인쇄 할 때 (나는 utf_encode의 유무에 관계없이 이것을 시도했습니다) 적절한 키릴 문자를 얻지 못했습니다. SQL 인젝션에 관해서는, 저도 알고 있습니다. 고마워요. 단지 예일뿐입니다. 이것은 공유 호스팅에 있으므로 phpMyAdmin을 그렇게 구성 할 수 없다고 생각합니다. – jovan

+0

명확히하기 : 값을 선택하면 언급 한 16 진수 문자열이 나타 납니까? 어디에서 어떻게 데이터베이스의 값을 "출력합니까?" – stef77

+0

제 편집 된 답변을보십시오. 자세한 정보를 제공 할 때 더 많은 정보를 얻을 수 있습니다. – stef77

1

1) PhpMyAdmin을 사용하여 데이터베이스에 항목을 저장 한 다음 PhpMyAdmin에서 결과를보십시오. 괜찮아 보이니? 그렇다면 데이터베이스가 작성되고 올바르게 설정됩니다.

2) 대신 utf8_general_ci을 사용해보십시오. 이것은 중요하지 않지만 시도해보십시오.

3) PHP 측에서 필요한 모든 설정을 조정하십시오.이 게시물을 따르십시오 : http://blog.loftdigital.com/blog/php-utf-8-cheatsheet.

echo htmlentities($hometeam, ENT_QUOTES, 'UTF-8') 
+0

나는 문제가 데이터베이스 측에 거의 확실하다고 생각한다. 질문에 대한 나의 편집을 확인해 보라. – jovan

+0

@ jovan 나는 당신의 업데이트를 읽는다 - 그러면 문제는 분명히 당신의 식탁에있다! 'show create table tablename'의 완전한 출력을보고하십시오! – TMS

+0

결과를 질문에 추가했습니다. 그것은 나에게 좋을 듯하다 - 문제는 전체적인 MySQL 설정에 있을까? 공유 호스팅이므로 어쩌면 호스팅 지원 담당자가 나를 도울 수 있습니까? 그건 그렇고, 나는 utf8_general_ci로 전환 시도, 아무것도 변경하지 않았다. – jovan

1

내가 코멘트에서 보았 듯이, 당신이 그것을 데이터베이스 구성을하지 않는 업데이트 할 수 솔기하지 않습니다 특히이 트릭을 시도?

은 내가 공식 문서에 MySQL Documentation

내가 당신에게 PHP 솔루션을 제안 할 수 있음을 보았 기 때문에 당신이 인코딩의 잘못을 생각한다. 인코딩 문제가 많기 때문에 문자열을 데이터베이스에 삽입하기 전에 변형 할 수 있습니다. PHP와 데이터베이스 사이에서 이야기 할 수있는 공통 언어를 찾아야합니다.

다른 프로젝트에서 시도한 것은 url_encode($string)url_decode($string)을 사용하는 변형 문자열로 구성됩니다.또한