色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

異構數據庫排序一致性填坑教程

jf_78858299 ? 來源:基礎技術研究 ? 作者:陳偉 ? 2023-03-29 13:43 ? 次閱讀

不同數據庫對于字符值的排序規則各不相同,要達成在不同數據庫上對于同樣數據集執行查詢語句的輸出結果順序一致性目標,則必須進行相應的設置或改寫,本文通過對五種數據庫的分析,對該問題進行了較為深入的分析。

01

概述.

在異構數據庫之間進行數據遷移之后,為驗證數據一致性,就需要比對源庫和目標庫的同表數據是否一致。

為了提高比對效率,一般而言會將數據排序并抽取出來后進行比對。

在實際過程中發現,指定了ORDER BY的同樣兩條SQL語句在不同數據庫執行后,輸出結果集的順序經常會不同,本文關注該問題的產生并提供了相應的解決方案。

02

數據準備.

本文涉及的數據庫為:

  • Oracle
  • MySQL
  • Postgres
  • Gauss(華為open Gauss)
  • GoldiLocks(科藍)

所有的數據庫均采用UTF8編碼,且MySQL數據庫不區分大小寫建表。

在各數據庫中創建一張測試表LEXSORT,該表僅有一個字符列NAME,具體語句如下:

CREATE TABLE LEXSORT ( NAME VARCHAR(10) );

然后將以下數據插入該表中:

INSERT INTO LEXSORT VALUES ('0');
INSERT INTO LEXSORT VALUES ('9');
INSERT INTO LEXSORT VALUES ('a');
INSERT INTO LEXSORT VALUES ('z');
INSERT INTO LEXSORT VALUES ('A');
INSERT INTO LEXSORT VALUES ('Z');
INSERT INTO LEXSORT VALUES ('_');
INSERT INTO LEXSORT VALUES ('~');
INSERT INTO LEXSORT VALUES (NULL);

03

查詢結果.

在各個數據庫中執行如下查詢語句:

SELECT * FROM LEXSORT ORDER BY NAME;

其輸出結果見下圖:

圖片

通過上面的結果可以發現:

其一,Oracle、Gauss和GoldiLocks的缺省排序保持一致,而與MYSQL和Postgres的各不相同。

其二,數據排序的不同體現在兩個方面上

  • NULL值與非NULL字符值之間的順序
  • 非NULL字符值之間的順序

那么,這背后的機制是什么呢?又該如何解決呢?

04

數據庫分析.

其實,產生這一現象的原因是各數據庫的缺省排序規則各不相同所致。要解決這一問題,就需要從各數據庫自身出發,了解其排序規則,并分別進行設置,才可能達到在不同數據庫之間的一致性。

具體如何操作,后文將為您逐一展開。

Oracle數據庫

**Oracle數據庫提供了控制排序規則的參數,可以在系統級別和會話級別分別進行設置,一般而言,為了不影響其他應用,我們在會話級別進行設置即可。

**

1. NULL值的排序規則

Oracle支持在ORDER BY字句的每個字段上進行控制。可以指定為NULLS FIRST或NULLS LAST,即NULL值排在前面還是后面,缺省為NULLS LAST,即NULL值排在其它非NULL值的后面。

Postgres、Gauss和GoldiLocks也采用了同樣的處理,后文不再贅述。

2. 非NULL值的排序規則

Oracle提供了控制參數NLS_SORT來指定排序規則,缺省的排序規則為BINARY,即按照字符串中每個字符的編碼值進行排序,另一個常用排序規則為BINARY_CI,即按照二進制值進行排序,同時字母(A-Z,a-z)不區分大小寫。

根據以上規則重新修改一下SQL語句或會話設置:

ALTER SESSION SET NLS_SORT=BINARY;
ALTER SESSION SET NLS_SORT=BINARY_CI;
SELECT * FROM LEXSORT ORDER BY NAME NULLS FIRST;

此時不同組合后查詢的輸出結果見下圖:

圖片

在上圖中我們會注意到,不區分大小寫排序時字符“_”的位置似乎有些“飄忽不定”。為了解決這個問題,我們把這些字符對應的編碼數值出來看一下:

圖片

根據編碼值就會發現,“飄忽不定”的符號“_”的編碼正好位于大寫字母和小寫字母之間,與它存在同樣情況的還有5個字符。這就意味著,Oracle在采用BINARY_CI方式忽略字母大小寫排序時,會自動將所有的字母視為了小寫字母。

MySQL數據庫

MySQL數據庫在排序控制方面較弱,首先對于NULL值,MySQL自動視為NULLS FIRST,在ORDER BY字句中無相應的控制選項。

再看一下字母的排序,MySQL在建表時可以指定區分大小寫或不區分大小寫,一旦指定無法再修改,除非重新建表。

因此對于區分大小寫的庫,其排序規則會與Oracle的BINARY規則保持一致。

那么不區分大小寫的呢?其實在前面的截圖中已經有了體現,不過為了清晰起見,我們將Oracle設置為NULL FIRST和不區分大小寫,單獨拿出來再進行一下比較:

