COLLATION'utf8_general_ci'对CHARACTER SET'latin1'无效

Ste*_*hen 21 mysql

我正在尝试修复字符编码问题 - 之前我们为此列utf8_general_ci设置了排序规则,因为它对重音不敏感而导致问题.

我正在尝试查找数据库中可能受到影响的所有条目.

DEFAULT CHARACTER SET utf8

但是,这会产生错误:

CHARSET=utf8

  1. 现在使用"DEFAULT CHARACTER SET utf8"定义数据库
  2. 该表定义为"CHARSET = utf8"
  3. "pid"列定义为:CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
  4. 服务器版本是服务器版本:5.5.37-MariaDB-0ubuntu0.14.04.1(Ubuntu)

问题:当latin1似乎不存在于表/模式定义的任何地方时,为什么我收到有关latin1的错误?

set names utf8;
select * from table1 t1 join table2 t2 on (t1.pid=t2.pid and t1.id != t2.id) collate utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

Mih*_*hai 26

首先运行此查询

SHOW VARIABLES LIKE '%char%';
Run Code Online (Sandbox Code Playgroud)

你有 character_set_server='latin1'

如果是这样,请进入您的配置文件my.cnf并添加或取消注释这些行:

character-set-server = utf8
collation-server = utf8_general_ci
Run Code Online (Sandbox Code Playgroud)

重启服务器.是晚会,刚刚遇到同样的问题.

  • 应该是`character-set-server`还是`character_set_server`? (3认同)
  • 它应该是字符集服务器 (2认同)

Tho*_*ria 8

在 MariaDB (10.1.36-MariaDB) 中使用括号和 COLLATE 语句的组合会产生同样的错误。我的 SQL 是不同的,错误是一样的,我有:

SELECT *
FROM table1
WHERE (field = 'STRING') COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)

省略括号是为我解决它。

SELECT *
FROM table1
WHERE field = 'STRING' COLLATE utf8_bin;
Run Code Online (Sandbox Code Playgroud)

  • 如果不能省略括号,请使用 BINARY 代替:`SELECT * FROM table1 WHERE BINARY field = BINARY 'STRING';` (2认同)