欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

異構(gòu)數(shù)據(jù)庫(kù)排序一致性填坑教程

jf_78858299 ? 來(lái)源:基礎(chǔ)技術(shù)研究 ? 作者:陳偉 ? 2023-03-29 13:43 ? 次閱讀

不同數(shù)據(jù)庫(kù)對(duì)于字符值的排序規(guī)則各不相同,要達(dá)成在不同數(shù)據(jù)庫(kù)上對(duì)于同樣數(shù)據(jù)集執(zhí)行查詢語(yǔ)句的輸出結(jié)果順序一致性目標(biāo),則必須進(jìn)行相應(yīng)的設(shè)置或改寫(xiě),本文通過(guò)對(duì)五種數(shù)據(jù)庫(kù)的分析,對(duì)該問(wèn)題進(jìn)行了較為深入的分析。

01

概述.

在異構(gòu)數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)遷移之后,為驗(yàn)證數(shù)據(jù)一致性,就需要比對(duì)源庫(kù)和目標(biāo)庫(kù)的同表數(shù)據(jù)是否一致。

為了提高比對(duì)效率,一般而言會(huì)將數(shù)據(jù)排序并抽取出來(lái)后進(jìn)行比對(duì)。

在實(shí)際過(guò)程中發(fā)現(xiàn),指定了ORDER BY的同樣兩條SQL語(yǔ)句在不同數(shù)據(jù)庫(kù)執(zhí)行后,輸出結(jié)果集的順序經(jīng)常會(huì)不同,本文關(guān)注該問(wèn)題的產(chǎn)生并提供了相應(yīng)的解決方案。

02

數(shù)據(jù)準(zhǔn)備.

本文涉及的數(shù)據(jù)庫(kù)為:

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

所有的數(shù)據(jù)庫(kù)均采用UTF8編碼,且MySQL數(shù)據(jù)庫(kù)不區(qū)分大小寫(xiě)建表。

在各數(shù)據(jù)庫(kù)中創(chuàng)建一張測(cè)試表LEXSORT,該表僅有一個(gè)字符列NAME,具體語(yǔ)句如下:

CREATE TABLE LEXSORT ( NAME VARCHAR(10) );

然后將以下數(shù)據(jù)插入該表中:

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

查詢結(jié)果.

在各個(gè)數(shù)據(jù)庫(kù)中執(zhí)行如下查詢語(yǔ)句:

SELECT * FROM LEXSORT ORDER BY NAME;

其輸出結(jié)果見(jiàn)下圖:

圖片

通過(guò)上面的結(jié)果可以發(fā)現(xiàn):

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

其二,數(shù)據(jù)排序的不同體現(xiàn)在兩個(gè)方面上

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

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

04

數(shù)據(jù)庫(kù)分析.

其實(shí),產(chǎn)生這一現(xiàn)象的原因是各數(shù)據(jù)庫(kù)的缺省排序規(guī)則各不相同所致。要解決這一問(wèn)題,就需要從各數(shù)據(jù)庫(kù)自身出發(fā),了解其排序規(guī)則,并分別進(jìn)行設(shè)置,才可能達(dá)到在不同數(shù)據(jù)庫(kù)之間的一致性。

具體如何操作,后文將為您逐一展開(kāi)。

Oracle數(shù)據(jù)庫(kù)

**Oracle數(shù)據(jù)庫(kù)提供了控制排序規(guī)則的參數(shù),可以在系統(tǒng)級(jí)別和會(huì)話級(jí)別分別進(jìn)行設(shè)置,一般而言,為了不影響其他應(yīng)用,我們?cè)跁?huì)話級(jí)別進(jìn)行設(shè)置即可。

**

1. NULL值的排序規(guī)則

Oracle支持在ORDER BY字句的每個(gè)字段上進(jìn)行控制??梢灾付镹ULLS FIRST或NULLS LAST,即NULL值排在前面還是后面,缺省為NULLS LAST,即NULL值排在其它非NULL值的后面。

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

2. 非NULL值的排序規(guī)則

