0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[OutSystems]Text型のLengthが大きすぎるとDBでの長さが無制限に

Posted at

ユニットテストに使う、BDDFrameworkではAssertを行う度に比較した値をEntity StepAssertに保存します。
保存対象列(ExpectedとObtained)のLengthが5000なのに、それより多い文字数のテキストを保存できたので理由を確認してみました。

環境

Personal Environment(Version 11.9.0 (Build 16900))
Service Studio(Version 11.8.8)
Data Extractor(Version 1.4.0)

テスト対象Entity

以下のように、Text型の属性を4つもたせます。
それぞれ、Lengthプロパティを2000、3999、4000、5000としました。
image.png

DDLでDB上での定義上の長さを確認する

Data ExtractorというForgeコンポーネントを使うと、指定したEntityのDDLを抜き出すことができます。本来はデータを取り出すのが目的ですが、今回はDDLの確認に流用しました。
Personal Environmentで確認しているため、DBツールで覗くわけには行かないため。

結果は以下の通り。Lengthが2000であるLONGATTRIBUTE2000の場合のみ、素直にNVARCHAR(2000)という定義で、それ以外はみんなNVARCHAR(MAX)となっています。

CREATE TABLE [DBO].[OSUSR_BTE_ENTITYWITHLONGATTRIBUTE]
(
	  [ID] BIGINT NOT NULL IDENTITY(1,1)
	, [LONGATTRIBUTE2000] NVARCHAR(2000) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
	, [LONGATTRIBUTE3999] NVARCHAR(MAX) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
	, [LONGATTRIBUTE4000] NVARCHAR(MAX) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
	, [LONGATTRIBUTE5000] NVARCHAR(MAX) COLLATE LATIN1_GENERAL_100_CI_AI_SC NULL
	, CONSTRAINT [OSPRK_OSUSR_BTE_ENTITYWITHLONGATTRIBUTE] PRIMARY KEY ([ID] ASC)
)

NVARCHAR(MAX)がどういう定義かというと、Microsoftのドキュメントによると

nchar および nvarchar (Transact-SQL)

max は、ストレージの最大サイズが 2^30-1 文字 (2 GB) であることを示します。

と非常に大きな値となることがわかります。
DB上では、このように非常に大きい定義であるため、Service Studio上の定義幅以上の値を格納できたわけですね。

OutSystemsの仕様

なんでこういう結果になるかというと、OutSystemのドキュメントに答えがありました。

データベースのデータ型:(Text型のSQL Serverにおける仕様として)

文字数が2,000文字以下の場合はnvarchar(<文字数>)、それ以外の場合はNVarchar(max)。

とあるので、Length=2001以上のText型はDB上でNVarchar(max)になるということのようです。
Personal EnvironmentなのでSQL Serverですが、Oracleでは、

文字数が2,000文字以下の場合はVARCHAR2(<文字数>)、それ以外の場合はCLOB。

とCLOB型が使われることになっています。

他のドキュメントとの齟齬?

パフォーマンスベストプラクティスという設計/実装で参考にすべきドキュメントでは、

2,000文字を超えるText型のアトリビュートがある場合、データベースではBinary Data型にマッピングされます。

とBinary系のデータ型にマッピングされるとされているのですが、NVarcharもCLOBもText系の型である気がします。妥当な説明は思いつかないのですが、なにかわかったら追記します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?