圖片

此時我們會發現Oracle和MySQL的排序依然不一致!發生問題的依然是那個“飄忽不定”的“_”。

顯然,稍加分析后我們就會知道,在不區分大小寫的情形下,MySQL自動將所有字母視為了大寫字母進行排序,正是因為這個區別,位于大寫和小寫字母之間的那六個字符又一次給我們惹了麻煩。

這樣,不區分大小寫建表的MySQL數據庫與Oracle數據庫的排序一致性就不存在完美的解決方案!

Postgres數據庫

Postgres數據庫的缺省排序對我來說一直是個迷……

圖片

上圖中,符號排在最前面,而“~”的編碼卻比“_”大,相當于降序;然后是數字和字母,而此時又是升序。鑒于本人對Postgres的研究有限,此處暫不作深究,只專注如何解決排序一致性問題。

Postgres提供了collate語句用以調整排序規則。將排序規則設置為C(必須用雙引號括起來且為大寫字母)或ucs_basic(如果用雙引號括起則必須為小寫)則代表按照字符編碼排序,此時會區分大小寫。

不區分大小寫且又要按照編碼值進行排序,目前暫未找到合適的方法。

需要注意指定collate和null first時的SQL語句順序問題,當二者都需指定時示例語句如下,具體的輸出結果大家可以自行測試:

SELECT * FROM LEXSORT ORDER BY NAME COLLATE ucs_basic NULLS FIRST;

Gauss數據庫

大家都知道Open Gauss實際上是基于Postgres進行的定制,它在增加部分功能的同時也刪減了部分Postgres的功能。不過對于ORDER BY子句,Gauss依然保留了Postgres的能力,也就是說collate子句同樣適用于Gauss數據庫,不過Gauss數據庫的缺省排序規則即為按照字符編碼值進行排序。

同時,Gauss數據庫提供了排序函數NLSSORT,解決了不區分大小排序的問題,此時其排序結果與Oracle保持一致。使用該函數時需指定排序規則,不區分大小寫的規則為generic_m_ci,具體SQL示例語句如下:

SELECT * FROM LEXSORT ORDER BY NLSSORT(NAME,'nls_sort=generic_m_ci');
SELECT * FROM LEXSORT ORDER BY NLSSORT(NAME,'nls_sort=generic_m_ci') NULLS FIRST;

幾種不同組合的查詢結果見下圖(未寫明null first時均為nulls last):

圖片

****GoldiLocks數據庫 ****

該數據庫除了NULLS FIRST/LAST處理與Oracle保持一致外,并沒有可以修改排序規則的參數,不過其缺省的排序規則即為按照字符編碼值進行排序。因此在排序一致性方面依然可以與Oracle、Postgres、Gauss做到很好的兼容。

05

總結.

雖然本文起源于數據比對場景,不過通過上面的分析,我們可以意識到,排序一致性問題也是異構數據庫遷移時必須考慮的問題之一。試想一下,如果不做SQL語句改造,原有的業務查詢語句在新數據庫中結果集排序可能會發生變化,進而導致后續處理結果也可能發生變化。

通過分析我們也發現,大多數數據庫的排序一致性可以通過設置會話參數或修改SQL語句等來實現保持不變,不過部分數據庫,例如本例中的MySQL,卻缺乏完美的解決方案,那么我們就必須要分析其影響并進行應對。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3799

    瀏覽量

    64380
  • Oracle
    +關注

    關注

    2

    文章

    289

    瀏覽量

    35129
  • 數據集
    +關注

    關注

    4

    文章

    1208

    瀏覽量

    24699
