1. sql語句什麼情況下使用N前綴
一開始就提到了與數據源無關的問題。當時只是從泛化的角度出發,利用ADO.net的DbProviderFactory根據不同的數據提供程序的名稱來實現一個與資料庫無關的數據訪問基類。但僅僅做到這一步還不能實現真正意義上的與數據源無關。 在程序的開發過程中,如果不考慮使用DbParameter的情況,絕大部分應用都可以用Transact-SQL來搞定,而不需要用到與具體數據源相關的特性。但是,現實總是比較殘酷的。DbParameter的應用也是如此廣泛,最容易想到的情況就是利用DbParameter來防止注入和用來處理一些不容易寫在SQL語句中的值。SQL語句中的參數名隨著數據提供程序的不同,也會不同,MS SQL Server用的是「@」,Oracle用的是「:」,到了OleDb基本清一色地改成了「?」。如果不解決這個問題,就沒法做到真正的與數據源無關。 如果用NHibernate,可以考慮HQL來解決此問題。HQL代替SQL再經過NHibernate的詞法分析器處理,轉換為SQL語句。如此一下,就不必考慮數據提供程序的參數前綴到底是啥了。可是本人始終不太喜歡NHibernate(從看到Hibernate時候開始),覺得配置文件太多了,而且體系又比較龐大,因此總尋思著怎麼幹些所謂的「重復造輪子」的事情。本人的想法很簡單,咱不發明新語言,只是簡單地針對那絕大部分的情況,將使用Transact-SQL的開發時,把語句中那些五花八門的參數名統一使用「@」,在執行的時候根據具體的數據提供程序進行替換。如此一來,既可以滿足與數據源無關的目標,又不需要費太多的力氣。 首先要考慮的問題是,如何獲取參數的前綴。可以用這個方式來獲取參數的前綴「DbConnection.GetSchema("DataSourceInformation").Rows[0]["ParameterMarkerFormat"]」。摘一段MSDN的說明:ParameterMarkerFormat表示如何格式化參數的格式化字元串。如果數據源不支持命名的參數,此字元串中的第一個佔位符應是格式化參數名的位置。例如,如果數據源期望使用『:』為前綴命名參數,此字元串將為「:{0}」。在使用參數名「p1」格式化此字元串時,生成的字元串為「:p1」。如果數據源期望參數以『@』為前綴,但是名稱中已包含該符號,此字元串將為『{0}』,格式化名為「@p1」的參數的結果將只是「@p1」。如果數據源不期望使用命名參數,而期望使用『?』字元,格式字元串可以只指定為『?』,這樣將忽略參數名。對於 OLE DB,將返回『?』。更詳細的信息可以參考MSDN中的「通用架構集合 (ADO.NET)」。按照之前的說法,有了參數前綴後,剩下的問題就是如何將SQL語句和DbParameter.ParameterName中的「@」替換掉。DbParameter.ParameterName比較簡單,直接String.Replace就OK,但是SQL語句中的情況比較復雜。「@」可能不僅僅出現在參數名中,也可能出現在字元里。簡單的Replace可能無法滿足要求。最初覺得比較好的做法有2種:正則表達式和詞法分析器。但後來考慮到,字元串中 「@」 出現的情況也相當難以預料且參數名比較特殊,為了支持一些特殊字元(比如:中文<總覺得有些人喜歡用>),再加上之前用Antlr2實現了一個基本的Select詞法分析器,所以就不考慮使用正則表達式,而是直接在之前的基礎上做了些簡化,生成了一個僅針對參數的詞法分析器。因為有Select語句詞法分析器的基礎,所以搞定參數的時候就簡單得多了。參數的規則可以定義為「@」+標識符,antlr2所需的主要規則2條:1、標識符:(('_' | 'a'..'z' | 'A'..'Z' | '\u2e81'..'\u2eca' |'\u3447'..'\u4dae' | '\u4e00'..'\u9fa5' | '\uf92c'..'\ufa29')+ ('0'..'9' | 'a'..'z' | 'A'..'Z' | '_' | '\u2e81'..'\u2eca' |'\u3447'..'\u4dae' | '\u4e00'..'\u9fa5' | '\uf92c'..'\ufa29')*) {$setType(Token.SKIP);}2、參數:('@' N_QUOTED_STRING)=>(('@' N_QUOTED_STRING) {_ttype=PARAMETER;}) | (('@' '@' N_QUOTED_STRING)=>('@' '@' N_QUOTED_STRING){_ttype=SYS_VAR;$setType(Token.SKIP);}) | (':' N_QUOTED_STRING)=>((':' N_QUOTED_STRING) {_ttype=PARAMETER;}) | '?'還必須注意的是,要替換的目標只是參數,所以沒有必要將其他如:保留字、字元串、數字、符號之類的東西取出來,通通加上「{$setType(Token.SKIP);}」跳過之。 利用詞法分析器對SQL語句進行解析,逐個替換掉原來SQL語句中的參數,最後得到的就是可以在目標數據源上執行的SQL語句。雖然有人會提出說,如果執行1000條SQL語句,那不是得執行1000此解析、替換,效率何存?但是,按照經驗來說,1次執行1000條SQL語句一般情況下只是參數的值不同,但SQL語句本身並不會有什麼差異;如果使用實體進行持久化,碰到這種情況的幾率更加減少。所以,本人認為,上述這種替換的做法還是可取的,特別是在某些情況下,一個應用程序運行在兩套不同的資料庫上時(連線時用伺服器數據Oracle,離線時暫時使用本地Access資料庫),這個做法就更能顯示出它的價值了。
2. sql語句加N什麼意思
重新編碼 因為可能有其他國家文字 這樣能保證正確輸出
3. 關於sql語句中的N
N的意思是將後面的字元轉換為nvarchar類型
不過你後面本來就是一個字元串。所以沒什麼體現
如果你N後面只是一個字元的話,就會有區別了
而且,像你這個做條件的也沒必要用N,只有查詢的時候,特別是用union把不同的查詢結果穿起來的時候,如果有一個sql段是單個字元,比如'a' as res ,然後另一個sql段查詢了表裡面的一個字元串 res。這個時候如果'a'前面不加一個N就會提示錯誤了。 你可以試試
4. sql server中,N''表示什麼意思
加上 N 代表存入資料庫時以 Unicode 格式存儲。
N'string' 表示string是個Unicode字元串
Unicode 字元串的格式與普通字元串相似,但它前面有一個 N 標識符(N 代表 SQL-92 標准中的國際語言 (National Language))。N 前綴必須是大寫字母。例如,'Michél' 是字元串常量而 N'Michél' 則是 Unicode 常量。Unicode 常量被解釋為 Unicode 數據,並且不使用代碼頁進行計算。Unicode 常量確實有排序規則,主要用於控制比較和區分大小寫。
Unicode字元串常量支持增強的排序規則。
(4)sql後面為什麼加n擴展閱讀:
Unicode是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。目前的Unicode字元分為17組編排,0x0000 至 0x10FFFF,每組稱為平面(Plane),而每平面擁有65536個碼位,共1114112個。然而目前只用了少數平面。UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。
通用字元集(Universal Character Set, UCS)是由ISO制定的ISO 10646(或稱ISO/IEC 10646)標准所定義的標准字元集。UCS-2用兩個位元組編碼,UCS-4用4個位元組編碼。
歷史上存在兩個獨立的嘗試創立單一字元集的組織,即國際標准化組織(ISO)和多語言軟體製造商組成的統一碼聯盟。前者開發的 ISO/IEC 10646 項目,後者開發的統一碼項目。因此最初制定了不同的標准。
5. SQL語句前的加一個N什麼意思
你說的是類似 xxx=N'......'這樣的內容吧。
這個N表示後續的字元串是Unicode類型的字元。
一些欄位如果是Unicode類型的欄位如NChar,NVarChar,NText,就需要通過這種寫法將字元串常量轉換後寫入。
比較常見的就是一些系統的存儲過程或函數它們是要求Unicode類型的參數,比如存儲過程的創建,可以使用sp_executesql,它接受的參數就要求是Unicode常量或變數。因此通過它添加存儲過程一般就需要這樣寫:
EXEC dbo.sp_executesql @statement = N'CREATE proc [dbo].[Analyse_Cost] (...
6. sql插入語句中的'N'什麼意思
sql插入語句中的'N'表示要插入緊跟其後面的是字元串型欄位值。
7. SQL中,輸入什麼類型的數據是加'N謝謝
Unicode編碼的意思,英文里是ASCII編碼,一個字母佔一個位元組,而中文就占兩個位元組。
加上 N 代表存入資料庫時以 Unicode 格式存儲。 N'string' 表示string是個Unicode字元串。
Unicode 字元串的格式與普通字元串相似,但它前面有一個 N 標識符(N 代表 SQL-92 標准中的國際語言 (National Language))。N 前綴必須是大寫字母。例如,'Michél' 是字元串常量而 N'Michél' 則是 Unicode 常量。Unicode 常量被解釋為 Unicode 數據,並且不使用代碼頁進行計算。Unicode 常量確實有排序規則,主要用於控制比較和區分大小寫。為 Unicode 常量指派當前資料庫的默認排序規則,除非使用 COLLATE 子句為其指定了排序規則。Unicode 數據中的每個字元都使用兩個位元組進行存儲,而字元數據中的每個字元則都使用一個位元組進行存儲。
Unicode 字元串常量支持增強的排序規則。
8. asp.net插入數據的時候為什麼在sql裡面寫入N
字元串之前加上N前綴是說明後面你要傳遞的字元串是Unicode 建議你上網查以下Unicode的資料。簡單的說就是為了更方便的處理拉丁(比如英文)和非拉丁(例如中文,日本)在程序中的兼容。