ホームページ データベース mysql チュートリアル sql中varchar(n),nvarchar(n) 长度性能及所占空间分析

sql中varchar(n),nvarchar(n) 长度性能及所占空间分析

Jun 07, 2016 pm 05:49 PM
varchar パフォーマンス

本文章详细的介绍了sql中varchar(n),nvarchar(n) 长度性能及所占空间一些问题,有需要的朋友可参考参考。

varchar(n),nvarchar(n) 中的n怎么解释:
  nvarchar(n)最多能存n个字符,不区分中英文。
  varchar(n)最多能存n个字节,一个中文是两个字节。

所占空间:

  nvarchar(n)一个字符会占两个字节空间。
  varchar(n)中文占两字节空间,英文占一个。

n的取值范围:
  nvarchar(n)   n的范围是:1与4000之间
  varchar(n)   n的范围是:1与8000之间

n的大小是否会影响性能:
  varchar及nvarchar里的长度 n 不会影响空间大小及性能。除非n是max并且内容大于4000或8000
  设置n更多的是业务需要,如限制身份证只能输入18位,再多就报错,或者防止恶意攻击撑爆硬盘。对空间及性能都没有影响

n设置多大比较好:
  既然对空间及性能都没有影响,那我们只要考虑业务需要就可以了,我分析过微软的数据库,大都设置为:256,也会看到64,128,512,max等,可能是便于记忆吧。


varchar(n),nvarchar(n)存储空间举例解释:
  包含 n 个字符的可变长度 Unicode 字符数据。字节的存储大小是所输入字符个数的两倍。 
  两字段分别有字段值:我和coffee 
  那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。 
  如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar。

varchar和nvarchar如何选择?

  varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unicode来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般采用Unicode编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段的类型为nvarchar,则会占用两个字节.

 代码如下 复制代码

----------------------------------------------------------------------------------
-- Subject     : nvarchar(n)及nvarchar(max)中的n及max是否会影响性能
-- Environment : Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)
--               Apr  2 2010 15:53:02
--               Copyright (c) Microsoft Corporation
--               Enterprise Evaluation Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
----------------------------------------------------------------------------------
--首先创建两个表,一个放nvarchar(4000),一个放nvarchar(max)

CREATE TABLE [dbo].[testnvarchar4000] (
id int IDENTITY (1, 1) ,
cnt nvarchar(4000)
)
GO
CREATE TABLE [dbo].[testnvarcharmax] (
id int IDENTITY (1, 1) ,
cnt nvarchar(max)
)

GO

--然后插入10万条数据,每个cnt里放4000个字符(nvarchar(n)里n的最大值),大约1.6G


BEGIN TRANSACTION
    DECLARE @i INT ;
    SET @i = 0 ;
    while @i     begin
        insert into [testnvarchar4000] values(LEFT(REPLICATE(cast(@i as nvarchar)+'我是柳永法',1000),4000))
        insert into [testnvarcharmax] values(LEFT(REPLICATE(cast(@i as nvarchar)+'我是柳永法',1000),4000))
        set @i=@i+1
    END
COMMIT


--清空缓存,或重启SQL服务,测试查询速度及lob读取情况(lob是大对象的意思)
--测试testnvarcharmax
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT  COUNT(*)
FROM    testnvarcharmax
WHERE   cnt LIKE '%柳永法%'

SET STATISTICS TIME OFF
SET STATISTICS IO OFF

--测试testnvarchar4000
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT  COUNT(*)
FROM    testnvarchar4000
WHERE   cnt LIKE '%柳永法%'

SET STATISTICS TIME OFF
SET STATISTICS IO OFF


--结果:
--(1 行受影响)
--表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8494 次,预读 99908 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
-- SQL Server 执行时间:
--   CPU 时间 = 1172 毫秒,占用时间 = 30461 毫秒。


--(1 行受影响)
--表 'testnvarchar4000'。扫描计数 3,逻辑读取 100000 次,物理读取 8523 次,预读 99916 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
-- SQL Server 执行时间:
--   CPU 时间 = 968 毫秒,占用时间 = 30038 毫秒。


--从结果可以看出,这两次读取时间基本相同,并且都没有lob读取,以上数据为多次测试结果。

 

--给testnvarcharmax前1000条字段长度+1,来测试是不是超过4000字就会使用lob读取
UPDATE testnvarcharmax SET cnt=cnt+'1' WHERE id

