2012-10-19 52 views
1

这个查询`相同的MySQL查询在MySQL Workbench中比命令行

delimiter $$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `calculatePrice`(cheese VARCHAR(50), meat VARCHAR(50), veg VARCHAR(50)) RETURNS decimal(10,0) 
    DETERMINISTIC 
BEGIN 
DECLARE price DECIMAL; 
SET price = (SELECT SUM(x.Price) 
    FROM 
    (
     SELECT `priceFactor` AS Price FROM `tblCheese` WHERE `cheeseName` = cheese 
     UNION ALL 
     SELECT `priceFactor` AS Price FROM `tblMeat` WHERE `meatName` = meat 
     UNION ALL 
     SELECT `priceFactor` AS Price FROM `tblVeggie` WHERE `veggieName` = veg 
    ) x); 
RETURN price; 
END$$ 

` 

将返回从MySQL命令行客户端调用的时候,数学上正确的答案返回不同的结果,但不正确的任何其他程序或从PHP调用时(它的存在返回3,无论是参数传递的。)请参见下面: Identical query, identical parameters, different results

调用语句,如果它是模糊的,就是选择calculatePrice(“科尔比”,“香肠”,'黑豆');

我从来没有见过这种古怪。这一切都是关于MySQL的同一副本等。

编辑以添加:phpMyAdmin也会为查询生成正确的答案。

+0

看起来它正在返回8命令行和工作台。什么是错误? –

+0

命令行mysql和Workbench可能会有不同的设置,这可能会导致不同的结果集。具体来说,字符集设置用于解释来自数据库的数据。尝试比较设置。该命令是“显示变量”。 – 0xCAFEBABE

+0

@AndreasWederbrand CL返回8,这是正确的,或者无论查询的正确金额是多少,但WB无论如何返回3。对不起,它不完全可读= -S – Janet

回答

3

我可以告诉你这是怎么回事。

MySQL已经发货的时间最长,latin1_swedish_ce作为几乎所有的默认字符集。现在,您在创建数据库时通常会处理字符集,因此危险很小。

但是,通过一条线传输数据需要编码,并且解释用户端的数据也需要解释。所以也有相应的设置。而且MySQL工具的标准字符集是(因为它们来自同一家公司)latin1_swedish。

这是否会成为查询的问题高度依赖于查询运行的所有数据。另外,在查询中使用常量字符串时,它们的解释方式与从数据库到客户端的数据的解释方式大致相同。

因此,字符编码通常是问题,并且也是在这里。

+0

谢谢你,有相同的问题,相同的瑞典编码 – nakajuice

+0

哦,抱歉,虽然我也有瑞典编码,但它不是MySQL命令行和PHP中不同结果的原因。原因是BIT类型,在PHP中它总是返回一个空字符串。尽量避免它,并使用INT来代替。 – nakajuice

0

@ x0cafebabe碰到它的头部:除了其中一个character_变量被设置为UTF8,我在安装MySQL时指定的内容,但character_set_database被设置为Sweedish编码。我修正了这个问题,现在MySQL函数在各种媒体中都是一致的。为什么这有所作为,我不知道(我在评论中提到过),但它确实如此。

我会永远检查这个每一次MySQL安装我再次做过...这是太令人头痛的这样一个微不足道的设置!

+0

我不知道工作台在哪里保存它的设置,但是对于客户端,您可以在[client]或[mysql]块中检查my.cnf以进行任意处理。如果没有选择字符编码,则表示它与系统默认值一致。可能是WB从它运行的系统中获取了这些信息。而且瑞典人真的只有一个电子:) –

+0

不要求我拼写正确的愚蠢-AM XD – Janet

+0

如果你能接受我的文章作为解决方案,我会很高兴。 – 0xCAFEBABE

相关问题