此查询`
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)。见下文:
调用语句,如果它模糊,是SELECT calculatePrice('colby','sausage','black beans');
我以前从未见过这种古怪。它完全取决于MySQL的同一副本。
编辑添加:phpMyAdmin也会产生正确的查询答案。
答案 0 :(得分:3)
我可以告诉你这是怎么回事。
MySQL的出货时间最长,latin1_swedish_ce作为几乎所有内容的默认字符集。现在,您通常在创建数据库时会处理字符集,因此存在的危险很小。
但是,通过一行传输数据需要编码,并且解释用户端的数据也需要解释。所以也有设置。 MySQL工具的标准字符集(因为它们来自同一家公司)latin1_swedish。
这对查询是否有问题在很大程度上取决于查询运行的所有数据。此外,在查询中使用常量字符串时,它们的解释方式与从数据库到客户端的数据的解释方式大致相同。
因此,字符编码通常是问题,它也在这里。
答案 1 :(得分:0)
@ x0cafebabe点击它:除了我的一个character_变量之外的所有变量都被设置为UTF8,这是我在安装MySQL时指定的,但是character_set_database被设置为瑞典语编码。我解决了这个问题,现在MySQL功能在各种介质中都是一致的。为什么这会产生影响,我不知道(我在评论中提到过),但确实如此。
我将永远在每次重新安装的MySQL安装上检查这一点......对于这样一个微不足道的设置来说,这太令人头痛了!