共用方式為


NLS 排序變更

受影響的平臺

用戶端 - Windows XP、Windows Vista、Windows 7
伺服器 - Windows Server 2003、Windows Server 2008、Windows Server 2008 R2

功能影響

嚴重性 - 高
頻率 - 低 (少數應用程式受到影響,但如果受到影響,一律會中斷)

描述

國家語言支援 (NLS) 函式可協助應用程式支援全球使用者的不同語言和地區設定特定需求。 新的 Windows 版本幾乎不一定包含 NLS 變更。 這項變更會影響定序和排序,因此具有持續性索引的應用程式。

定序資料表有兩個數字,可識別其版本 (修訂) :定義的版本和 NLS 版本。 這兩個版本都是 DWORD 值,由主要版本和次要版本所組成。 保留值的第一個位元組、接下來兩個位元組代表主要版本,最後一個位元組代表次要版本。 在十六進位詞彙中,模式為 0xRRMMMMmm,其中 R 等於 Reserved、M 等於 major,而 m 等於次要。 例如,次要版本為 4 的主要版本 3 會以0x304表示。

針對主要版本,一或多個程式碼點會變更,讓應用程式必須重新編制所有資料的索引,以便比較有效。 針對次要版本,不會移動任何動作,但會新增程式碼點。 針對這種類型的版本,應用程式只需要重新編制具有先前無法排序值的字串索引。 總而言之,版本號碼與地區設定特定例外狀況資料表和預設資料表中的資料變更有關的意義:

NLSVersion Major – 已變更 'exception' 或地區設定特定資料表中的代碼點
NLSVersion 次要 – 在 「例外狀況」或地區設定特定資料表中新增了新的代碼點
DefinedVersion Major – 已變更預設資料表中的字碼點
DefinedVersion Minor – 在預設資料表中新增了新的字碼點

排序已發行版本本的版本號碼:

作業系統 版本 版本 (0xRRMMMMmm)
Windows XP RTM/SP1/SP2/SP3/... N/A - 無 GetNLSVersion () API
Windows Server 2003 RTM/SP1 0x00 0000 01
Windows Vista RTM/SP1 0x00 0405 00
Windows Server 2008 RTM 0x00 0501 00 / 0x00 5001 00
Windows 7 RTM 0x00060100

 

表現

應用程式 (,例如具有未檢查 NLS 版本且在版本變更時重新編制索引的資料庫) ,將無法正確排序,或可能無法提供要求的結果。

在使用者介面的情況下,列出 (例如,字母、數位、英數位元、符號等) 可能會不正確排序。

解決方法

您的應用程式可以在 Windows Vista) 之前呼叫 GetNLSVersionEx (Windows Vista 或更新版本) 或 GetNLSVersion (,以擷取定序資料表的已定義版本和 NLS 版本。

  • GetNLSVersionEx:

擷取名稱所指定地區設定之目前版本的指定 NLS 功能相關資訊
此函式可讓 Active Directory 之類的應用程式判斷 NLS 變更是否會影響用於特定索引資料表的地區設定。 如果沒有,就不需要重新編制資料表的索引。 如需詳細資訊,請參閱處理地區設定和語言資訊。
此函式支援自訂地區設定。 如果 lpLocaleName 指定補充地區設定,所擷取的資料就是與該補充地區設定相關聯的定序順序的正確資料。

注意: Windows Vista 之前的 Windows 版本不支援 GetNLSVersionEx

  • GetNLSVersion (用於在 Windows Vista) 之前的 Windows 版本上執行的應用程式:

擷取識別碼所指定地區設定的目前 NLS 功能版本相關資訊
此函式可讓 Active Directory 之類的應用程式判斷 NLS 變更是否會影響特定索引資料表所使用的地區設定識別碼。 如果沒有,就不需要重新編制資料表的索引。 如需詳細資訊,請參閱處理地區設定和語言資訊。
注意: 此函式只會擷取識別碼所指定地區設定的相關資訊。 GetNLSVersionEx函式支援其他地區設定、功能和 RFC 4646 名稱。 不過,Windows Vista 之前的 Windows 版本不支援 GetNLSVersionEx
只要在 Windows Vista 和更新版本上執行的應用程式,應該使用 GetNLSVersionEx 作為此函式的喜好設定。 GetNLSVersionEx 提供補充地區設定的良好支援。

相容性測試

判斷定序版本是否已變更 (的步驟,您需要重新編制索引) :

  • 執行資料的原始索引時,請使用 GetNLSVersionEx () 來擷取NLSVERSIONINFOEX結構。

  • 使用索引儲存下列屬性來識別版本: NLSVERSIONINFOEX.dwNLSVersionNLSVERSIONINFOEX.dwDefinedVersion – 這兩個屬性一起指定您所使用的排序資料表版本。
    NLSVERSIONINFOEX.dwEffectiveId - 這會指定排序的有效地區設定。 自訂地區設定會指向內建地區設定的排序。

  • 使用索引時,請使用 GetNlsVersionEx () 來探索資料的版本。

  • 如果三個屬性有任何一項變更,您正在使用的排序資料可能會傳回不同的結果,而且您可能找不到記錄的任何索引編制。

  • 如果您知道您的資料不包含不正確 Unicode 字碼指標 (也就是說,所有字串都會從呼叫IsNLSDefinedString () ) 傳回TRUE,則只有在dwNLSVersiondwDefinedVersion的低位元組 (上述次要版本) ,您可能會將這些字串視為相同。