Oracle提供了控制參數(shù)NLS_SORT來(lái)指定排序規(guī)則,缺省的排序規(guī)則為BINARY,即按照字符串中每個(gè)字符的編碼值進(jìn)行排序,另一個(gè)常用排序規(guī)則為BINARY_CI,即按照二進(jìn)制值進(jìn)行排序,同時(shí)字母(A-Z,a-z)不區(qū)分大小寫(xiě)。

根據(jù)以上規(guī)則重新修改一下SQL語(yǔ)句或會(huì)話設(shè)置:

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

此時(shí)不同組合后查詢的輸出結(jié)果見(jiàn)下圖:

圖片

在上圖中我們會(huì)注意到,不區(qū)分大小寫(xiě)排序時(shí)字符“_”的位置似乎有些“飄忽不定”。為了解決這個(gè)問(wèn)題,我們把這些字符對(duì)應(yīng)的編碼數(shù)值出來(lái)看一下:

圖片

根據(jù)編碼值就會(huì)發(fā)現(xiàn),“飄忽不定”的符號(hào)“_”的編碼正好位于大寫(xiě)字母和小寫(xiě)字母之間,與它存在同樣情況的還有5個(gè)字符。這就意味著,Oracle在采用BINARY_CI方式忽略字母大小寫(xiě)排序時(shí),會(huì)自動(dòng)將所有的字母視為了小寫(xiě)字母。

MySQL數(shù)據(jù)庫(kù)

MySQL數(shù)據(jù)庫(kù)在排序控制方面較弱,首先對(duì)于NULL值,MySQL自動(dòng)視為NULLS FIRST,在ORDER BY字句中無(wú)相應(yīng)的控制選項(xiàng)。

再看一下字母的排序,MySQL在建表時(shí)可以指定區(qū)分大小寫(xiě)或不區(qū)分大小寫(xiě),一旦指定無(wú)法再修改,除非重新建表。

因此對(duì)于區(qū)分大小寫(xiě)的庫(kù),其排序規(guī)則會(huì)與Oracle的BINARY規(guī)則保持一致。

那么不區(qū)分大小寫(xiě)的呢?其實(shí)在前面的截圖中已經(jīng)有了體現(xiàn),不過(guò)為了清晰起見(jiàn),我們將Oracle設(shè)置為NULL FIRST和不區(qū)分大小寫(xiě),單獨(dú)拿出來(lái)再進(jìn)行一下比較:

圖片

此時(shí)我們會(huì)發(fā)現(xiàn)Oracle和MySQL的排序依然不一致!發(fā)生問(wèn)題的依然是那個(gè)“飄忽不定”的“_”。

顯然,稍加分析后我們就會(huì)知道,在不區(qū)分大小寫(xiě)的情形下,MySQL自動(dòng)將所有字母視為了大寫(xiě)字母進(jìn)行排序,正是因?yàn)檫@個(gè)區(qū)別,位于大寫(xiě)和小寫(xiě)字母之間的那六個(gè)字符又一次給我們?nèi)橇寺闊?/strong>

這樣,不區(qū)分大小寫(xiě)建表的MySQL數(shù)據(jù)庫(kù)與Oracle數(shù)據(jù)庫(kù)的排序一致性就不存在完美的解決方案!

Postgres數(shù)據(jù)庫(kù)

Postgres數(shù)據(jù)庫(kù)的缺省排序?qū)ξ襾?lái)說(shuō)一直是個(gè)迷……

圖片

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

Postgres提供了collate語(yǔ)句用以調(diào)整排序規(guī)則。將排序規(guī)則設(shè)置為C(必須用雙引號(hào)括起來(lái)且為大寫(xiě)字母)或ucs_basic(如果用雙引號(hào)括起則必須為小寫(xiě))則代表按照字符編碼排序,此時(shí)會(huì)區(qū)分大小寫(xiě)。

不區(qū)分大小寫(xiě)且又要按照編碼值進(jìn)行排序,目前暫未找到合適的方法。

需要注意指定collate和null first時(shí)的SQL語(yǔ)句順序問(wèn)題,當(dāng)二者都需指定時(shí)示例語(yǔ)句如下,具體的輸出結(jié)果大家可以自行測(cè)試:

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

