为什么mysql在似乎没有语法错误的情况下给我一个语法错误?

为什么mysql在似乎没有语法错误的情况下给我一个语法错误?,mysql,perl,Mysql,Perl,下面的代码是可运行的,工作正常,但是如果我更改$dbh->do(“set names utf8”)到$dbh->do(“设置名称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

下面的代码是可运行的,工作正常,但是如果我更改
$dbh->do(“set names utf8”)
$dbh->do(“设置名称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;
my$dbh=DBI->connect(“DBI:mysql:database=test;host=localhost”、“root”、“password”);
$dbh->do(“设置名称utf8”);
打开我的$jpg,'\n\n\n(“设置名称utf8”);至$dbh->do(“设置名称gb2312”);为什么set names gbk语句会给我一个语法错误?有没有什么明显的事情是我做错了

提前感谢:)

我正在运行ActivePerl 5.10.1和MySQL 5.5

更新

我找到罪犯了

此行
local$/导致MySQL语法错误。要解决此问题,只需注释掉这一行即可

我的Perl脚本是用GBK编码的,我的数据库表编码也是GBK,但我还必须将GBK中的集合名添加到Perl中的DBI中,否则,插入表中的GBK字符在GBK环境中无法正确显示

更新2


我以为我已经解决了这个问题,但问题仍然存在。当我删除本地$/;行,没有错误消息,但blob字段包含损坏的图像文件。

GBK已过时,您不能再使用它;MySQL不支持当前的标准GB 18030

解决方法:不要设置名称,只处理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
);

(我还没有测试过这段代码。)

com/users/183467/mike

我通过使用函数addslashes($img)解决了这个问题。 如果没有它,img变量包含需要用斜杠覆盖的字符,以允许它们正确地进入数据库。。否则,这些字符似乎会与您的sql代码混合,并被误读为语法错误


这就是为什么即使在删除外观后,错误消息图像也没有以正确的方式存储

表中要存储图像的第二列是什么类型?由于使用不同的编码会产生不同的错误,因此它似乎试图将图像二进制数据转换为字符串,并且并非所有字节组合都会生成有效的UTF-8。表是使用create table student(名称varchar(20),pic longblob)创建的;我显示的代码正好生成错误消息。奇怪的是,它包含两个“DBD::mysql::st execute failed”错误。看起来图像二进制数据是作为字符串处理的。我自己不使用php,但查询似乎试图将二进制数据转换为字符串。您是否尝试过在bind_参数中指定类型?类似bind_param(2$image,SQL_LONGBLOB)的东西感谢@daxim提供了有关GB18030的信息。请看我更新的帖子。我找到了导致MySQL语法错误的罪魁祸首。我不能仅仅用Perl来处理文本编码。如果不将set NAME to GBK语句添加到DBI,插入到GBK编码表中的GBK编码字符将无法在GBK环境中正确显示。
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
);