[Azure][SQL]Azure SQL Database 的資料庫定序

雲端和地端的資料庫定序有不一樣嗎 ?

在之前處理資料庫定序的時候,有發表過一篇文章「中文字排序和過濾的問題處理」,那篇文章的點擊率居然是我所有文章中最高的幾篇之一,讓我有點錯愕。而剛好在最近,有朋友詢問一些關於 Azure SQL Database 的定序,因此就想說再把相關狀況做個說明。

首先,當我們在 SQL Server 上面建立資料庫的時候,這時候您在建立資料庫時所設定的定序,不只會影響到資料的排序和比對,甚至資料庫物件在建立的時候,也會受這樣的影響。因此如果您的資料庫建立的時候,是設定為區分大小寫,那麼您在建立資料表,設定欄位的時候,也是會區分大小寫。我想在這段說明,應該有用過 SQL Server 的人,都會很清楚這樣的一個狀況。但要是今天我們使用 Azure SQL Database 的時候,也是同樣的嗎 ?

以下是我在 Azure Portal 上面建立一個 Azure SQL Database,從下圖中我們可以看到,在建立的時候我們是可以指定一個我們希望的定序。這裡我設定為區分大小寫

透過 SSMS 查看我們建立的資料庫,看起來定序是按照我們所設定的

接下來我們建立一些範例資料

CREATE TABLE T1
(	F1	INT,
	F2	NVARCHAR(10)
)
GO

INSERT INTO T1(F1,F2) VALUES ( 1, 'A'),( 2, 'a'),( 3, 'B'),( 4, 'b')
GO

而結果看起來跟我們設定定序的結果相同


可是 ? 當我們把資料表名稱和欄位名稱 , 都改成為小寫的時候 , 居然都可以找到資料 ?

其實在 Azure SQL Database ,在定序上是比較特別的,如果您需要系統資料也要跟資料庫一樣的定序時,則需要特別加上「CATALOG_COLLATION」的設定,但這個設定並沒有在 Azure Portal 上可以選擇,您必須透過 PowerShell 或者是 T-SQL 的指令,在建立資料庫的時候給加入。

因此這個時候我重新建立一個 Azure SQL Database

CREATE DATABASE TEST_BIN2 COLLATE Chinese_Taiwan_Stroke_BIN2
(
  SERVICE_OBJECTIVE = 'Basic'
)
WITH CATALOG_COLLATION = DATABASE_DEFAULT  

接著重複剛才的範例建立範例資料在這個測試資料庫上,然後再重新測試一下,就會發生錯誤了

如果把指令改成跟原本建立時候相同的大小寫,則就可以正常執行了


目前這樣的特性,只有在 Azure SQL Database 上會有,因此如果在移植系統要上 Azure 的時候,建立資料庫的時候則需要注意一下。