[OutSystems]Text型のLengthが大きすぎるとDBでの長さが無制限に
ユニットテストに使う、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としました。
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系の型である気がします。妥当な説明は思いつかないのですが、なにかわかったら追記します。
Author And Source
この問題について([OutSystems]Text型のLengthが大きすぎるとDBでの長さが無制限に), 我々は、より多くの情報をここで見つけました https://qiita.com/jyunji_watanabe/items/8f07891725b04de75507著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .