2015-01-13 14 views
4

나는 아포스트로피 ()과 줄임표 (...)를 포함 MySQL은 값이 :Perl DBI 이스케이프 값이 MySQL에서 검색되는 이유는 무엇입니까?

$ /bin/echo "select alias from url_alias where source = 'node/12024'" | \ 
    mysql --skip-column-names -D cat36ia_d7prod 

출력 :

forum/technical-discussion/nagging-questions-i’ve-been-too-embarrassed-ask… 

DBIDBD::mysql으로 값을 검색 할 때 값이 변경되었습니다.

$ perl -MDBI -MDBD::mysql -e 
     '$dbh=DBI->connect("DBI:mysql:database=my_db",nick); 
     $v=$dbh->selectrow_array(qq|select alias from url_alias where source = "'node/12024'"|); 
     print "$v\n";' 

출력 :

forum/technical-discussion/nagging-questions-i?ve-been-too-embarrassed-ask? 

왜 펄이를하고있다? 그것을 무시할 수 있습니까?

+1

The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)는 "탈출"문제가되지 않는다; 그것은 문자 세트 번역에 관한 문제입니다. 기본적으로 Perl은 STDIN, STDOUT 및 STDERR에 ASCII를 사용합니다. 네, 당신은 그 행동을 무시할 수 있습니다. 또한 데이터베이스 연결에서 코드 포인트를 지원하지 않는 문자 집합을 지정할 수도 있습니다. 그리고 그렇습니다, 그것은 또한 무시 될 수 있습니다. [** 절대적으로 모든 소프트웨어 개발자의 절대 최소, 유니 코드와 문자 집합에 대해 반드시 알고 있어야합니다 (변명의 여지가 없습니다!) **] (http://www.joelonsoftware.com/articles) /Unicode.html) – spencer7593

+1

그리고 다른 기사 : [** 모든 프로그래머가 절대적으로 긍정적으로 인코딩 및 문자 세트에 대해 알아야 할 텍스트 **] (http://kunststube.net/encoding/) – spencer7593

답변

6
  1. 어떻게 출력을 인코딩하는 펄에게.

    use open ':std', ':encoding(UTF-8)'; 
    
  2. DBI->connect("DBI:mysql:database=my_db", $user, $pass, { 
        mysql_enable_utf8 => 1, 
    }) 
    
+0

감사합니다. 출력 인코딩에 대해 알지 못했습니다. –

3

데이터베이스와 통신 할 때 DBI에 UTF8을 사용하도록 지시해야 할 수도 있습니다.

$dbh=DBI->connect(
    'DBI:mysql:database=my_db', $user, $pass, 
    { mysql_enable_utf8 => 1 } 
); 
+0

감사합니다. DBI 매개 변수를 추가했지만 아무런 차이가 없습니다. –

2

Q를 사용하여 텍스트로 데이터베이스에서 데이터를 가져 오기 : 왜 펄이를하고있다? 그것을 무시할 수 있습니까?

이스케이프되지 않습니다. 이는 문자 집합 번역 문제의 증상입니다. 물음표 문자는 코드 포인트가 대상 문자 집합의 다른 문자에 매핑되지 않을 때 사용되는 기본 문자입니다.


기본적으로 Perl은 ASCII 문자셋을 사용하여 STDOUT으로 출력합니다. ASCII는 U + 00EF까지만 코드 포인트를 지원하므로 다른 모든 코드 포인트 (예 : 128-255 자)는 물음표 문자로 변환됩니다.

수 있습니다이 동작을 재정의하는 방법에 대한 짧은 대답 : 지정하는 것이 STDIN, STDOUT와 펄 프로그램에서이 같은 라인을 포함하여 STDERR 사용 UTF8 인코딩이 아닌 ASCII :

use open qw(:std :utf8); 

또 다른 잠재적 인 문제는 MySQL 세션 character_set_client 변수 설정입니다. 데이터베이스 연결은 latin1 문자 집합을 사용할 수 있지만 데이터베이스/서버/열 문자 집합은 utf8 일 수 있으므로 문자 집합 번역도 거기에서 발생할 수 있습니다.

원하지 않는 문자셋 변환을 피하기 위해 데이터베이스 연결에 사용할 문자 집합을 지정할 수 있습니다.캐릭터 셋을 이해하는 출발점으로


, 여기 당신이 당신의 벨트 아래가 있어야 두 개의 참조입니다 :

What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text