1. 程式人生 > >SQL中varchar與Nvarchar區別(亂碼的出現)

SQL中varchar與Nvarchar區別(亂碼的出現)

   varchar在SQL Server中是採用單位元組來儲存資料的,nvarchar是使用Unico來儲存資料的.中文字元儲存到SQL Server中會儲存為兩個位元組(一般採用Unico編碼),英文字元儲存到資料庫中,如果欄位的型別為varchar,則只會佔用一個位元組,而如果欄位 的型別為nvarchar,則會佔用兩個位元組.
  正常情況下,我們使用varchar也可以儲存中文字元,但是如果遇到作業系統是英文操 作系統並且對中文字型的支援不全面時, 在SQL Server儲存中文字元為varchar就會出現亂碼(顯示為??).而且正常情況下,主機都會支援中文的環境,所以如果使用varchar來儲存數 據,在開發階段是發現不了的.多數情況下,在佈署的時候也不會有問題.

  但是!如果佈署的主機是英文作業系統,並且不支援中文環境,那問 題就出來了.所有的varchar欄位在儲存中文的時候都會變成亂碼(顯示為??).而且一般情況下你不會知道這是因為你採用了錯誤的資料型別來儲存所造 成的,你會試著去裝中文字型,試著去設定作業系統的語言環境...這些都不能解決問題,唯一能解決問題的是把資料庫欄位的型別個性為nvarchar(或 者nchar).對專案管理比較熟悉的朋友應該都知道,到佈署階段再來修改資料庫是一個很恐怖的事情.
  使用nvarchar的另一個非常好處就是在判斷字串的時候可以不需要考慮中英文兩種字元的差別.
  當然,使用nvarchar儲存英文字元會增大一倍的儲存空間.但是在儲存代價已經很低廉的情況下,優先考慮相容性會給你帶來更多好處的.

  所以在Design的時候應該儘量使用nvarchar來儲存資料.只有在你確保該欄位不會儲存中文的時候,才採用varchar來儲存.
1、CHAR。CHAR儲存定長資料很方便,CHAR欄位上的索引效率級高,比如定義char(10),那麼不論你儲存的資料是否達到了10個位元組,都要佔去10個位元組的空間。
     2、VARCHAR。儲存變長資料,但儲存效率沒有CHAR高。如果一個欄位可能的值是不固定長度的,我們只知道它不可能超過10個字元,把它定義為 VARCHAR(10)是最合算的。VARCHAR型別的實際長度是它的值的實際長度+1。為什麼“+1”呢?這一個位元組用於儲存實際使用了多大的長度。
從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際情況找到權衡點。

    3、TEXT。text儲存可變長度的非Unicode資料,最大長度為2^31-1(2,147,483,647)個字元。
     4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示儲存的是Unicode資料型別的字元。我們知道字元中,英文字元只需要一個位元組儲存就足夠了,但漢字眾多,需要兩個位元組儲存,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不相容的問題而產生的,它所有的字元都用兩個位元組表示,即英文字元也是用兩個位元組表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多儲存4000個字元,不論是英文還是漢字;而char、varchar最多能儲存8000個英文,4000個漢字。可以看出使用nchar、nvarchar資料型別時不用擔心輸入的字元是英文還是漢字,較為方便,但在儲存英文時數量上有些損失。
     所以一般來說,如果含有中文字元,用nchar/nvarchar,如果純英文和數字,用char/varchar

相關推薦

SQLvarcharNvarchar區別亂碼出現

   varchar在SQL Server中是採用單位元組來儲存資料的,nvarchar是使用Unico來儲存資料的.中文字元儲存到SQL Server中會儲存為兩個位元組(一般採用Unico編碼),英文字元儲存到資料庫中,如果欄位的型別為varchar,則只會佔用一個位元

SQL那些事兒十三--Oraclevarcharvarchar2區別

