相同的MySQL查询在MySQL Workbench中返回的结果与从命令行返回的结果不同

时间:2012-10-19 07:02:07

标签: mysql database function 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

调用语句,如果它模糊,是SELECT calculatePrice('colby','sausage','black beans');

我以前从未见过这种古怪。它完全取决于MySQL的同一副本。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

这对查询是否有问题在很大程度上取决于查询运行的所有数据。此外,在查询中使用常量字符串时,它们的解释方式与从数据库到客户端的数据的解释方式大致相同。

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

答案 1 :(得分:0)

@ x0cafebabe点击它:除了我的一个character_变量之外的所有变量都被设置为UTF8,这是我在安装MySQL时指定的,但是character_set_database被设置为瑞典语编码。我解决了这个问题,现在MySQL功能在各种介质中都是一致的。为什么这会产生影响,我不知道(我在评论中提到过),但确实如此。

我将永远在每次重新安装的MySQL安装上检查这一点......对于这样一个微不足道的设置来说,这太令人头痛了!