2017-12-29 23 views

答えて

1

によれば:

select dump(user) from dual; 

それはタイプ1、which is varchar2あります。 (またはnvarchar2、その数だけに基づいています)。長さ(バイト数)はもちろん、のように異なります。 charです。

ドキュメントfor the user functionも書かれています:

この関数はVARCHAR2値を返します。

あなたはvarchar2(30)にユーザーをキャストすることができます。

select cast(user as varchar2(30)) from dual; 

が、それはその後まったく同じだダンプの方法。ユーザー名が30文字を超えていて初めて始めると違いが見えます。切り捨てられます。ただし、次のようにもなります。

この関数の値は、空白埋め比較セマンティクスと比較されます。

select * from dual where user = 'STACKOVERFLOW'; 
select * from dual where user = 'STACKOVERFLOW   '; 

空白埋め比較が、それはリテラルの長さにuserの結果をパディングだことを意味します。私のユーザー名は、たとえば、その後、STACKOVERFLOWこれらの戻りデータの両方である場合ということを意味

それはと比較されています。

あなたはそれが非空白埋め比較に戻りますと、もはや真である結果にキャストしたら:

select * from dual where cast(user as varchar2(30)) = 'STACKOVERFLOW'; 

は後列を取得しますが、これはそうではない:

select * from dual where cast(user as varchar2(30)) = 'STACKOVERFLOW  '; 

代替さを使用するsys_context()

select sys_context('USERENV', 'SESSION_USER') from dual; 

も返され、varchar2が返されます。これは

select * from dual where sys_context('USERENV', 'SESSION_USER') = 'STACKOVERFLOW' 

ので、再び、非空白埋め比較を使用するには、データを検索しますが、これはそうではない:

select * from dual where sys_context('USERENV', 'SESSION_USER') = 'STACKOVERFLOW  ' 

...または明示的なキャストなし。