2016-10-15 100 views
0

我一直在计算器上研究这个问题,超过24小时,并决定这是不是已经覆盖尽管有许多Q &关于同一主题的其他地方。MariaDB的不会更改排序规则的数据库

我使用HeidiSQL 9.3对MariaDB的10.1,并有一个奇怪的问题如下:我最初接受的默认排序,当我建立了我的数据库,然后意识到,这不是我想要的东西,并试图

改变它

ALTER DATABASE InternalFulfillment CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

,没有任何效果,并且数据库仍然是报告为ucs2_bin和所有的程序和功能ucs2_bin为好。我尝试了所有的建议,从每Q &一个我能找到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归类。

有没有人有这个地方可能存储,所以我可以清除它的想法。谢谢。阅读以下

答案离开这个过夜后

补充意见,第二天早上,我能够删除并重新创建具有不同的排序规则的数据库,但现在它卡上的新排序规则。

从回答@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,所以有一些东西被缓存了很长的到期时间。

+0

有趣的琐事问题。注意有服务器全局级别和会话级别变量。另请参阅https://dev.mysql.com/doc/refman/5.5/en/create-database.html – Drew

+0

我写这篇文章[Here](http://stackoverflow.com/a/39384425)副本和会话变量作为存根。还与Rick聊了起来[Here](http://chat.stackoverflow.com/transcript/message/32740569#32740569)......对它进行了一段时间的讨论,并且对我自己进行了更深入的研究。我会ping里克去看看。 – Drew

+0

很高兴知道您使用哪个MariaDB? select * from information_schema.schemata where schema ='InternalFulfillment'return?你是否也尝试使用命令行客户端? –

回答

1

貌似存在一些MariaDB的整理缓存。我是HeidiSQL的作者,我很确定HeidiSQL本身没有这样的整理缓存,所以它必须是MySQL和/或MariaDB的问题。

不过,我只是试图重现该问题在我的本地Windows一个MySQL v5.7.9服务器上,没有运气:

CREATE DATABASE `InternalFulfillment` /*!40100 COLLATE 'ucs2_bin' */; 
CREATE TABLE `table1` (
    `Column 1` VARCHAR(50) NULL 
) 
COLLATE='ucs2_bin' 
ENGINE=InnoDB; 

数据库和表1有ucs2_bin整理,符合市场预期。现在

ALTER DATABASE `internalfulfillment` COLLATE 'utf8mb4_general_ci'; 
CREATE TABLE `table2` (
    `Column 1` VARCHAR(50) NULL 
) 
COLLATE='utf8mb4_general_ci' 
ENGINE=InnoDB; 

,数据库和新创建的表2报告改变了整理,符合市场预期:

SELECT `DEFAULT_COLLATION_NAME` FROM `information_schema`.`SCHEMATA` 
    WHERE `SCHEMA_NAME`='internalfulfillment'; 
>> utf8mb4_general_ci 

SELECT TABLE_NAME, TABLE_COLLATION FROM `information_schema`.`TABLES` 
    WHERE TABLE_SCHEMA='internalfulfillment'; 

TABLE_NAME | TABLE_COLLATION 
table1 | ucs2_bin 
table2 | utf8mb4_general_ci 

所以,我的猜测是,你已经打了MariaDB的一个bug。

+0

感谢您对HeidiSQL的反馈。在上面的问题中查看我的其他评论。我认为你是对的,这一定是MariaDB 10.1中的一个bug。我会将你的答案标记为正确答案。 – bikeman868

1

检查这些:

SHOW VARIABLES LIKE 'char%'; -- If anything say 'ucs2...', you should change it 
SHOW CREATE DATABASE ...; -- The /*!40100 */ 'comment' is for hiding the clause for old versions. 
SHOW CREATE PROCEDURE ...\G 

一些基础知识(你似乎已经明白):

CHARACTER SETCOLLATION的数据库只有当你做CREATE TABLE没有指定他们默认

类似地,针对表指定的CHARACTER SETCOLLATION对于列仅为默认值

要更改给定列的COLLATION,您需要使用ALTER TABLE ... MODIFY COLUMN ...

要更改的默认值,ALTER可用于数据库或表;但这只影响未来表或列。

另一个问题......任何存储例程的CHARACTER SETCOLLATION是在声明例程时定义的。要更改其中一项或两项,您必须使用DROPreCREATE例程。

未来,utf8mb4是主要使用CHARACTER SETucs2(和大多数其他字符集)应该几乎不会被使用。如果您可以发现“ucs2”的起源,请将其解决。

相关问题