NULL 有类型吗?

Jac*_*las 14 null datatypes

各种来源(例如WikipediaPSOUG)声明 Oraclenull没有类型。这是真的?

其他 RDBMS 呢?

Jac*_*las 8

甲骨文:

null文字不具有类型,但

  1. null 可以转换为任何类型,这在以下情况下可能是必要的

    • 调用重载的过程或函数
    • 控制decode函数的返回类型,例如:

      select decode('A','B',to_char(null),'A','1') from dual;
      DECODE('A','B',TO_CHAR(NULL),'A','1')
      -------------------------------------
      1
      
      select decode('A','B',to_number(null),'A','1') from dual;
      DECODE('A','B',TO_NUMBER(NULL),'A','1')
      --------------------------------------- 
                                            1
      
      Run Code Online (Sandbox Code Playgroud)
    • 控制集合运算符的列类型,例如union当第一个查询块包含null
  2. null存储在数据库中的值总是有一个类型:

    create table t(n integer, s varchar(10));
    insert into t values(null, null);
    
    select decode('A','B',n,'A','1') from t; 
    DECODE('A','B',N,'A','1')
    -------------------------
                            1
    
    select decode('A','B',s,'A','1') from t;
    DECODE('A','B',S,'A','1')
    -------------------------
    1
    
    Run Code Online (Sandbox Code Playgroud)

  • +1 出于好奇,让我们尝试从 DUAL 中选择 NULL what_type_is_this; 当然,这不是实际有用的例子,我还没有尝试过,我已经学会在这种情况下使用强制转换。 (2认同)

gbn*_*gbn 6

SQL Server,整数

SELECT NULL AS foo INTO dbo.bar
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'bar'
DROP TABLE dbo.bar
Run Code Online (Sandbox Code Playgroud)

MySQL,二进制(0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;
Run Code Online (Sandbox Code Playgroud)

  • 有趣的发现。但是,这表明这些数据库引擎在以这种方式创建表时默认为数据类型,而 NULL 在这些引擎中不一定具有类型。例如,[这个错误](http://blog.sqlauthority.com/2011/06/27/sql-server-puzzle-involving-null-resolve-error-operand-data-type-void-type-is- invalid-for-sum-operator/) 表明 SQL Server 确实将 NULL 视为无类型。 (4认同)
  • @Nick `select isnumeric(null)` = 0 ... 有趣 (2认同)

ber*_*d_k 5

Oracle 它在​​某种意义上是某种字符串类型。

这就是 ADO Reader 告诉我的。这是一个Powershell脚本:

[System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient") 
$ConnectionString = "Data Source=myTNS;User ID=myUSER;Password=myPassword" 
$conn=new-object System.Data.OracleClient.OracleConnection 
$conn.ConnectionString=$ConnectionString 
$conn.Open() 
$sql = "Select NULL xx from DUAL"
$cmd=new-object System.Data.OracleClient.OracleCommand($sql,$conn)

$r = $cmd.ExecuteReader()

$r.GetSchemaTable() | % { $_
}        
Run Code Online (Sandbox Code Playgroud)

那给

ColumnName               : XX
ColumnOrdinal            : 0
ColumnSize               : 0
NumericPrecision         : 0
NumericScale             : 0
DataType                 : System.String
ProviderType             : 22
IsLong                   : False
AllowDBNull              : True
IsAliased                : 
IsExpression             : 
IsKey                    : 
IsUnique                 : 
BaseSchemaName           : 
BaseTableName            : 
BaseColumnName           : 
ProviderSpecificDataType : System.Data.OracleClient.OracleString
Run Code Online (Sandbox Code Playgroud)

注意行

ProviderSpecificDataType : System.Data.OracleClient.OracleString