MariaDB:如果从终端运行代码或从 SQL 客户端运行代码,由于整理/编码的不同行为
Posted
技术标签:
【中文标题】MariaDB:如果从终端运行代码或从 SQL 客户端运行代码,由于整理/编码的不同行为【英文标题】:MariaDB: Different behaviour if running code from terminal or from an SQL-client due to collation/encoding 【发布时间】:2020-04-12 21:09:48 【问题描述】:如果我从 HeidiSQL 运行 sql 代码 (A),我会因为排序而出错。我可以考虑 sql-code (B) 中的排序规则,然后它就可以工作了。但是,如果我从终端或 Perl 脚本运行 sql,如果我在 sql 代码中考虑排序规则 (B),则会发生错误,但如果我在代码中删除排序规则,则会发生错误。
环境:Windows 10、MariaDB 10.4
例如:
-- Create minimal table
DROP TABLE IF EXISTS test0.x0 ;
CREATE TABLE test0.x0 (
id INTEGER
, xml_id CHAR(4)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
;
INSERT INTO test0.x0 VALUES
(1, '0-03')
, (2, '1-01')
;
如果我在 HeidiSQL 中运行以下代码 (A)
-- Code A
SET @xml_id = '0-03';
SELECT *
FROM test0.x0
WHERE xml_id = @xml_id
;
我收到此错误:
/* SQL Fehler (1267): Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '=' */
如果我考虑排序规则(代码 B)运行
-- Code B
SET @xml_id = '0-03';
SELECT *
FROM test0.x0
WHERE xml_id = @xml_id COLLATE utf8mb4_unicode_ci
;
它运行没有错误。
但如果我从终端或考虑排序规则的脚本提交代码(代码 B):
"c:\Program2\MariaDB 10.4\bin\mysql" -uroot --password=pw -h localhost test0 <i0048.sql
我收到以下错误:
ERROR 1253 (42000) at line 8: COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'cp850'
如果我删除排序规则设置(代码 A),它会正常运行。
我想知道为什么会发生这种情况,以及如何从终端或脚本运行代码 (B),避免删除排序规则设置 (xml_id = @xml_id COLLATE utf8mb4_unicode_ci
),因为我使用来自 HeidiSQL 或终端的相同代码。
【问题讨论】:
【参考方案1】:每个客户端都有自己的字符集,也许看看 HeidiSql 偏好。 你也可以试试
SET @xml_id = '0-03';
SELECT *FROM test0.x0 WHERE xml_id like @xml_id ;
【讨论】:
您可以显示连接的字符集:SHOW VARIABLES LIKE 'character%';以上是关于MariaDB:如果从终端运行代码或从 SQL 客户端运行代码,由于整理/编码的不同行为的主要内容,如果未能解决你的问题,请参考以下文章