почему mysql выдает синтаксическую ошибку, когда ее нет? - PullRequest
1 голос
/ 11 февраля 2012

Следующий код работает и работает нормально, но если я изменю $dbh->do("set names utf8"); на $dbh->do("set names gbk");, я получу синтаксическую ошибку:

use strict;
use warnings;
use DBD::mysql;

my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost","root","password");
$dbh->do("set names utf8");

open  my $jpg, '<', 'test.jpg' or die "$!";
binmode $jpg;
my $image = do{local $/; <$jpg>};
close $jpg;

 my $sql = "INSERT INTO student VALUES (?, ?)";

 my $sth = $dbh->prepare($sql);
 $sth->bind_param(1, 'Yang Liu');
 $sth->bind_param(2, $image);   
 $sth->execute();
 $sth->finish;
 exit;

Синтаксическая ошибка выглядит следующим образом:

DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near 'id=\'W5M0MpCehiHzreSzNTczkc9d\'?>\n<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' x
:xmptk' at line 1 at D:\sqltest.pl line 22.
DBD::mysql::st execute failed: You have an error in your SQL syntax; check the m
anual that corresponds to your MySQL server version for the right syntax to use
near 'id=\'W5M0MpCehiHzreSzNTczkc9d\'?>\n<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' x
:xmptk' at line 1 at D:\sqltest.pl line 22.

И подозрительная строка с надписью 'id=\'W5M0MpCehiHzreSzNTczkc9d\'?>\n<x:xmpmeta xmlns:x=\'adobe:ns:meta/\' связана с файлом изображения test.jpg, который я пытаюсь сохранить в длинном блобе, поскольку могу найти ту же строку, если открываю файл изображения с помощью текстового редактора.,

Странно, что код также работает, если я изменяю $ dbh-> do ("set names utf8");в $ dbh-> do ("установить имена gb2312");Почему оператор gbk с установленными именами выдает синтаксическую ошибку?Есть ли что-то очевидное, что я делаю не так?

Заранее спасибо:)

Я использую ActivePerl 5.10.1 и MySQL 5.5.

ОБНОВЛЕНИЕ

Я нашел виновника!

Эта строка local $/; вызывает синтаксическую ошибку MySQL.Чтобы решить проблему, просто закомментируйте эту строку.

Мой Perl-скрипт кодируется в GBK, и моя таблица базы данных также GBK, но я должен также добавить имена наборов для gbk в DBI в perl, в противном случае символы GBK, вставленные в таблицу, не будутправильно отображать в среде GBK.

UPDATE2

Я думал, что исправил проблему, но проблема на самом деле все еще существует.Когда я удаляю локальный $ /;В строке нет сообщения об ошибке, но в поле blob содержится поврежденный файл изображения.

1 Ответ

3 голосов
/ 11 февраля 2012

GBK устарел, вы не должны больше его использовать;и MySQL не поддерживает текущий стандарт GB 18030.

Обходной путь: не set names, а только кодирование текста в Perl.Сохраняйте двоичные данные, такие как изображения, в виде октетов.

use utf8;
use Encode qw(encode);
use Encode::HanExtra qw();
⋮
my $name = encode('GB18030', '刘阳', Encode::FB_CROAK | Encode::LEAVE_SRC);
$dbh->do(
    'INSERT INTO student VALUES (?, ?)',
    {},
    $name, $image
);

(я не проверял этот код).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...