首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么mysql给了我一个语法错误,而似乎没有?

为什么mysql给了我一个语法错误,而似乎没有?
EN

Stack Overflow用户
提问于 2012-02-11 12:04:41
回答 2查看 1.5K关注 0票数 2

以下代码是可运行的,工作正常,但是如果我将$dbh->do("set names utf8");更改为$dbh->do("set names gbk");,我将收到一个语法错误:

代码语言:javascript
运行
复制
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;

语法错误如下:

代码语言:javascript
运行
复制
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/\'的可疑行与我试图存储到长text的test.jpg图像文件相关联,因为如果使用文本编辑器打开图像文件,可以找到相同的字符串。

奇怪的是,如果我将$dbh->do("set name utf8“)、$dbh->do("set name gb2312”)更改为$dbh->do;为什么设置名称gbk语句会导致语法错误?有什么明显的事情我做错了吗?

(预先谢谢:)

我正在运行ActivePerl 5.10.1和MySQL 5.5。

更新

我找到罪魁祸首了!

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

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

UPDATE2

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

EN

回答 2

Stack Overflow用户

发布于 2012-02-11 13:13:21

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

  • http://dev.mysql.com/doc/refman/5.5/en/faqs-cjk.html#qandaitem-B-11-1-1
  • http://www.gb18030.com/
  • http://zh.wikipedia.org/wiki/GB_18030

解决方法:不要使用set names,只处理Perl中的文本编码。保存二进制数据,如图像作为八进制。

代码语言:javascript
运行
复制
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
);

(我尚未测试此代码。)

票数 3
EN

Stack Overflow用户

发布于 2019-08-16 13:06:02

com/users/183467/mike

我使用函数加斜杠($img)解决了这个问题。没有它,img包含需要用斜杠覆盖的字符,这样才能在数据库中正确地使用它们。否则,这些字符似乎会与您的sql代码混在一起,并被误读为语法错误。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9240058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档