使用已定义函数的 UPDATE 语句的排序规则错误
Collation Error on UPDATE statement using a defined function
正如您将从我的代码中看到的那样,我已经指定了我创建的 table 和函数的 return 的排序规则,但我仍然收到错误消息。这是为什么?
我在 PHPmyAdmin-MYSQL 中应用查询时收到以下错误:
SQL查询:
UPDATE tb SET balance = (SELECT fnaccount_getbalance(acguid COLLATE utf8_general_ci,accur COLLATE utf8_general_ci,@stdate,@endate))
错误:
1267 - 操作 '='
的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合
这是我的查询:
CREATE TEMPORARY TABLE tb (id INT PRIMARY KEY AUTO_INCREMENT,
acguid char(38),
accur char(38),
account varchar(255),
debitsyp float,
creditsyp float,
balance float,
currency varchar(255))
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
SET @stdate = '2011-01-01';
SET @endate = CURDATE();
INSERT INTO tb (acguid,accur,account,debitsyp,creditsyp,balance,currency)
SELECT ac.guid,ac.currencyguid,CONCAT(ac.code,'-',ac.name) AS account,0,0,0,my.code
FROM ac000 ac INNER JOIN my000 my ON ac.currencyguid = my.guid
WHERE ac.guid IN (SELECT accountguid FROM en000);
UPDATE tb SET debitsyp = (SELECT SUM(debit) FROM en000 WHERE accountguid = acguid);
UPDATE tb SET creditsyp = (SELECT SUM(credit) FROM en000 WHERE accountguid = acguid);
UPDATE tb SET balance = (SELECT fnaccount_getbalance(acguid,accur,@stdate,@endate));
SELECT * FROM tb;
这是我的函数的代码 fnaccount_getbalance:
BEGIN
DECLARE acbal float;
SET acbal = (SELECT IFNULL(SUM((CASE
WHEN currencyguid = accur THEN debit / currencyval
ELSE debit / fngetcurval(accur,endate)
END) -
(CASE
WHEN currencyguid = accur THEN credit / currencyval
ELSE credit / fngetcurval(accur,endate)
END)),0) as balance
FROM en000 WHERE accountguid = acguid
AND endate BETWEEN stdate AND endate);
RETURN (acbal COLLATE utf8_unicode_ci);
END
我通过将数据库排序规则更改为 utf8_unicode_ci
解决了这个问题
之前是utf8_general_ci
然后我删除并重新创建了我在新 SQL 查询中拥有的所有功能
最初我根据另一个网站的建议将数据库排序规则设置为 utf8_general_ci,将 DATABASE 排序规则设置为 unicode 而不是一般的排序规则不好吗?
正如您将从我的代码中看到的那样,我已经指定了我创建的 table 和函数的 return 的排序规则,但我仍然收到错误消息。这是为什么?
我在 PHPmyAdmin-MYSQL 中应用查询时收到以下错误: SQL查询: UPDATE tb SET balance = (SELECT fnaccount_getbalance(acguid COLLATE utf8_general_ci,accur COLLATE utf8_general_ci,@stdate,@endate)) 错误:
1267 - 操作 '='
的排序规则 (utf8_unicode_ci,IMPLICIT) 和 (utf8_general_ci,IMPLICIT) 的非法混合这是我的查询:
CREATE TEMPORARY TABLE tb (id INT PRIMARY KEY AUTO_INCREMENT,
acguid char(38),
accur char(38),
account varchar(255),
debitsyp float,
creditsyp float,
balance float,
currency varchar(255))
CHARACTER SET utf8
COLLATE utf8_unicode_ci;
SET @stdate = '2011-01-01';
SET @endate = CURDATE();
INSERT INTO tb (acguid,accur,account,debitsyp,creditsyp,balance,currency)
SELECT ac.guid,ac.currencyguid,CONCAT(ac.code,'-',ac.name) AS account,0,0,0,my.code
FROM ac000 ac INNER JOIN my000 my ON ac.currencyguid = my.guid
WHERE ac.guid IN (SELECT accountguid FROM en000);
UPDATE tb SET debitsyp = (SELECT SUM(debit) FROM en000 WHERE accountguid = acguid);
UPDATE tb SET creditsyp = (SELECT SUM(credit) FROM en000 WHERE accountguid = acguid);
UPDATE tb SET balance = (SELECT fnaccount_getbalance(acguid,accur,@stdate,@endate));
SELECT * FROM tb;
这是我的函数的代码 fnaccount_getbalance:
BEGIN
DECLARE acbal float;
SET acbal = (SELECT IFNULL(SUM((CASE
WHEN currencyguid = accur THEN debit / currencyval
ELSE debit / fngetcurval(accur,endate)
END) -
(CASE
WHEN currencyguid = accur THEN credit / currencyval
ELSE credit / fngetcurval(accur,endate)
END)),0) as balance
FROM en000 WHERE accountguid = acguid
AND endate BETWEEN stdate AND endate);
RETURN (acbal COLLATE utf8_unicode_ci);
END
我通过将数据库排序规则更改为 utf8_unicode_ci
解决了这个问题之前是utf8_general_ci
然后我删除并重新创建了我在新 SQL 查询中拥有的所有功能
最初我根据另一个网站的建议将数据库排序规则设置为 utf8_general_ci,将 DATABASE 排序规则设置为 unicode 而不是一般的排序规则不好吗?