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が返されます)。以下を参照してください。 同一のクエリ、同一のパラメータ、異なる結果

ぼやけている場合の呼び出しステートメントは、SELECTcalculatePrice('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_ 変数の 1 つを除くすべてが、MySQL のインストール時に指定した UTF8 に設定されていましたが、character_set_database はスウェーデン語のエンコーディングに設定されていました。これを修正した結果、MySQL の機能はメディア間で一貫したものになりました。なぜそれが違いを生むのか、私にはわかりません(コメントで尋ねました)が、違いはありました。

私はこれまでに行ったすべてのMySQLインストールでこれを永遠にチェックします...そのような些細な設定にはあまりにも頭痛の種でした!

于 2012-10-19T10:00:24.427 に答える