prosource

Perl/MariaDB: 디코딩과 충돌(실행 실패:잘못된 문자열 값: '\xE4...'

probook 2023. 8. 21. 21:23
반응형

Perl/MariaDB: 디코딩과 충돌(실행 실패:잘못된 문자열 값: '\xE4...'

저는 펄로 html 파일에서 데이터를 추출하고 데이터베이스에 데이터를 삽입하려고 합니다.하지만 움라우트(ä,ö, ...)에는 이상한 행동이 있습니다.

설정은 다음과 같습니다.

use DBI;        
use DBD::mysql;
use HTML::Entities;

$name = ... # extraction from html-file

my $dbh = DBI->connect ("DBI:mysql:db_0",
                        "root", "mypw",
                        { RaiseError => 1
                          , PrintError => 0
                          , mysql_enable_utf8mb4 => 1
                        }
                        ) or die "Fehler beim Verbindungsaufbau zum MariaDB-Server:" .
                                 " $DBI::err -< $DBI::errstr \n";


my $insert_import = $dbh->prepare("INSERT INTO arzt_0 (name) VALUES (?));
$insert_import->execute($name)
or die "Fehler bei der Ausfuehrung: ".
   "$DBI::err -> $DBI::errstr (stage_imports $DBI::state)\n"
   ;

$insert_import->finish();

데이터베이스에 문자 집합 utf8mb4 및 collection utf8mb4_unicode_ci가 있습니다.

스칼라 $name의 내용이 umlaute에 대한 html 코드를 가지고 있기 때문입니다.&#196;위해서Ä사용한

use HTML::Entities;

HTML 코드를 문자로 변경하다Ä:

$name = decode_entities $name;

예를 들어, 원본 내용:$name이었다&#196;rztin그리고 디코딩 후Ärztin.

한다면$name터미널로 내보냅니다(print $name) 또는 두 경우 모두 파일로.Ärztin내보낼 것입니다.

하지만 만약에$name가 데이터베이스에 삽입되었습니다. 다음 오류가 발생했습니다.

DBD::mysql::st execute failed: Incorrect string value: '\xE4rztin...' for column .......

내가 대본에 쓴다면,

$name = 'Ärztin';
$insert_import->execute($name)

또는 직진

$insert_import->execute('Ärztin')

스크립트를 실행합니다. 오류가 없습니다.Ärztin열에 기록되어 있습니다.name.

물론. 뻔하지.$name디코딩된 경우는 umlaut가 있는 문자열이 스칼라에 직접 기록되는 경우와 다릅니다.이에 대한 설명은 무엇이며 어떻게 문제를 해결할 수 있습니까?

언급URL : https://stackoverflow.com/questions/72662754/perl-mariadb-conflict-with-decoding-execute-failed-incorrect-string-value

반응형