USER>w $zv
IRIS for Windows (x86-64) 2024.3 (Build 217U) Thu Nov 14 2024 17:59:58 EST

USER>w $$GetEnvironment^%apiOBJ("collation","%Library.String",.collval),! zw collval
1
 
USER>w $$GetEnvironment^%apiOBJ("collation","dc.Username",.collval),! zw collval
1
 
USER>zn "%SYS"
 
%SYS>w $$GetEnvironment^%apiOBJ("collation","%Library.String",.collval),! zw collval
1
 
%SYS>w $$GetEnvironment^%apiOBJ("collation","%Library.Username",.collval),! zw collval
1

Strangely, I had no issues with the %Library.Username type. I didn't explicitly specify the collation anywhere: neither in the data type class nor for the Namespace-wide.

Namespace '%SYS':

Class %Library.Username Extends %String
{

Parameter MAXLEN As INTEGER = 160;

}

Namespace 'USER':

Class dc.Username Extends %String
{

Parameter MAXLEN As INTEGER = 160;

}

Class dc.a Extends %Persistent
{

Index is1 On s1;

Index is2 On s2;

Index is3 On s3;

Property s1 As %String;

Property s2 As %Username;

Property s3 As dc.Username;

ClassMethod Test()
{
  ..%KillExtent()
  
  s="joefu","JoeFu" {
    t=..%New()
    t.s1=s
    t.s2=s
    t.s3=s
    t.%Save()
  }

  zw ^dc.aD,^dc.aI
}

}
select FIELD_NAME,DATATYPE,COLLATION_FUNCTION,MAXLEN from %Library.SQLCatalog_SQLFields('dc.a')

FIELD_NAME DATATYPE COLLATION_FUNCTION MAXLEN
ID %Library.BigInt (null) (null)
s1 %Library.String SQLUPPER 50
s2 %Library.Username SQLUPPER 160
s3 dc.Username SQLUPPER 160
x__classname %Library.RawString (null) (null)
select INDEX_NAME,FIELDS from %Library.SQLCatalog_SQLIndices('dc.a')
INDEX_NAME FIELDS
is1 $$SQLUPPER({dc.a.s1})
is2 $$SQLUPPER({dc.a.s2})
is3 $$SQLUPPER({dc.a.s3})
USER>##class(dc.a).Test() ^dc.aD=2 ^dc.aD(1)=$lb("","joefu","joefu","joefu") ^dc.aD(2)=$lb("","JoeFu","JoeFu","JoeFu") ^dc.aI("is1"," JOEFU",1)="" ^dc.aI("is1"," JOEFU",2)="" ^dc.aI("is2"," JOEFU",1)="" ^dc.aI("is2"," JOEFU",2)="" ^dc.aI("is3"," JOEFU",1)="" ^dc.aI("is3"," JOEFU",2)=""