--结果:

--(1 行受影响)
--表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8292 次,预读 99696 次,lob 逻辑读取 900 次,lob 物理读取 83 次,lob 预读 0 次。
--
-- SQL Server 执行时间:
--   CPU 时间 = 1124 毫秒,占用时间 = 30318 毫秒。

--此结果显示使用了lob读取。但时间相差也不太大。


--字段值加倍,再测试:
UPDATE testnvarcharmax SET cnt=cnt+cnt WHERE id --结果:

--(1 行受影响)
--表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8164 次,预读 99521 次,lob 逻辑读取 1000 次,lob 物理读取 101 次,lob 预读 0 次。
--
-- SQL Server 执行时间:
--   CPU 时间 = 1094 毫秒,占用时间 = 31095 毫秒。

正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??).而且正常情况下,主机都会支持中文的环境,所以如果使用varchar来存储数据,在开发阶段是发现不了的.多数情况下,在布署的时候也不会有问题.
  但是!如果布署的主机是英文操作系统,并且不支持中文环境,那问题就出来了.所有的varchar字段在存储中文的时候都会变成乱码(显示为??).而且一般情况下你不会知道这是因为你采用了错误的数据类型来存储所造成的,你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决问题,唯一能解决问题的是把数据库字段的类型个性为nvarchar(或者nchar).对项目管理比较熟悉的朋友应该都知道,到布署阶段再来修改数据库是一个很恐怖的事情.

使用nvarchar的另一个非常好处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别.
  当然,使用nvarchar存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的.

所以在Design的时候应该尽量使用nvarchar来存储数据.只有在你确保该字段不会保存中文的时候,才采用varchar来存储


如果 varchar(300) 和 varchar(8000) 都存储相同的字符数,性能上是没有差别的,存储行为上也没有不同。因为它们都有相同的存储结构,两个字节的偏移,两个字节的列数(如果表中所有的列都是 varchar 类型)。区别只在于存储容量上。
大多数的性能比较都集中在 varchar 和 char,varchar 和 varchar(max) 上。还有,行外存储(SQL Server 2005 支持的)。

  varchar(max) (lob 类型)与 varchar 存储方式是不同的。
  当 LOB 数据足够小时,可以考虑将数据直接存储在数据行(行所在的数据页面)中,从而可以避免额外的读取 LOB 页面,提升访问 LOB 数据的效率(将 LOB 数据直接存储在数据页面的阈值由 text in row 选项设置)。
而当 LOB 数据大于此阈值,或者所在行的大小超过了 8060 字节(单行最大 SIZE),LOB 数据将会存储在 LOB 页面,而在数据页面中保留一个指向 LOB 页面的 16 字节的指针。其访问效率当然会将低。
另外还有,恶意用户可以利用这一点“撑爆”你的磁盘。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

vivox100sとx100の違い:性能比較と機能分析 vivox100sとx100の違い:性能比較と機能分析 Mar 23, 2024 pm 10:27 PM

vivox100s と x100 携帯電話はどちらも vivo の携帯電話製品ラインの代表的なモデルであり、それぞれ異なる時代における vivo のハイエンド技術レベルを代表するものであるため、2 つの携帯電話にはデザイン、性能、機能に一定の違いがあります。この記事では、消費者が自分に合った携帯電話をより適切に選択できるように、これら 2 つの携帯電話を性能比較と機能分析の観点から詳しく比較します。まずはvivox100sとx100の性能比較を見てみましょう。 vivox100s には最新の機能が搭載されています。

Windows 11 で非表示のパフォーマンス オーバーレイを表示する方法 Windows 11 で非表示のパフォーマンス オーバーレイを表示する方法 Mar 24, 2024 am 09:40 AM

このチュートリアルでは、Windows 11 の隠れたパフォーマンス オーバーレイを明らかにするのに役立ちます。 Windows 11 のパフォーマンス オーバーレイ機能を使用すると、システム リソースをリアルタイムで監視できます。コンピューター画面上でリアルタイムの CPU 使用率、ディスク使用率、GPU 使用率、RAM 使用率などを表示できます。これは、ゲームをプレイしているときや大規模なグラフィック プログラム (ビデオ エディターなど) を使用しているときに、特定のプログラムの使用時にシステム パフォーマンスがどの程度影響を受けるかを確認する必要がある場合に便利です。システム パフォーマンスを監視するための優れた無料ソフトウェアがいくつかあり、リソース モニターなどの組み込みツールを使用してシステム パフォーマンスをチェックできますが、パフォーマンス オーバーレイ機能にも利点があります。たとえば、現在使用しているプログラムやアプリを終了する必要はありません。

Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか? Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか? Mar 28, 2024 am 09:00 AM

