【发布时间】:2016-10-15 21:28:09
【问题描述】:
我已经在 StackOverflow 上研究这个问题超过 24 小时,并决定尽管有很多关于同一主题的问答,但其他地方还没有涉及到这个问题。
我在 MariaDB 10.1 上使用 HeidiSQL 9.3,但有一个奇怪的问题如下:我最初在创建数据库时接受了默认排序规则,然后意识到这不是我想要的并尝试更改它
ALTER DATABASE InternalFulfillment CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
这不起作用,数据库仍然报告为ucs2_bin,所有过程和函数也是ucs2_bin。我尝试了所有可以在 StackOverflow 上找到的问答中的所有建议,包括以下陈述:
SET collation_connection = 'utf8mb4_unicode_ci';
SET NAMES 'utf8mb4';
SET CHARACTER SET 'utf8mb4';
当我删除并重新创建程序时,它们仍然以ucs2_bin 的形式返回。
最奇怪的是,如果我删除并重新创建名为“InternalFulfilment”的数据库,排序规则是错误的,但如果我创建一个不同名称的数据库,那么我会得到我想要的排序规则,并运行脚本创建存储过程的创建过程使用utf8mb4_unicode_ci 排序规则。
似乎 MariaDB 和/或 HeidiSQL 正在记住我第一次创建“InternalFulfillment”数据库时使用的原始排序规则,并且每当我创建具有此名称的数据库时始终使用 ucs2_bin 排序规则。
有谁知道这可能存储在哪里,以便我清除它。谢谢。
阅读以下答案后的其他 cmets
隔夜离开后,第二天早上我能够删除并使用不同的排序规则重新创建数据库,但现在它卡在新的排序规则上。
接着@Anse 的回答:
DROP DATABASE IF EXISTS `InternalFulfillment`;
CREATE DATABASE `InternalFulfillment` /*!40100 COLLATE 'ucs2_bin' */;
USE `InternalFulfillment`;
CREATE TABLE `table1` (
`column1` VARCHAR(50) NULL
)
COLLATE='ucs2_bin'
ENGINE=InnoDB;
DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `proc1`(IN `param1` VARCHAR(50))
DETERMINISTIC
BEGIN
SELECT
column1
FROM
table1 t
WHERE
t.column1 = param1;
END//
DELIMITER ;
CALL proc1('test');
产生:/* SQL Error (1267): Illegal mix of collations (ucs2_bin,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '=' */。如果我用utf8mb4_general_ci 重新运行这个脚本,那么它会正确完成。
昨天我的数据库卡在ucs2_bin,今天它卡在utf8mb4_general_ci,所以有些东西被缓存了相当长的过期时间。
【问题讨论】:
-
有趣的琐事问题。请注意,有服务器全局级别和会话级别变量。另见dev.mysql.com/doc/refman/5.5/en/create-database.html
-
想知道您使用的是哪个 MariaDB 吗? select * from information_schema.schemata where schema='InternalFulfillment' 返回什么?您是否也尝试过使用命令行客户端?
标签: mysql database mariadb heidisql