Gauss數(shù)據(jù)庫(kù)

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

同時(shí),Gauss數(shù)據(jù)庫(kù)提供了排序函數(shù)NLSSORT,解決了不區(qū)分大小排序的問(wèn)題,此時(shí)其排序結(jié)果與Oracle保持一致。使用該函數(shù)時(shí)需指定排序規(guī)則,不區(qū)分大小寫(xiě)的規(guī)則為generic_m_ci,具體SQL示例語(yǔ)句如下:

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;

幾種不同組合的查詢結(jié)果見(jiàn)下圖(未寫(xiě)明null first時(shí)均為nulls last):

圖片

****GoldiLocks數(shù)據(jù)庫(kù) ****

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

05

總結(jié).

雖然本文起源于數(shù)據(jù)比對(duì)場(chǎng)景,不過(guò)通過(guò)上面的分析,我們可以意識(shí)到,排序一致性問(wèn)題也是異構(gòu)數(shù)據(jù)庫(kù)遷移時(shí)必須考慮的問(wèn)題之一。試想一下,如果不做SQL語(yǔ)句改造,原有的業(yè)務(wù)查詢語(yǔ)句在新數(shù)據(jù)庫(kù)中結(jié)果集排序可能會(huì)發(fā)生變化,進(jìn)而導(dǎo)致后續(xù)處理結(jié)果也可能發(fā)生變化。

