首页 > 解决方案 > MariaDB:如果从终端或 SQL 客户端运行代码,由于排序/编码,行为会有所不同

问题描述

如果我从 HeidiSQL 运行一个 sql-code (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 或终端的相同代码。

标签: windowsencodingterminalmariadbcollation

解决方案


每个客户都有自己的字符集,也许看看 HeidiSql 偏好。你也可以试试

SET @xml_id = '0-03';

SELECT *FROM test0.x0 WHERE xml_id like @xml_id ;

推荐阅读