時(shí)間:2024-02-09 10:40作者:下載吧人氣:21
本文主要討論P(yáng)ostgreSQL中大小寫不敏感存在的問題。
默認(rèn)情況下,PostgreSQL會(huì)將列名和表名全部轉(zhuǎn)換為小寫狀態(tài)。
圖1 Person與person
如圖1所示,我們創(chuàng)建表person,其中包含name列。然后插入一條記錄。執(zhí)行SELECT查詢時(shí),使用列名Name和表名Person而不是name和person,發(fā)現(xiàn)仍然可以正常獲取剛剛插入表person中的記錄。
圖2 創(chuàng)建表Person?
此時(shí)如果我們?cè)傧雱?chuàng)建表Person,會(huì)得到一個(gè)錯(cuò)誤,因?yàn)榇藭r(shí)PostgreSQL實(shí)際上把表名從Person轉(zhuǎn)換成了person。由于已經(jīng)存在表person,所以會(huì)報(bào)錯(cuò)。
通常情況下,這種大小寫不敏感是很方便的,但是當(dāng)我們想創(chuàng)建大小寫敏感的表名和列名(需要使用雙引號(hào))時(shí),會(huì)產(chǎn)生一些問題。
圖3 創(chuàng)建表Person
如圖3所示,我們成功創(chuàng)建了表Person,并插入了一條記錄,此條記錄和插入person中的不同以示區(qū)分。再次使用SELECT查詢,并且使用表名Person和列名Name,但是返回的結(jié)果卻是person中的記錄。這還是因?yàn)镻ostgreSQL將Person轉(zhuǎn)換成了person。所以想要正確查詢,需要使用“Person”和“Name”(如圖4所示)。
圖4 獲取表Person中的記錄
此時(shí)查看數(shù)據(jù)庫中的表(見圖5),可以發(fā)現(xiàn)Person和person這兩個(gè)表都在數(shù)據(jù)庫中。如果我們使用DROP TABLE Person,刪除的仍然是表person。
圖5 刪除操作
綜上所述,當(dāng)創(chuàng)建表或者寫SQL查詢語句時(shí),建議避免使用雙引號(hào)。
補(bǔ)充:PostgreSQL大小寫不敏感排序
pg12開始支持不區(qū)分大小寫,或者區(qū)分大小寫的排序的collate。
語法:
CREATE COLLATION [ IF NOT EXISTS ] name (
[ LOCALE = locale, ]
[ LC_COLLATE = lc_collate, ]
[ LC_CTYPE = lc_ctype, ]
[ PROVIDER = provider, ]
[ DETERMINISTIC = boolean, ]
[ VERSION = version ]
)
CREATE COLLATION [ IF NOT EXISTS ] name FROM existing_collation
網(wǎng)友評(píng)論