GVKun编程网logo

SELECT NULL,*,NULL,NULL中令人困惑的SQL错误(select(null<=>null)is null)

6

针对SELECTNULL,*,NULL,NULL中令人困惑的SQL错误和select(nullnull)isnull这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展ALTERTABLE,在n

针对SELECT NULL,*,NULL,NULL中令人困惑的SQL错误select(null<=>null)is null这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展ALTER TABLE,在null null列中设置null,PostgreSQL 9.1、C# null,string.Empty,"",DBNull 的区别、DELPHI的NULL函数,相当于MS SQL的ISNULL,ORACLE的NVL、failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8等相关知识,希望可以帮助到你。

本文目录一览:

SELECT NULL,*,NULL,NULL中令人困惑的SQL错误(select(null<=>null)is null)

SELECT NULL,*,NULL,NULL中令人困惑的SQL错误(select(null<=>null)is null)

背景
我试图解决第四个现实的任务在hackthissite.org,并无法弄清楚到底是什么SQL我应该注入到URL来检索电子邮件列表。浪费了几个小时后,我放弃了,看了一个解决方案,该解决方案给出了这段有趣的代码行,该行代码将在选择查询后注入:

UNION ALL SELECT NULL, *, NULL, NULL FROM email

我了解这样做的原因以及原因;黑客需要创建一个与合并的查询具有相同列数的查询,并在*周围移动以确保显示电子邮件。那不是我的问题。

问题
我的问题是为什么该代码在MySQL中引发语法错误。经过一些测试,我发现这显然是一个有效的查询:

SELECT *, NULL, NULL, NULL FROM email

就这样

SELECT NULL, text, NULL, NULL FROM email

但是由于某种原因,它不是:

SELECT NULL, *, NULL, NULL FROM email

并在“ ,NULL,NULL FROM email
from”附近引发语法错误。我不明白为什么会这样。似乎查询仅在
是请求的第一列时才有效,而与其他列无关。这是一个错误吗?它是MySQL独有的功能(并且任务使用了不同的SQL变体)吗?还是我完全误解了?

答案1

小编典典

这是记录的行为:

在选择列表中的其他项目上使用不合格可能会产生解析错误。为避免此问题,请使用合格的tbl_name。参考。

只需按照说明进行操作即可。这应该干净地解析:

 select NULL, email.*, NULL, NULL from email

ALTER TABLE,在null null列中设置null,PostgreSQL 9.1

ALTER TABLE,在null null列中设置null,PostgreSQL 9.1

我有一个表与非空列,如何设置一个null值在这一列作为默认值?

我的意思是,我想做这样的事情:

postgres=# ALTER TABLE person ALTER COLUMN phone SET NULL;

但它显示:

postgres=# ALTER TABLE person ALTER COLUMN phone SET NULL;
ERROR:  Syntax error at or near "NULL"
LINE 1: ALTER TABLE person ALTER COLUMN phone SET NULL;
ALTER TABLE person ALTER COLUMN phone DROP NOT NULL;

更多细节在手册:http://www.postgresql.org/docs/9.1/static/sql-altertable.html

C# null,string.Empty,

C# null,string.Empty,"",DBNull 的区别

【null】

null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值。 null 是引用类型变量的默认值。 普通值类型不能为 null。

null 在 VS 中定位不出来具体是怎么定义的。一般通过类名映射过来的关键字,都可以定位到声明位置。所以null是比较特殊的。

这个东西要跟踪源头还比较麻烦,感觉找不到具体定义。

MSDN上说明很简单:null 关键字是表示不引用任何对象的空引用的文字值。 null 是引用类型变量的默认值。 普通值类型不能为 null。

stock overflow 上有一段回答:

There are three things in C# that "null" can be. A reference, a pointer, and a nullable type.

The implementation of C# on the CLR represents a null reference by zero bits. (Where the number of bits is the appropriate size to be a managed pointer on the particular version of the CLR that you''re running.)

Unsurprisingly, a null pointer is represented the same way. You can demonstrate this in C# by making an unsafe block, making a null pointer to void, and then converting that to IntPtr, and then converting the IntPtr to int (or long, on 64 bit systems). Sure enough, you''ll get zero.

以下翻译(来自Google在线翻译):

C#中有三个“null”可以。 引用,指针和可空类型。

CLR上的C#实现表示零位的空引用。 (其中位数是适合您正在运行的CLR的特定版本上的托管指针的大小。)

不出所料,空指针以相同的方式表示。 您可以在C#中通过创建一个不安全的块,将空指针转换为void,然后将其转换为IntPtr,然后将IntPtr转换为int(或64位系统上的long)来证明这一点。 果然,你会得到零。

Stack Overflow 上的这个回答是基本从比较底层说明的。

