sourcetip

실행 실패:mariadb 및 perl DBD가 있는 '\xD6sterl...' 문자열 값이 잘못되었습니다.

fileupload 2023. 6. 17. 09:37
반응형

실행 실패:mariadb 및 perl DBD가 있는 '\xD6sterl...' 문자열 값이 잘못되었습니다.

저는 DBI를 사용하여 umlauts 및 기타 ASCII가 아닌 문자가 포함된 이메일을 joomla 데이터베이스에 쓰는 데 문제가 있는 초보 펄 프로그래머입니다.

DBD::mysql::st execute failed: Incorrect string value: '\xD6sterl...' for column `lsv5webstage`.`xuxgc_content`.`fulltext` at row 1 at /home/alerts/scripts_linstage/AdvisoryTest.pm line 373.

저는 인코딩이 어떤 문제인지 완전히 이해하기 위해 어떻게 작동하는지 잘 모릅니다.이것은 mariadb-10.3.12와 joomla-3.9를 갖춘 중절모 29 시스템입니다.

분명히 '\xD6'는 "세바스찬 �sterlund"에서 움라우트가 있는 O입니다.utf8이 4-char를 처리할 수 없다는 내용을 읽었는데, 완전히 이해가 되지 않습니다.

온라인에서 인코딩 유형을 utf8에서 utf8mb4로 변경하는 것에 대한 다음 참조를 찾았지만, 테이블은 모두 이미 해당 인코딩을 사용하고 있는 것으로 보입니다.

> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR 
Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

도움이 될지는 모르겠지만 펄 코드에 사용하는 삽입문은 다음과 같습니다.

    my $sql                 = <<EOF;
    INSERT INTO xuxgc_content (title, alias, introtext, `fulltext`, state, catid, created, created_by, created_by_alias, modified, modified_by, checked_out, checked_out_time, publish_up, publish_down, images, urls, attribs, version, ordering, metakey, metadesc, metadata, access, hits, language)
    VALUES ($title, "$title_alias", $introText, $fullText, $state, $catid, $created, $created_by, $created_by_alias, $modified, $modified_by, $checked_out, $checked_out_time, $publish_up, $publish_down, $images, $urls, $attribs, $version, $ordering, $metakey, $metadesc, $metadata, $access, $hits, $language);
    EOF

    my $sth = $dbh->prepare($sql);
    $sth->execute();
    db_disconnect($dbh);

$fullText 변수는 이메일 본문을 포함하는 버퍼에서 채워집니다.INSERT를 수행하기 전에 quote()를 통해 실행하고 있습니다.

$fullText       = $dbh->quote($fullText);

저는 또한 "SET NAMES utf8mb4;내 테이블에 삽입...형식이 마음에 들지 않았습니다.

데이터베이스에 연결하는 데 사용되는 전체 기능은 다음과 같습니다.

sub db_connect () {
  my %DB        = (
    'host'  => 'myhost',
    'db'    => 'mydb',
    'user'  => 'myuser',
    'pass'  => 'mypass',
  );

  return DBI->connect("DBI:mysql:database=$DB{'db'};host=$DB{'host'}", $DB{'user'}, $DB{'pass'}, { mysql_enable_utf8mb4 => 1 });
 }

저는 과거에 이 문제가 있었던 기억이 없고, 이 스크립트는 꽤 오랫동안 사용되어 왔습니다.

D6에 대한 16진수ÖCHARACTER SET latin1(및 기타 여러 개).

고객이 다음을 사용한다고 선언했습니다.UTF-8(utf8mb4) 인코딩, 그래서 그것은 당신에게 침을 뱉습니다.

제공하십시오.SELECT HEX(col), col ...그것이D6데이터베이스(삽입 문제 발생) 또는 다른 문제 발생(검색/표시 문제 발생).

또한, 당신은 인용하지 않았습니다.$fulltext문자열이므로 모든 종류의 구문 오류가 발생할 수 있습니다.

제발 맹목적으로 현을 넣지 마세요.INSERT진술, 하지만 당신이 그것들을 넣을 때 그것들을 피하세요.

여기에는 몇 가지 유용한 Perl 힌트가 있을 수 있습니다.

    use utf8;
    use open ':std', ':encoding(UTF-8)';
my $dbh = DBI->connect("dbi:mysql:".$dsn, $user, $password, {
   PrintError => 0,
   RaiseError => 1,
   mysql_enable_utf8 => 1,  # Switch to UTF-8 for communication and decode.
});
# or {mysql_enable_utf8mb4 => 1} if using utf8mb4

그리고 바인딩/견적/도피 기술을 찾습니다.

언급URL : https://stackoverflow.com/questions/56659131/execute-failed-incorrect-string-value-xd6sterl-with-mariadb-and-perl-dbd

반응형