2016-10-15 99 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」的起源,請將其解決。

相關問題