部落格統計 [removed]var cnzz_protocol = (("https:" == [removed].protocol) ? " https://" : " http://");[removed](unescape("[removed][removed]")

SQLvarcharnvarchar的基本介紹及其區別

SQL中varchar和nvarchar的基本介紹及其區別   varchar(n) 長度為 n 個位元組的可變長度且非 Unicode 的字元資料。n 必須是一個介於 1 和 8,000 之間的數值。儲存大小為輸入資料的位元組的實際長度,而不是 n 個位元組。 nvarchar(n)

mysqlvarchar和char區別思維導圖整理

var 但是 系統 mysql 由於 varchar .html nbsp 了解   由於mysql一直是我的弱項(其實各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char區別,所以整理一下,便於以後遺忘。      0.0圖片已經說明一切,但是系

MySQLvarcharchar區別

MySQL中varchar最大長度是多少? 一. varchar儲存規則: 4.0版本以下,varchar(20),指的是20位元組,如果存放UTF8漢字時,只能存6個(每個漢字3位元組)  5.0版本以上,varchar(20),指的是20字元,無論存放的是數字、字母還是UTF8

Android 人們口中的sdcard和android開發的sdcard的區別自理解

現在的android手機很多都不支援在手機上再插一張sdcard了,就是那種上面印著多少GB的小黑卡,我查了很多資料發現,手機自帶的記憶體(其中分為兩部分:系統所佔記憶體 + 手機除去系統所佔記憶體剩餘的記憶體,其中“手機除去系統所佔記憶體剩餘的記憶體”被安卓預設為:手機自帶

Pythonis和==的區別面試題

面試的時候,當問到 is 和 == 的區別時,有很多同學對這個問題不是很清楚,有的人理解但是表述不清楚,接下來我們通過本文對這個做一個深刻的理解。 我們來看一個例子: 我們可以從上面看出,有的is和==相同,而有的不同呢?我們先看看官方文件裡面怎麼解釋這兩者之間的區別: 官方文件中說 is

Spark SQLRDDs轉化為DataFrame詳細全面

除了呼叫SparkSesion.read().json/csv/orc/parqutjdbc 方法從各種外部結構化資料來源建立DataFrame物件外,Spark SQL還支援 將已有的RDD轉化為DataFrame物件,但是需要注意的是,並不是由任意型別物件組成的RDD均

sql兩種情況判斷if函式、多種情況判斷case .. when...)

原地址:https://segmentfault.com/a/1190000009676728 sum(if(actual_num>0, share_post,0)) 其中SUM的意思淺顯易懂,求和嘛。IF也十分清晰:判斷嘛。而且if的第一個引數很明顯就是條件,

T-SQL 的CROSS JOIN用法半翻譯

 突然發現個很吊的連結,我們來看看學習資料庫要做些什麼,膽小慎點:DBA工作內容!!!!今天來翻譯一篇關於T-SQL的文章,本文可供微軟認證70-461:QueryingMicrosoft SQL Server 2012的學習和練習之用。本文以翻譯為主,引出個人工作中的一些思

mongodbmysql區別超詳細

MySQL是關係型資料庫。   優勢:在不同的引擎上有不同 的儲存方式。查詢語句是使用傳統的sql語句,擁有較為成熟的體系,成熟度很高。開源資料庫的份額在不斷增加,mysql的份額頁在持續增長。   缺點:在海量資料處理的時候效率會顯著變慢。Mongodb是非關係型資料庫(n

面試被問之-----sql優化inexists的區別 Mysql in or exists not exists not in區別 網路整理 Sql語句IN和exists的區別及應用 [筆記] SQL效能優化 - 避免使用 IN 和 NOT IN

曾經一次去面試,被問及in與exists的區別,記得當時是這麼回答的:''in後面接子查詢或者(xx,xx,xx,,,),exists後面需要一個true或者false的結果",當然這麼說也不算錯,但別人想聽的是sql優化相關,肯定是效率的問題,只是那個時候確實不知道它們在sql優化上的區別,只知道用in會進

Sql Server varcharnvarchar區別

文章轉載地址 : https://www.cnblogs.com/yelaiju/archive/2010/05/29/1746826.html Unicode字符集就是為了解決字符集這種不相容的問題而產生的,它所有的字元都用兩個位元組表示,即英文字元也是用兩個位元組表

SSM框架的sql參數註入#和$的區別

沒有 result ddr 其他 防止 date_time ${} ext post 1 <select id="findUsersByUserName2" resultType="java.util.Map" parameterType="Params">

mysql Varchar char的區別

計算機 一個 個數 arc eat 每一個 set span 方式 一、字符與字節與編碼關系 ASCII碼中,一個英文字母(不分大小寫)占一個字節的空間,一個中文漢字占兩個字節的空間。一個二進制數字序列,在計算機中作為一個數字單元,一般為8位二進制數,換算為十進制。最小值0

SQL文摘:sql(joinonwhere區別)

原文地址:https://www.cnblogs.com/wlzhang/p/4532587.html left join :左連線,返回左表中所有的記錄以及右表中連線欄位相等的記錄。 right join :右連線,返回右表中所有的記錄以及左表中連線欄位相等的記錄。 inner join: 內連線

SQLwherehaving的區別

導讀 1.where和having的區別 2.聚合函式和group by 3.where 和having的執行順序 4.where不能使用聚合函式、having中可以使用聚合函式 1.where和having的區別 whe

關於JS事件捕獲,事件冒泡事件代理事件委託,及e.targete.currentcurrentTarget的區別

事件捕獲:        表示事件的觸發順序,當繫結事件方法的第三個引數值設定為true時,事件觸發的順序為捕獲。        當一個元素的事件被觸發的時候(如onclick事件),該事件會從document開

關於虛擬機器VMware 橋接模式nat模式的區別個人總結

一、橋接模式 1.本人通過網上的的查詢得到的答案是,橋接模式使用的是區域網模式,關聯的同時不會對主機網路產生很大的影響,但是我在配置的時候遇到的問題就是在不同的環境下,每次的ip地址都不一樣,導致每次都需要重新配置,橋接模式試用與在固定的網路下面使用,本人也通過配置靜態ip

機器學習資料訓練集,測試集劃分交叉驗證的聯絡區別含程式

因為一個模型僅僅重複了剛剛訓練過的樣本的標籤,這種情況下得分會很高,但是遇到沒有訓練過的樣本就無法預測了。這種情況叫做過擬合。為了避免過擬合,一個常見的做法就是在進行一個(有監督的)機器學習實驗時,保留