MySQL에서 이름 설정 utf8?


110

MySQL을 사용하는 PHP 스크립트에서 아래와 비슷한 것을 자주 볼 수 있습니다.

query("SET NAMES utf8");   

나는 아직 어떤 프로젝트에서도 이것을 할 필요가 없었기 때문에 그것에 대해 몇 가지 기본적인 질문이 있습니다.

  1. 이것은 PDO로만 수행되는 작업입니까?
  2. PDO와 관련된 것이 아니라면 그 목적은 무엇입니까? 나는 그것이 mysql에 대한 인코딩을 설정하고 있다는 것을 알고 있지만, 나는 그것을 사용할 필요가 없었기 때문에 왜 그것을 사용하고 싶습니까?

4
SQL 주입 때문에 "SET NAMES utf8"은 피해야합니다. 자세한 내용은 php.net/manual/en/mysqlinfo.concepts.charset.php를 참조하십시오.
masakielastic

3
@masakielastic 나는 'set names utf8'설정이 SQL 주입에 위협이되는 곳을 보지 못합니까? 적절한 MySQL API를 사용하여 스레드는 어디에 있습니까?
브로드밴드

3
불친절해서 죄송합니다. ircmaxell의 답변 참조 : stackoverflow.com/a/12118602/531320 Althogh "SET NAMES"는 UTF-8을 사용하는 한 문제가 없습니다. 향후 GBK 또는 Big5 (중국어) 또는 Shift_JIS (일본어)를 사용할 가능성은 부인할 수 없습니다. .
masakielastic

답변:


74

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

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

유니 코드의 작동 방식을 모르는 경우 http://www.joelonsoftware.com/articles/Unicode.html 을 읽으십시오 .

SET NAMES 대안을 보려면 "SET NAMES"사용 여부 와 그에 대한 정확한 내용 읽어보십시오 .


3
'ö'및 'ñ'은 확장 ASCII입니다. 여전히 SET NAMES UTF8그들을 위해 필요 합니까?

2
나는 종종 utf8_decode ($ my_text); MySQL에서 데이터를 쿼리 할 때 웹 사이트에 표시 할 특수 UTF-8 문자를 가져 오기 위해 PHP에서 내 테이블과 열이 MySQL에서 UTF-8로 설정되어 있는데 이것이 필요합니까?
NexusRex 2011 년

1
@ Vinko Vrsalovic : 반드시 그런 것은 아닙니다 ... 저는 모든 파일을 utf8에 가지고 있었지만 이전 호스팅 업체는 mysql 문자 세트를 latin1로 설정했고 mysql에게 utf8 (따라서 세트 이름 utf8)에서 문자를 보내고 있다고 mysql에 말하지 않았기 때문에 저장했습니다. 라틴 문자 세트와 내 모든 특수 문자 (슬로베니아어 čšž)는 자동차에 의해 넘쳐나는 것처럼 보였습니다. 한 가지 더 : phpmyadmin에서 검색하면 č가 Å와 같기 때문에 결과를 찾을 수 없습니다.
Erik Čerpnjak

또한 서버가 결과를 클라이언트로 다시 보내는 데 사용해야하는 문자 집합을 지정하므로이 데이터를 수신 할 때도 필요합니다 (예 : SELECT명령문 사용).
Leopoldo Sanczyk 2015

@ 팀. "확장 ASCII"와 같은 것은 실제로 없습니다. 모두 확장 ASCII라고 할 수있는 다양한 인코딩이 있습니다 (전반이 ASCII와 동일하고 많은로드가있는 단일 바이트 문자 집합).
TRiG

43

로부터 수동 :

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

좀 더 정교하게 (그리고 다시 한번, 매뉴얼 에서 무상으로 해제 ) :

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


6
사랑해. 방금 내 저녁을 만들었습니다!
karim79

34

올바른 인코딩을 얻는 것은 정말 까다 롭습니다. 레이어가 너무 많습니다.

  • 브라우저
  • 페이지
  • 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를 추천합니다.

19

이 쿼리는 데이터베이스에서 데이터를 생성하거나 업데이트하는 쿼리 앞에 작성되어야합니다.이 쿼리는 다음과 같습니다.

mysql_query("set names 'utf8'");

헤더에 사용중인 인코딩을 작성해야합니다. 예를 들어 utf-8을 사용하는 경우 헤더에 다음과 같이 추가하면 Internet Explorer에서 문제가 발생할 수 있습니다.

그래서 당신의 페이지는 다음과 같습니다

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
</html>

8
PHP mysql 라이브러리를 사용하지 말고 MySQLi 또는 PDO를 사용해야합니다.
André Figueira 2012

좋은 대답, 예를 들어 주셔서 감사합니다. 이것은 내가해야 할 일을 시각화하는 데 도움이 된 한 가지 대답이며 내 문제를 해결했습니다!
GTS Joe

1
마지막 태그는 <가 / HTML> 없습니다 <HTML>이어야한다
GTS 조

9

해결책은

 $conn->set_charset("utf8");

5

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


1

감사합니다 @all!

사용하지 마십시오 : query ( "SET NAMES utf8"); 이것은 설정 항목이며 쿼리가 아닙니다. setCharset () (또는 유사한 방법)으로 연결 시작 바로 뒤에 넣으십시오.

parctice에서 약간의 것 :

상태:

  • mysql 서버는 기본적으로 latin1을 말합니다.
  • 구멍 앱이 utf8에 있습니다.
  • 추가 (그래서 : latin1) (설정 이름 utf8 ..., set_charset () 메소드 / 함수 없음)

mysql이 문자를 처리 할 수있는 한 데이터를 저장하고 읽는 것은 문제가되지 않습니다. db를 살펴보면 이미 쓰레기가 있음을 알 수 있습니다 (예 : phpmyadmin 사용).

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

.. 다른 클라이언트 / 프로그램 또는 올바르게 작동하는 변경된 라이브러리가 없으면 데이터를 읽고 저장합니다. 그럼 당신은 큰 문제에 처해 있습니다!


0

PDO뿐만 아니라. SQL이 '????'와 같이 대답하면 기호, 사전 설정 문자 세트 (UTF-8 희망) 정말 권장합니다.

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

또는 절차 스타일을 통해 mysqli_set_charset($db,"utf8")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.