php 한글 - MySQL에서 utf8을 설정 하시겠습니까?




깨짐 연동 (8)

나는 종종 MySQL을 사용하는 PHP 스크립트에서 이와 비슷한 것을 본다.

query("SET NAMES utf8");   

나는 어떤 프로젝트에 대해서도이 일을 한 적이 없어서 그것에 대해 몇 가지 기본적인 질문이있다.

  1. PDO로만 수행되는 것입니까?
  2. PDO가 아닌 경우, 그 목적은 무엇입니까? 나는 그것이 mysql을위한 인코딩을 설정하고 있다는 것을 깨닫는다. 그러나 나는 그것을 사용하지 않아야했기 때문에 왜 그것을 사용하고 싶습니까?

Answers

SQL 쿼리를 통해 이렇게하는 대신 php 함수를 사용하십시오 : mysqli :: set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

자세한 내용은 MySQL 문자 집합 개념 섹션을 참조하십시오.

http://www.php.net/manual/en/mysqli.set-charset.php


manual :

SET NAMES는 클라이언트가 서버에 SQL 문을 보내는 데 사용할 문자 집합을 나타냅니다.

더 정교하게, (그리고 다시 한번, manual 에서 불필요하게 들어 올렸습니다.)

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


감사합니다 @all!

사용하지 마십시오 : query ( "SET NAMES utf8"); 이것은 설정 사항이며 쿼리가 아닙니다. setCharset () 또는 유사한 메소드를 사용하여 연결을 시작하십시오.

parctice의 약간의 작은 물건 :

지위:

  • mysql 서버는 기본적으로 latin1을 말합니다.
  • 당신의 구멍 응용 프로그램은 utf8에 있습니다.
  • 어떤 여분의 (그래서 : latin1)없이 (SET noAMES utf8 ..., set_charset () 메소드 / 함수없이) 연결이 이루어진다.

mysql이 문자를 처리 할 수있는만큼 데이터를 저장하고 읽는 것은 아무런 문제가되지 않습니다. db를 살펴보면 이미 phpMyAdmin을 사용하고 있음을 알 수 있습니다.

지금까지는 이것이 문제가되지 않습니다! (잘못되었지만 자주 유럽에서) ..

.. 다른 클라이언트 / 프로그램이나 올바른 라이브러리가 변경되지 않으면 데이터를 읽거나 저장합니다. 그러면 큰일 난다!


'ñ'또는 'ö'와 같이 순수 ASCII로 표시 할 수없는 문자가있는 서버로 데이터를 보내려 할 때마다 필요합니다.

MySQL 인스턴스가 클라이언트 연결에서 기본적으로 UTF-8 인코딩을 기대하도록 구성되지 않은 경우 (위치 및 플랫폼에 따라 다르다)

유니 코드가 어떻게 작동하는지 알지 못하는 경우를 대비하여 http://www.joelonsoftware.com/articles/Unicode.html 을 읽어보십시오.

읽기 "SET NAMES"를 사용 하여 SET NAMES 대안과 그 내용을 확인하십시오.


뿐만 아니라 PDO. SQL에서 '????' 기호, 당신의 미리 설정 charset (희망 UTF-8) 정말 권장 :

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

또는 프로 시저 스타일을 통해 mysqli_set_charset($db,"utf8")


해결책은

 $conn->set_charset("utf8");

인코딩 권리를 얻는 것은 정말 까다 롭습니다. 너무 많은 레이어가 있습니다.

  • 브라우저
  • 페이지
  • PHP
  • MySQL

PHP에서 SQL 명령 "SET CHARSET utf8"을 사용하면 클라이언트 측 (PHP)이 데이터베이스에 저장되는 방법에 관계없이 utf8에서 데이터를 가져옵니다. 물론 처음부터 올바르게 저장해야합니다.

DDL 정의 대 실제 데이터

테이블 / 열에 대해 정의 된 인코딩은 실제로 데이터가 해당 인코딩에 있음을 의미하지 않습니다. 테이블을 utf8 정의했지만 다른 인코딩으로 저장 한 경우 MySQL은 utf8 로 처리하므로 문제가 발생합니다. 즉, 먼저이를 고쳐야한다는 뜻입니다.

확인할 사항

각 레이어에서 데이터 흐름이 어떤 인코딩인지 확인해야합니다.

  • HTTP 헤더, 헤더를 확인하십시오.
  • 요청 본문에서 실제로 전송 된 내용을 확인하십시오.
  • MySQL이 거의 모든 곳에서 인코딩을한다는 것을 잊지 마십시오.
    • 데이터 베이스
    • 테이블
    • 서버 전체
    • 고객
      모든 곳에 올바른 것이 있는지 확인하십시오.

변환

예를 들어 windows-1250 데이터를 받고 utf-8 에 저장하려면이 SQL을 저장하기 전에 사용하십시오.

SET NAMES 'cp1250';

DB에 windows-1250 데이터가 있고 utf8 을 검색하려면 다음을 사용하십시오.

SET CHARSET 'utf8';

마지막주의 사항 :

너무 "똑똑한"도구를 사용하여 데이터를 표시하지 마십시오. 예 : phpMyAdmin은 정말 좋지 않은 인코딩을 사용하고있었습니다. 그리고 모든 레이어를 거쳐서 찾기가 어렵습니다. 또한 Internet Explorer는 기묘한 규칙을 기반으로 인코딩을 "추측하는"어리석은 행동을 보였습니다. 인코딩을 전환 할 수있는 간단한 편집기를 사용하십시오. 또한, 나는 MySQL Workbench를 추천한다.


도움이되기 때문에 알림을 사용하지 않으려 고하지 않았지만 너무 많은 타이핑을 피하려고했습니다.

내 솔루션이이 함수는 다음과 같습니다.

function ifexists($varname)
{
  return(isset($$varname)?$varname:null);
}

따라서 $ name을 참조하고 존재하는 경우 에코하려면 다음과 같이 작성하면됩니다.

<?=ifexists('name')?>

배열 요소의 경우 :

function ifexistsidx($var,$index)
{
  return(isset($var[$index])?$var[$index]:null);
}

페이지에서 $ _REQUEST [ 'name']을 (를) 참조하고자하는 경우 :

<?=ifexistsidx($_REQUEST,'name')?>




php mysql utf-8