我正在尝试修复字符编码问题 - 之前我们为此列utf8_general_ci设置了排序规则,因为它对重音不敏感而导致问题。
我正在尝试查找数据库中可能受到影响的所有条目。
set names utf8;
select * from table1 t1 join table2 t2 on (t1.pid=t2.pid and t1.id != t2.id) collate utf8_general_ci;
然而,这会产生错误:
ERROR 1253 (42000): COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'latin1'
DEFAULT CHARACTER SET utf8
CHARSET=utf8
CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
问题:当latin1似乎没有出现在表/模式定义的任何地方时,为什么我收到有关latin1的错误?
MariaDB [(none)]> SHOW VARIABLES LIKE '%char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
MariaDB [(none)]> SHOW VARIABLES LIKE '%collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | utf8_general_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
答案 0 :(得分:23)
首先运行此查询
SHOW VARIABLES LIKE '%char%';
您有character_set_server='latin1'
如果是这样,请进入您的配置文件my.cnf并添加或取消注释这些行:
character-set-server = utf8
collation-server = utf8_general_ci
重启服务器。 是晚会,刚遇到同样的问题。
答案 1 :(得分:0)
通过使用括号和COLLATE语句的组合,在MariaDB(10.1.36-MariaDB)中会产生相同的错误。我的SQL不同,错误相同,我有:
SELECT *
FROM table1
WHERE (field = 'STRING') COLLATE utf8_bin;
省略括号为我解决了这个问题。
SELECT *
FROM table1
WHERE field = 'STRING' COLLATE utf8_bin;
答案 2 :(得分:0)
在我的情况下,我创建了一个数据库并将排序规则设置为“ utf8_general_ci”,但所需的排序规则为“ latin1”。将排序规则类型更改为latin1_bin后,错误消失了。
答案 3 :(得分:0)
首先运行此查询
SHOW VARIABLES LIKE '%char%';
您有character_set_server='latin1'
例如,如果CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
替换为CHARSET=latin1
并删除排序规则
你很好走