실행 실패: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
'sourcetip' 카테고리의 다른 글
Argparse를 사용하여 선택한 하위 명령 가져오기 (0) | 2023.06.17 |
---|---|
-I dir vs. -I system dir (0) | 2023.06.17 |
Python 스크립트 실행 시 "ImportError: No module named" (0) | 2023.06.17 |
SQL: 결과 행을 여러 번 반복하고 행 번호를 지정합니다. (0) | 2023.06.17 |
회계 응용 프로그램 달러 금액에 float 또는 decimal을 사용합니까? (0) | 2023.06.17 |