0

PostgreSQL 데이터베이스를 사용하여 perl 및 dojo에서 웹 페이지를 만들었습니다. 나는 데이터베이스에서 availale 사람들을 검색해야하고 덴마크에서 메신저 이후 편지 æ, ø 및 å 검색에서 사용할 수 있어야합니다. 나는 이것이 UTF8을 사용할 때 표준이라고 생각했고, PHP로 mysql을 통해 정상적으로 프로그램 할 때 그것이 그렇게 힘들지 않을 것이라고 생각했다.PostgreSQL, perl 및 dojo 특수 문자 문제 (æ, ø, å)

나는이 search_word를 올바른 인코딩으로 변환하는 모든 트릭을 올바르게 수행 했으므로 postgre sql 데이터베이스에서 æ, ø 및 å의 올바른 이름을 검색 할 수 있지만 ... 여전히 실패합니다.

내 패치 코드를 만들었지 만이 페치는 0 행을 반환하고 psql 터미널에 동일한 명령을 삽입하면 46 개의 행이 반환됩니다. "tail -f log terminal"에서 STDERR 문을 복사하고 삽입합니다.

sub dbSearchPersons { 
    my $search_word = escapeSql($_[0]); 
    $search_word = Encode::decode_utf8($search_word); 

    $statement = "SELECT id,name,initials,email FROM person WHERE name ilike '\%".$search_word."\%' OR email ilike '\%".$search_word."\%' OR initials ilike '\%".$search_word."\%' ORDER BY name ASC"; 
    $sth = $dbh->prepare($statement); 
    $num_rows = $sth->execute(); 

    print STDERR "Statement: " . $statement; 
    if($num_rows > 0){ 
    $persons = $dbh->selectall_hashref($statement,'id'); 
    } 

    dbFinish($sth); 
    webdie($DBI::errstr) if($DBI::errstr); 
} 

당신이 볼 수 있듯이 나는 STDERR에 SQL 문을 작성하고 다음과 같은 출력한다 : psql의 명령을 통해 데이터베이스에 연결된 다른 단말기)로 ... 펄 코드는

[Fri Apr 27 11:24:26 2012] [error] [client 10.254.0.1] Statement: SELECT id,name,initials,email FROM person WHERE name ilike '%Jørgen%' OR email ilike '%Jørgen%' OR initials ilike '%Jørgen%' ORDER BY name ASC, referer: https://xx.xxx.xxx.xx/cgi-bin/users.cgi 

SQL을 올바르게 작성했습니다. 러프 터미널 출력) 위의 터미널 출력을 복사하여 터미널에서 직접 붙여 넣고 psql 터미널에 직접 삽입하면 46 행이 반환됩니다 ... 그러나 perl은 여전히 ​​모든 행을 반환하지 않습니다.

나는 그것을 얻지 못합니까? "ø"가 아닌 "ø"를 표시 할 문자열을 포맷 할 때 (perl은 dojo.xhr.post를 통해 보내지는 "J % C3 % B8rgen"에서 UTF8 인코딩을 변환하므로 사용하지 못하게해야합니다. SQL 문에서? psql 데이터베이스가 특정 인코딩을 가질 수 있기 때문에 어떻게 든 계정에 가져와야합니까? 아니면 완전히 다른 것일 수 있습니까?

누군가 나를 도울 수 있기를 바랍니다. 지금 이틀 동안이 문제를 고민하고 그들이해야처럼 일 이후 보이지만, 내가 조금 슬픈 얻을 작동하지 않는 한 : 당신은 아마 잊었

답변

3

/

감사합니다, 토르 아스트 페데르센를 pg_enable_utf8. 데이터베이스 인터페이스는 Perl 문자 데이터를 반환합니다. 당신은 아주 명확 말을하지 않습니다

$ createdb -e -E UTF-8 -l en_US.UTF-8 -T template0 so10349280 
CREATE DATABASE so10349280 ENCODING 'UTF-8' TEMPLATE template0 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8'; 

$ echo 'create table person (id int, name varchar, initials varchar, email varchar)'|psql so10349280 
CREATE TABLE 

$ echo "insert into person (id, name) values (1, 'Jørgensen')"|psql so10349280 
INSERT 0 1 

$ echo 'select * from person'|psql so10349280 
id | name | initials | email 
----+-----------+----------+------- 
    1 | Jørgensen |   | 

$ perl -Mutf8 -Mstrictures -MDBI -MDevel::Peek -E' 
    my $dbh = DBI->connect(
     "DBI:Pg:dbname=so10349280", $ENV{LOGNAME}, "", { RaiseError => 1, AutoCommit => 1, pg_enable_utf8 => 1} 
    ); 
    my $r = $dbh->selectall_hashref("select * from person where name = ?", "id", undef, "Jørgensen"); 
    Dump $r->{1}{name}; 
' 
SV = PV(0x836e20) at 0xa58dc8 
    REFCNT = 1 
    FLAGS = (POK,pPOK,UTF8) 
    PV = 0xa5a000 "J\303\270rgensen"\0 [UTF8 "J\x{f8}rgensen"] 
    CUR = 10 
    LEN = 16 

, 난 당신이 결국 도장에 사용 JSON으로 문자 데이터를 전송하려는 생각합니다. UTF-8 8 진수로 인코딩해야합니다. 다양한 JSON 라이브러리가이를 자동으로 처리하므로 수동으로 Encode 함수를 호출 할 필요가 없습니다.

+0

답변 해 주셔서 감사합니다. 나는 네가 맞다고 생각하지만 생산 환경을 발견했다. 특별한 charcters에 대한 몇 가지 사용자 지정 변환기를 사용하고 있기 때문에, 내 문제는 chars에 대한 사용자 정의 인코더/디코더를 사용해야하기 때문에 실제로 문제가되지 않았습니다. 단지 내 회사에서 어떤 사람이 저에게 말했을 것입니다. 필자는 불필요한 것들에 대해서 오랫동안 디버깅 할 필요가 없었습니다. 다시 한 번 감사드립니다. –