通過(guò)分析我們也發(fā)現(xiàn),大多數(shù)數(shù)據(jù)庫(kù)的排序一致性可以通過(guò)設(shè)置會(huì)話參數(shù)或修改SQL語(yǔ)句等來(lái)實(shí)現(xiàn)保持不變,不過(guò)部分?jǐn)?shù)據(jù)庫(kù),例如本例中的MySQL,卻缺乏完美的解決方案,那么我們就必須要分析其影響并進(jìn)行應(yīng)對(duì)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3851

    瀏覽量

    64710
  • Oracle
    +關(guān)注

    關(guān)注

    2

    文章

    296

    瀏覽量

    35243
  • 數(shù)據(jù)集
    +關(guān)注

    關(guān)注

    4

    文章

    1209

    瀏覽量

    24842
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何解決數(shù)據(jù)庫(kù)與緩存一致性

    緩存一致性 每次逢年過(guò)節(jié)的時(shí)候搶票非常艱難,放票的時(shí)候那么多人同時(shí)去搶票,如果所有人查詢、購(gòu)票等都去訪問(wèn)數(shù)據(jù)庫(kù),那數(shù)據(jù)庫(kù)的壓力得有多大,這時(shí)候很多都會(huì)引入緩存, 把車票信息放入緩存,這樣可以減少
    的頭像 發(fā)表于 09-25 15:25 ?1170次閱讀
    如何解決<b class='flag-5'>數(shù)據(jù)庫(kù)</b>與緩存<b class='flag-5'>一致性</b>

    理解數(shù)據(jù)庫(kù)的事務(wù):ACID,CAP和一致性

    理解數(shù)據(jù)庫(kù)的事務(wù),ACID,CAP和一致性
    發(fā)表于 05-04 16:25

    一致性規(guī)劃研究

    針對(duì)一致性規(guī)劃的高度求解復(fù)雜度,分析主流一致性規(guī)劃器的求解策略,給出影響一致性規(guī)劃器性能的主要因素:?jiǎn)l(fā)信息的有效,信念狀態(tài)表示方法的緊湊
    發(fā)表于 04-06 08:43 ?12次下載

    加速器一致性接口

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

    速度不可測(cè)的異構(gòu)多智能體系統(tǒng)一致性分析

    近年來(lái),隨著異構(gòu)系統(tǒng)在實(shí)際中的廣泛應(yīng)用,異構(gòu)多智能體系統(tǒng)一致性分析成為研究熱點(diǎn)。針對(duì)階部分智能體控制輸入有界、二階智能體速度不可測(cè)的異構(gòu)
    發(fā)表于 11-17 15:08 ?9次下載

    時(shí)延異構(gòu)多自主體系統(tǒng)的群一致性分析

    針對(duì)由階自主體和二階自主體構(gòu)成的異構(gòu)多自主體系統(tǒng)的靜態(tài)群一致性問(wèn)題,分別提出了在固定連接拓?fù)浜颓袚Q連接拓?fù)浣Y(jié)構(gòu)下的靜態(tài)群一致性算法。通過(guò)構(gòu)造Lyapunov-Krasovskii函數(shù)
    發(fā)表于 12-19 18:48 ?0次下載
    時(shí)延<b class='flag-5'>異構(gòu)</b>多自主體系統(tǒng)的群<b class='flag-5'>一致性</b>分析

    分布式大數(shù)據(jù)一致性檢測(cè)

    關(guān)系數(shù)據(jù)庫(kù)中可能存在數(shù)據(jù)一致性現(xiàn)象,關(guān)系數(shù)據(jù)庫(kù)數(shù)據(jù)質(zhì)量的個(gè)主要問(wèn)題是存在違反函數(shù)依賴情況,為
    發(fā)表于 01-12 16:29 ?0次下載

    優(yōu)化模型的乘偏好關(guān)系一致性改進(jìn)

    針對(duì)乘偏好信息下的決策問(wèn)題,引入乘偏好關(guān)系的有序一致性、滿意一致性以及一致性指數(shù)等概念,建立以偏差變量最小化為目標(biāo)函數(shù)的優(yōu)化模型,進(jìn)而構(gòu)
    發(fā)表于 03-20 17:28 ?0次下載

    緩存與數(shù)據(jù)庫(kù)一致性問(wèn)題如何解決

    最近不是正好在研究 canal 嘛,剛巧前兩天看了篇關(guān)于解決緩存與數(shù)據(jù)庫(kù)一致性問(wèn)題的文章,里邊提到了種解決方案是結(jié)合 canal 來(lái)操作的,所以阿Q就想趁熱打鐵,手動(dòng)來(lái)實(shí)現(xiàn)
    的頭像 發(fā)表于 03-24 14:34 ?697次閱讀
    緩存與<b class='flag-5'>數(shù)據(jù)庫(kù)</b><b class='flag-5'>一致性</b>問(wèn)題如何解決

    什么是數(shù)據(jù)庫(kù)營(yíng)銷

    數(shù)據(jù)庫(kù)一致性(database consistency)由組值定義,數(shù)據(jù)庫(kù)系統(tǒng)中的所有數(shù)據(jù)點(diǎn)都必須與這些值保持
    的頭像 發(fā)表于 07-13 11:38 ?643次閱讀
    什么是<b class='flag-5'>數(shù)據(jù)庫(kù)</b>營(yíng)銷

    虹科干貨 | 什么是數(shù)據(jù)庫(kù)一致性?

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

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

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

    DDR一致性測(cè)試的操作步驟

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

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別

    深入理解數(shù)據(jù)備份的關(guān)鍵原則:應(yīng)用一致性與崩潰一致性的區(qū)別 在數(shù)字化時(shí)代,數(shù)據(jù)備份成為了企業(yè)信息安全的核心環(huán)節(jié)。但在備份過(guò)程中,兩個(gè)關(guān)鍵概念——應(yīng)用
    的頭像 發(fā)表于 03-11 11:29 ?1023次閱讀
    深入理解<b class='flag-5'>數(shù)據(jù)</b>備份的關(guān)鍵原則:應(yīng)用<b class='flag-5'>一致性</b>與崩潰<b class='flag-5'>一致性</b>的區(qū)別

    異構(gòu)計(jì)算下緩存一致性的重要

    在眾多回復(fù)中,李博杰同學(xué)的回答被認(rèn)為質(zhì)量最高。他首先將緩存一致性分為兩個(gè)主要場(chǎng)景:是主機(jī)內(nèi)CPU與設(shè)備間的一致性;二是跨主機(jī)的一致性。
    的頭像 發(fā)表于 10-24 17:00 ?782次閱讀
    <b class='flag-5'>異構(gòu)</b>計(jì)算下緩存<b class='flag-5'>一致性</b>的重要<b class='flag-5'>性</b>