1

这个查询`

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 也产生查询的正确答案。

4

2 回答 2

3

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

MySQL 发布时间最长的是 latin1_swedish_ce 作为几乎所有内容的默认字符集。现在,您通常在创建数据库时注意字符集,因此风险很小。

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

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

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

于 2012-10-19T10:30:39.710 回答
0

@x0cafebabe 击中了它:除了我的一个 character_ 变量之外的所有变量都设置为 UTF8,这是我在安装 MySQL 时指定的,但 character_set_database 设置为瑞典编码。我修复了这个问题,现在 MySQL 功能在各种媒体上都是一致的。为什么这会有所不同,我不知道(我在评论中问过),但确实如此。

我将永远在我曾经做过的每一个 MySQL 安装中检查这一点……对于这样一个微不足道的设置来说,这太让人头疼了!

于 2012-10-19T10:00:24.427 回答