mysql排序规则错误_MySQL中“非法混合排序规则”错误的疑难解答
阿波羅的戰車
更改字符串的一個(或兩者)的排序規則以使它們匹配,或者添加一個COLLATE從句到你的表情。這“校對”到底是什么?如下文所述字符集和排序規則:A?字符集是一組符號和編碼。一個校對用于比較字符集中字符的一組規則。讓我們用一個假想字符集的例子來明確區分。假設我們有一個有四個字母的字母表:“A”, “B”, “a”, “b“我們給每個字母一個數字:“A” = 0, “B” = 1, “a” = 2, “b“=3.信”A“是一個符號,數字0是編碼為“A“,這四個字母及其編碼的組合是字符集.假設我們要比較兩個字符串值,“A“和”B“最簡單的方法是查看編碼:0表示“A“和1代表”B“因為0小于1,我們說“A“小于”B“我們剛才做的是對我們的字符集進行排序。排序規則是一組規則(在本例中只有一條規則):“比較編碼”。我們稱之為最簡單的排序規則雙星校對。但是如果我們想說小寫字母和大寫字母是等價的呢?那么我們至少有兩個規則:(1)處理小寫字母“a“和”b“相當于”A“和”B“;(2)然后比較編碼。我們稱之為a不區分大小寫校對。它比二進制排序要復雜一些。在現實生活中,大多數字符集都有許多字符:不僅僅是“A“和”B“但是整個字母,有時是多重字母或東方文字系統,有數千個字符,還有許多特殊的符號和標點符號。在現實生活中,大多數校對都有許多規則,不僅是關于是否區分字母,還包括是否區分口音(“重音”是一個附加在一個字符上的標記,就像在德語中那樣)。?),以及多字符映射(例如“?” = “OE“在兩個德國校勘中的一個)。下面給出了進一步的例子校對效果實例.好的,但是MySQL如何決定對給定表達式使用哪種排序規則呢?如下文所述表達的校對:在大多數語句中,很明顯MySQL使用什么排序規則來解決比較操作。例如,在以下情況下,應該清楚地看到,排序規則是列的排序規則。charset_name:SELECT?x?FROM?T?ORDER?BY?x;SELECT?x?FROM?T?WHERE?x?=?x;SELECT?DISTINCT?x?FROM?T;但是,對于多個操作數,可能存在歧義。例如:SELECT?x?FROM?T?WHERE?x?=?'Y';比較是否使用列的排序規則?x,或者字符串文字。'Y'?雙管齊下x和'Y'有排序,那么哪個排序優先?標準SQL使用以前稱為“矯頑力”的規則來解決這些問題。[?deletia?]MySQL使用具有以下規則的矯頑力值來解決歧義:如果雙方都是Unicode,或者雙方都不是Unicode,則這是一個錯誤。如果其中一方具有Unicode字符集,另一方具有非Unicode字符集,則具有Unicode字符集的側獲勝,并將自動字符集轉換應用于非Unicode側。例如,以下語句不返回錯誤:SELECT?CONCAT(utf8_column,?latin1_column)?FROM?t1;它返回一個結果,該結果的字符集為utf8和同樣的校對utf8_column..值.的值latin1_column自動轉換為utf8在連接之前。對于操作數來自同一字符集的操作數的操作,但該操作混合了_bin校對和_ci或_cs校對_bin使用校對。這類似于混合非二進制字符串和二進制字符串的操作如何將操作數計算為二進制字符串,只是用于排序規則而不是數據類型。使用矯頑力最低的排序規則。如果雙方具有相同的矯頑力,那么:那么,什么是“非法拼貼”呢?當表達式比較兩個字符串的不同排序規則(但具有相同的矯頑力)和矯頑力規則無法幫助解決沖突時,就會出現“排序規則的非法組合”。這是在上述報價的第三個要點下所描述的情況.問題中給出的特別錯誤,Illegal mix of collations (latin1_general_cs,IMPLICIT) and (latin1_general_ci,IMPLICIT) for operation '=',告訴我們,兩個具有相同矯頑力的非Unicode字符串之間有一個相等的比較。它還告訴我們,排序規則不是在語句中顯式地給出的,而是從字符串的源(例如列元數據)中隱含的。這一切都很好,但是如何解決這些錯誤呢?正如上面引用的手冊摘要所表明的那樣,這個問題可以通過多種方式解決,其中有兩種是明智的,建議如下:如果僅為解決這一錯誤而部署其他人,則其他的做法將是非常糟糕的:強制字符串中的一個(或兩者)具有其他的矯頑力值,以便優先。使用CONCAT()或CONCAT_WS()將導致字符串的矯頑力為1;(如果在存儲的例程中)使用參數/局部變量將導致字符串的矯頑力為2。更改字符串的一個(或兩者)的編碼,以便一個是Unicode,另一個不是。這可以通過將代碼轉換為CONVERT(expr USING transcoding_name);或通過更改數據的基本字符集(例如修改列、更改character_set_connection用于文字值,或以不同的編碼和更改從客戶端發送它們。character_set_client/添加字符集介紹器)。請注意,如果無法在新字符集中編碼某些所需字符,則更改編碼將導致其他問題。更改字符串的一個(或兩者)的編碼,使它們都相同,并將一個字符串更改為使用相關的_bin校對。以上詳細介紹了更改編碼和排序規則的方法。如果實際需要應用比_bin校對。明示COLLATE子句的矯頑力為0。(一點也不能矯頑力)具有不同排序規則的兩個字符串的連接具有1的矯頑力。列的排序規則、存儲的例程參數或局部變量的矯頑力為2。“系統常量”(由函數返回的字符串,如USER()或VERSION())矯頑力為3。文字的排序規則具有4的矯頑力。NULL或派生自NULL矯頑力為5。更改一個字符串(或兩個字符串)的排序規則,以便它們匹配,并且不再有任何歧義。如何做到這一點取決于字符串的來源:文字表達式采用collation_connection表的值采用列元數據中指定的排序規則。強迫一條字符串不可強制。我省略了以下引述:MySQL分配矯頑力值如下:因此,只需添加一個COLLATE子句到比較中使用的字符串之一將強制使用該排序規則。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的mysql排序规则错误_MySQL中“非法混合排序规则”错误的疑难解答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux内核等价多路径路由,Linux
- 下一篇: linux cmake编译源码,linu