Windows 10 と Windows 11 のパフォーマンス比較: どちらが優れていますか?テクノロジーの継続的な開発と進歩により、オペレーティング システムは常に更新され、アップグレードされます。世界最大のオペレーティング システム開発者の 1 つとして、Microsoft の Windows シリーズ オペレーティング システムは常にユーザーから大きな注目を集めてきました。 2021 年、Microsoft は Windows 11 オペレーティング システムをリリースし、広範な議論と注目を引き起こしました。では、Windows 10 と Windows 11 のパフォーマンスの違いは何でしょうか?

PHP 言語と Go 言語の比較: 大きなパフォーマンスの違い PHP 言語と Go 言語の比較: 大きなパフォーマンスの違い Mar 26, 2024 am 10:48 AM

PHP と Go は一般的に使用される 2 つのプログラミング言語であり、それぞれに異なる特徴と利点があります。その中でも性能差は誰もが一般的に気にする問題です。この記事では、パフォーマンスの観点から PHP 言語と Go 言語を比較し、具体的なコード例を通じてパフォーマンスの違いを示します。まずは、PHPとGo言語の基本的な機能を簡単に紹介します。 PHP は、もともと Web 開発用に設計されたスクリプト言語で、学習と使用が簡単で、Web 開発の分野で広く使用されています。 Go 言語は、Google によって開発されたコンパイル言語です。

Win11 と Win10 システムのパフォーマンスを比較すると、どちらの方が優れていますか? Win11 と Win10 システムのパフォーマンスを比較すると、どちらの方が優れていますか? Mar 27, 2024 pm 05:09 PM

Windows オペレーティング システムは、常にパーソナル コンピューターで最も広く使用されているオペレーティング システムの 1 つであり、最近 Microsoft が新しい Windows 11 システムを発売するまで、Windows 10 は長い間 Microsoft の主力オペレーティング システムでした。 Windows 11 システムのリリースに伴い、Windows 10 と Windows 11 システムのパフォーマンスの違いに関心が集まっていますが、どちらの方が優れているのでしょうか?まずはWを見てみましょう

Kirin 8000 プロセッサが Snapdragon シリーズと競合: 誰が王になれるでしょうか? Kirin 8000 プロセッサが Snapdragon シリーズと競合: 誰が王になれるでしょうか? Mar 25, 2024 am 09:03 AM

モバイルインターネットの時代において、スマートフォンは人々の日常生活に欠かせないものになりました。多くの場合、スマートフォンのパフォーマンスはユーザー エクスペリエンスの品質に直接影響します。スマートフォンの「頭脳」であるプロセッサーの性能は特に重要です。市場では、Qualcomm Snapdragon シリーズは常に強力なパフォーマンス、安定性、信頼性の代表格であり、最近では Huawei も独自の Kirin 8000 プロセッサを発売し、優れたパフォーマンスを備えていると言われています。一般ユーザーにとって、性能の良い携帯電話をいかに選ぶかは重要な課題となっている。今日はそうします

Embedding サービスのローカル実行パフォーマンスは OpenAI Text-Embedding-Ada-002 を上回っており、とても便利です。 Embedding サービスのローカル実行パフォーマンスは OpenAI Text-Embedding-Ada-002 を上回っており、とても便利です。 Apr 15, 2024 am 09:01 AM

Ollama は、Llama2、Mistral、Gemma などのオープンソース モデルをローカルで簡単に実行できるようにする非常に実用的なツールです。この記事では、Ollamaを使ってテキストをベクトル化する方法を紹介します。 Ollama をローカルにインストールしていない場合は、この記事を読んでください。この記事では、nomic-embed-text[2] モデルを使用します。これは、短いコンテキストおよび長いコンテキストのタスクにおいて OpenAI text-embedding-ada-002 および text-embedding-3-small よりも優れたパフォーマンスを発揮するテキスト エンコーダーです。 o が正常にインストールされたら、nomic-embed-text サービスを開始します。

PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 PHP 配列キー値の反転: さまざまな方法のパフォーマンス比較分析 May 03, 2024 pm 09:03 PM

PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

See all articles