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 客户端运行代码,由于整理/编码的不同行为的主要内容,如果未能解决你的问题,请参考以下文章

(三)MariaDB插件(Plugin)简介

异步执行 SQL 或从触发器更改锁定

在构建期间启用刷新edmx或从数据库更新模型

Access SQL:从插入语句或从 DAO.QueryDef 获取受影响记录的标识值

有人能告诉我为啥这段代码似乎可以工作,但不能……拜托?

从终端运行数据库中的 sql 文件