收藏 人收藏

    評論

    相關推薦

    如何解決數據庫與緩存一致性

    緩存一致性 每次逢年過節的時候搶票非常艱難,放票的時候那么多人同時去搶票,如果所有人查詢、購票等都去訪問數據庫,那數據庫的壓力得有多大,這時候很多都會引入緩存, 把車票信息放入緩存,這樣可以減少
    的頭像 發表于 09-25 15:25 ?1108次閱讀
    如何解決<b class='flag-5'>數據庫</b>與緩存<b class='flag-5'>一致性</b>

    理解數據庫的事務:ACID,CAP和一致性

    理解數據庫的事務,ACID,CAP和一致性
    發表于 05-04 16:25

    一致性規劃研究

    針對一致性規劃的高度求解復雜度,分析主流一致性規劃器的求解策略,給出影響一致性規劃器性能的主要因素:啟發信息的有效,信念狀態表示方法的緊湊
    發表于 04-06 08:43 ?12次下載

    加速器一致性接口

    Zynq PS上的加速器一致性接口(Accelerator Coherency Port, ACP)是個兼容AXI3的64位從機接口,連接到SCU(Snoop Control Unit),為PL
    發表于 11-17 15:04 ?3676次閱讀

    速度不可測的異構多智能體系統一致性分析

    近年來,隨著異構系統在實際中的廣泛應用,異構多智能體系統一致性分析成為研究熱點。針對階部分智能體控制輸入有界、二階智能體速度不可測的異構
    發表于 11-17 15:08 ?9次下載

    時延異構多自主體系統的群一致性分析

    針對由階自主體和二階自主體構成的異構多自主體系統的靜態群一致性問題,分別提出了在固定連接拓撲和切換連接拓撲結構下的靜態群一致性算法。通過構造Lyapunov-Krasovskii函數
    發表于 12-19 18:48 ?0次下載
    時延<b class='flag-5'>異構</b>多自主體系統的群<b class='flag-5'>一致性</b>分析

    分布式大數據一致性檢測

    關系數據庫中可能存在數據一致性現象,關系數據庫數據質量的個主要問題是存在違反函數依賴情況,為
    發表于 01-12 16:29 ?0次下載

    優化模型的乘偏好關系一致性改進

    針對乘偏好信息下的決策問題,引入乘偏好關系的有序一致性、滿意一致性以及一致性指數等概念,建立以偏差變量最小化為目標函數的優化模型,進而構
    發表于 03-20 17:28 ?0次下載

    緩存與數據庫一致性問題如何解決

    最近不是正好在研究 canal 嘛,剛巧前兩天看了篇關于解決緩存與數據庫一致性問題的文章,里邊提到了種解決方案是結合 canal 來操作的,所以阿Q就想趁熱打鐵,手動來實現
    的頭像 發表于 03-24 14:34 ?654次閱讀
    緩存與<b class='flag-5'>數據庫</b><b class='flag-5'>一致性</b>問題如何解決

    什么是數據庫營銷

    數據庫一致性(database consistency)由組值定義,數據庫系統中的所有數據點都必須與這些值保持
    的頭像 發表于 07-13 11:38 ?608次閱讀
    什么是<b class='flag-5'>數據庫</b>營銷

    虹科干貨 | 什么是數據庫一致性

    數據庫一致性(database consistency)由組值定義,數據庫系統中的所有數據點都必須與這些值保持
    的頭像 發表于 07-13 13:56 ?643次閱讀
    虹科干貨 | 什么是<b class='flag-5'>數據庫</b><b class='flag-5'>一致性</b>?

    Redis緩存與Mysql如何保證一致性

    基本流程就是客戶端A請求,先去刪除緩存,然后將數據寫入數據庫,此時客戶端B查詢先去查詢緩存,緩存沒有返回,去查數據庫,此時還沒有完成主從同步,拿到是從的舊
    的頭像 發表于 12-02 14:23 ?928次閱讀
    Redis緩存與Mysql如何保證<b class='flag-5'>一致性</b>?

    DDR一致性測試的操作步驟

    DDR一致性測試的操作步驟? DDR(雙數據率)一致性測試是對DDR內存模塊進行測試以確保其性能和可靠。在進行DDR一致性測試時,需要遵循
    的頭像 發表于 02-01 16:24 ?1533次閱讀

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別

    深入理解數據備份的關鍵原則:應用一致性與崩潰一致性的區別 在數字化時代,數據備份成為了企業信息安全的核心環節。但在備份過程中,兩個關鍵概念——應用
    的頭像 發表于 03-11 11:29 ?911次閱讀
    深入理解<b class='flag-5'>數據</b>備份的關鍵原則:應用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區別

    異構計算下緩存一致性的重要

    在眾多回復中,李博杰同學的回答被認為質量最高。他首先將緩存一致性分為兩個主要場景:是主機內CPU與設備間的一致性;二是跨主機的一致性
    的頭像 發表于 10-24 17:00 ?543次閱讀
    <b class='flag-5'>異構</b>計算下緩存<b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>
    主站蜘蛛池模板: 野花影院手机在线观看| 欧美精品一卡二卡| 国产专区青青在线视频| 国产精品97久久AV色婷婷| 成年女人免费播放影院| TUBE19UP老师学生| ass亚洲熟妇毛耸耸pics| 99久久精品免费看国产一区二区三区 | 国产精品亚洲AV毛片一区二区三区| CHINESE老阿姨免费视频| 99久久国产露脸精品国产麻豆| 91麻豆精品| 99这里只有是精品2| gogogo高清在线观看| 把腿张开再深点好爽宝贝| 苍井空小公主qvod| 富婆夜店找黑人猛男BD在线 | 亚洲精品无码国产爽快A片| 亚洲成人精品| 一本之道高清在线观看免费| 一级大乳奶| 2018年免费三级av观看| 99久久久无码国产精精品| blacked黑人战小美女| 俄罗斯粗大猛烈18P| 国产欧美一区二区精品性色tv| 国产午夜精品不卡视频| 九九热这里只有国产精品| 乱亲女H秽乱长久久久| 欧美午夜精品一区二区蜜桃 | 免费亚洲视频在线观看| 啪啪后入内射日韩| 熟女人妻久久精品AV天堂| 亚洲国产在线视频中文字| 在线观看成年人免费视频| 97久久无码精品AV| 电影 qvod| 娇妻归来在线观看免费完整版电影 | 攻把受做哭边走边肉楼梯PLAY| 国产人A片在线乱码视频| 久久精品亚洲国产AV涩情|