那么咱们也从相对比较底层看下c/c++中null的定义。

来自 https://zh.cppreference.com/w/c/types/NULL 

C:

 

C++ 

 

【string.Empty】

这个是 string 类中的一个制度静态变量。也就肯定的说明了 string.Empty 是一个存在静态对象。这个就跟 null 区别开了。那到底具体是个什么呢?

string.Empty 其实就是 “”。

MSDN解释:

https://docs.microsoft.com/zh-cn/dotnet/api/system.string.empty?view=netframework-4.7.2

 

string.Empty 虽然跟 “” 是相等的,但是一般在给 string 初始化为空字符串的时候,一般建议用string.Empty,因为“”在赋值给string对象的时候,是你新创建了一个空字符串,而用Empty是将你的字符串对象指向了全局的只读的空字符串,这样相对来说性能能优化一些。

 

【“”】

 “” 代表一个空字符串。什么意思,首先是一个字符串对象,但是特殊的是,这个字符串没有内容,这可绝非 null。

 

个人经验简单形容下 null 和 “”。引用类型好比书目录,类对象好比书中内容。如果引用类型不为null,那么目录后面就有页码,如果为null,那么目录后面的页码就为0或者没有页码。那么没有页码,你说这个目录怎么找页数,也就是空引用了。 

 

【DBNull】

 咱先看MSDN注解:

DBNull类表示不存在的值。 例如,在数据库中,表的行中的列不可能包含任何数据。 也就是说,列被视为根本不存在,而不是只是不具有值。 一个DBNull对象都表示不存在的列。 此外,COM 互操作使用DBNull类,以区分 VT_NULL 变体,用于指示不存在的值和 VT_EMPTY 变体,用于指示未指定的值。

DBNull类型是一个单一实例类,这意味着只有一个DBNull对象存在。 DBNull.Value成员表示单独DBNull对象。 DBNull.Value 可用于显式将不存在的值分配到数据库字段中,尽管大多数的 ADO.NET 数据提供程序自动分配的值DBNull字段没有有效的值。 您可以确定从数据库字段中检索某个值是否DBNull通过将为该字段的值传递值DBNull.Value.Equals方法。 但是,某些语言和数据库对象提供一些方法,使其更轻松地确定数据库字段的值是否为DBNull.Value。 其中包括 Visual BasicIsDBNull函数,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,和IDataRecord.IsDBNull方法。

不要混淆这一概念null在面向对象的编程语言与DBNull对象。 在面向对象的编程语言中,null表示不存在的对象的引用。 DBNull 表示一个未初始化的变量或不存在的数据库列。

 

从上面注解可以看出,DBNull只要用在数据库和COM互操作中。而DBNull中有个Value字段,这个字段是一个静态只读字段,也就是全局唯一静态DBNull对象,不是null。

当我们在用ADO.NET操作数据库时,遇到数据库返回字段值为NULL时,就需要用DBNull来判断,而不能用null来判断。

看看MSDN对DBNull.Value的注解:

DBNull 是一个单一实例类,这意味着可以存在此类的此实例。

如果数据库字段有缺失数据,则可以使用DBNull.Value属性来显式分配DBNull对象的字段的值。 但是,大多数数据访问接口自动执行此操作。

若要评估的数据库字段,以确定它们的值是否DBNull,可以将传递到的字段值DBNull.Value.Equals方法。 但是,很少使用此方法,因为有多种其他方法来评估缺少数据的数据库字段。 其中包括 Visual BasicIsDBNull函数,Convert.IsDBNull方法,DataTableReader.IsDBNull方法,IDataRecord.IsDBNull方法和其他几种方法。

所以这下就明白了吧,这就是为什么我们用IDataReader读取数据库字段信息时,要用DBNull.Value来判断是否为空,然后在转换或者其他操作。

https://docs.microsoft.com/zh-cn/dotnet/api/system.dbnull.value?view=netframework-4.7.2

 

DELPHI的NULL函数,相当于MS SQL的ISNULL,ORACLE的NVL

DELPHI的NULL函数,相当于MS SQL的ISNULL,ORACLE的NVL

总结

以上是小编为你收集整理的DELPHI的NULL函数,相当于MS SQL的ISNULL,ORACLE的NVL全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

failed to parse: {

failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8

IDEA整合springboot与neo4j时出现这个问题

关于SELECT NULL,*,NULL,NULL中令人困惑的SQL错误select(null<=>null)is null的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于ALTER TABLE,在null null列中设置null,PostgreSQL 9.1、C# null,string.Empty,"",DBNull 的区别、DELPHI的NULL函数,相当于MS SQL的ISNULL,ORACLE的NVL、failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8等相关内容,可以在本站寻找。

本文标签: