2012-11-24 4 views
2

다음 코드를 사용하여 내 db에 데이터를 저장하고 업데이트합니다.특수 문자는? 내 mysql 데이터베이스에서

<?php 
header("Content-Type: text/html;charset=UTF-8", true); 
mysql_connect("localhost", "test", "test") or die(mysql_error()); 
    mysql_select_db("test") or die(mysql_error()); 

    // mysql_set_charset('UTF8'); 
    mysql_query("SET NAMES 'utf8'"); 
    mysql_query("SET CHARACTER SET utf8"); 
    mysql_query("SET COLLATION_CONNECTION = 'utf8_unicode_ci'"); 




    mysql_query("UPDATE `test`.`english` SET age = '".$age."', city = '".mysql_real_escape_string($_REQUEST['city'])."', aboutMe = '".$_REQUEST['about']."' WHERE `english`.`username` = '".$_REQUEST['username']."' LIMIT 1 ;") 
    or die(mysql_error()); 

코드가 잘 동작합니다. 그러나 문자열 (예 : "도시"에는 ä, ö, ü가 포함되어 있습니다. 예를 들어 단어 "Bär"는 "B? r"로갑니다.

나는 이미 utf8을 추가했지만 도움이되지 않습니다. 서버가 php4.x 만 지원합니다.

편집 : DB는 latin1_general_ci를 데이터 정렬로 사용하고 있습니다. 데이터 정렬로

+0

PHP 버전은 여기에서 문제가되지 않습니다. 문제는 MySQL이 이러한 값을 저장하는 방법입니다. – ajacian81

+0

이 쿼리를 먼저 시도해보십시오 :'alter table'test'.english'는 문자셋으로 변환합니다 utf8 collate utf8_unicode_ci;' – ajacian81

+0

이제 시도해 보았습니다 만, 이제는 ä ü ö가 무시되고 그 문자가 무시됩니다. – tobias

답변

0

사용 UTF8은

어쩌면 utf8_bin 또는 utf8_unicode_ci ("존"등의 비교 식을 = "요한이"true를 반환 있도록 CI의 의미는 대소 문자를 구분이다). 당신은 MySQL의에서 다음 쿼리를 실행하여이 작업을 수행 할 수

alter table `test`.`english` convert to character set utf8 collate utf8_unicode_ci; 
+0

Thx, utf8_unicode_ci로 변경하려고 시도했지만 이제는 저장되지 않습니다. 그래서 단어 "Bücken"-> "B". 한 행에 데이터 정렬 만 추가했습니다! – tobias

0

변화 테이블 정렬을 utf8_bin에.

기존 열을 포함한 테이블의 기본 문자 집합 및 정렬을 변경하려면 (변환에 절 참고) :

ALTER TABLE tableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin 

utf8_general_ci

ä = a 
ö = o 
ü = u 

뿐만의를 utf8_bin

ä != a 
ö != o 
ü != u 
+0

utf8_general_ci는 확장, 축소 또는 무시할 수있는 문자를 지원하지 않는 레거시 데이터 정렬입니다. 문자 사이에 일대일 비교 만 할 수 있습니다. – ajacian81

+0

그래서 utf8_unicode_ci를 사용해야합니까? – tobias

+0

이상한 점은. 나는 같은 데이터 정렬 latin1_general_ci를 가진 다른 테이블을 가지고 있고 그것은 ä ü ö와 함께, 왜 작동합니까? – tobias

0

ut8_unicode_ci를 유지하고 다음에 추가하십시오. 귀하의 PHP 코드 :

mb_language('uni'); 
mb_internal_encoding('UTF-8'); 
mysql_query("set names 'utf8'",$connection); 

나는 모든 곳 (키릴 어, 중국어 등)을 사용하고 있으며 모든 쿼리 (삽입 또는 업데이트) 작업을하고 있습니다.

<?php 
     header("Content-Type: text/html;charset=UTF-8", true); 
     $connection = mysql_connect("localhost", "test", "test") or die(mysql_error()); 

     mb_language('uni'); 
     mb_internal_encoding('UTF-8'); 
     mysql_query("set names 'utf8'",$connection); 

     mysql_select_db("test") or die(mysql_error()); 
     mysql_query("UPDATE `test`.`english` SET age = '".$age."', city = '".mysql_real_escape_string($_REQUEST['city'])."', aboutMe = '".$_REQUEST['about']."' WHERE `english`.`username` = '".$_REQUEST['username']."' LIMIT 1 ;") 
     or die(mysql_error()); 
+0

또한 작동하지 않습니다. – tobias

+0

데이터베이스인지, 테이블인지, 열에 utf8_general_ci 데이터 정렬이 있는지 확인하고 utf8도 참조하십시오. – pregmatch

+0

이 모든 것을 어떻게 보장 할 수 있습니까? – tobias

0

나는 그것을 얻었다. 나는이 행동에 대한 설명이 없다. 나는 라틴에 UTF8에서 PHP 파일에 변경 :

mysql_query("SET NAMES 'latin1'"); 
mysql_query("SET CHARACTER SET latin1"); 
mysql_query("SET COLLATION_CONNECTION = 'latin1_general_ci'"); 

는 MySQL DB에서 데이터 정렬은 테이블과 컬럼에 대한 utf8_unicode_ci입니다.

이제 모든 문자가 € 기호 옆에 표시됩니다.

관련 문제