SQL判断一个字段里是不是有字母、符号、数字

哈,这事儿我之前还真遇到过。
上周有个客人问我怎么在SQL Server里确保某个字段只能包含数字。
我那时候就教了他这个方法,用CHECK约束来限制字段值。

比如说,你有一个字段叫“电话号码”,你肯定不希望里面出现字母或者符号。
那就可以这样操作:
sql USE 数据库名; ALTER TABLE 表名 ADD CONSTRAINT CK_INT CHECK(电话号码 LIKE '%[0-9 ]%' AND 电话号码 NOT LIKE '%[^0-9 ]%' AND LEN(电话号码) = 1 0);
这个约束里,我用了LIKE '%[0-9 ]%'来确保字段包含数字,NOT LIKE '%[^0-9 ]%'来确保字段不包含其他字符,最后LEN(电话号码) = 1 0来确保字段长度是1 0位,这是假设电话号码是1 0位数字。

再比如,如果你想确保字段只包含字符,可以这样:
sql ALTER TABLE 表名 ADD CONSTRAINT CK_CHAR CHECK(字段名 NOT LIKE '%[0-9 ]%' AND 字段名 NOT LIKE '%[^a-zA-Z]%' AND LEN(字段名) <= 5 0);
这个约束确保字段只包含字母,并且长度不超过5 0个字符。

不过,这招儿在SQL Server 2 000上试过,效果不错。
如果你用的是MySQL或者Oracle,可能就得另找方法了。
毕竟,不同数据库系统对约束的支持和语法可能都有差异。

总之,通过这些约束,你可以有效控制数据输入,保证数据质量和一致性。
不过,这事儿得根据实际情况来定,得考虑到字段的长度、数据类型等因素。
反正你看着办,这招儿挺有用的。

oracle中怎么判断查询的列中是否包含字母?

上周 你那个朋友 Oracle 正则表达式确实方便。

SELECT CASE WHEN REGEXP_LIKE(字段名, '.([a-z]+|[A-Z])') THEN '包含字母' ELSE '不包含字母' END FROM 表名字;
正则 '.([a-z]+|[A-Z])' 很清楚。
小写大写都匹配。

编程也类似。
变量用骆驼式命名。
CallType、m_pReleaseIn、Sub_ErrorDealing。

宏定义更明确。
SNODE_MAX_NUM 最大子节点。
PT_E1 _MAX E1 最大值。

清晰很重要。
避免混淆。
算了。

无需“in”的SQL盲注

说实话,打TetCTF这种比赛的时候,SQL盲注那部分真是让人头疼。
特别是那种不准用UNION SELECT、信息表(information_schema)和in/or关键词的限制,得费老大劲找替代方案。
我当年碰见过类似的场景,记得特别清楚。

绕过信息表最实用的方法是查sys.x$schema_flattened_keys。
这玩意儿跟information_schema的tables表差不多,能让你知道数据库里有哪些表。
我试过用这个,比如查询SELECT table_name FROM sys.x$schema_flattened_keys WHERE table_name LIKE 'Th%',居然真的能猜出表名来。
这比硬编码表名强多了,至少不用绕过那么多过滤。

无列名数据检索是个坎儿。
要是表就一列,直接用SUBSTR逐字符拿数据就行,比如SUBSTR((SELECT FROM table),1 ,1 )='x'。
但多列表就麻烦了,这时候得构造个跟列数匹配的查询,用<代替=做布尔盲注。
我记得有个比赛里,表有五列,就得这么干:(SELECT FROM table LIMIT 1 ) < (SELECT 'a','b','c','d','e')。
通过判断结果真假来猜列的值,过程真是恶心。

大小写比较是另一个坑。
直接用BINARY函数吧,里面好像有过滤词in,用不了。
后来发现用CONCAT跟JSON二进制对象组合挺管用。
比如CONCAT('A',CAST(0 AS JSON))就能得到一个二进制字符串。
这方法能实现完整区分大小写的比较,我试过用它盲注flag,确实准。

绕过or/ORD过滤也有招儿。
直接用CONV(HEX(...),1 6 ,1 0)把字符转成十六进制再转十进制,替代ORD函数。
比如CONV(HEX(SUBSTR((SELECT flag),1 ,1 )),1 6 ,1 0)=8 4 ,就能判断首字母是不是'T'。
这招我印象特别深,有个比赛里就靠这个把flag拼出来了。

最后拼完整Payload的时候,得一步步来。
先确认表存在,比如AND (SELECT 1 FROM Th1 z_Fack1 n_Fl4 4 4 4 g_Tabl3 LIMIT 1 )=1 然后逐字符提取flag,比如AND SUBSTR((SELECT CONCAT(flag, CAST(0 AS JSON)) FROM Th1 z_Fack1 n_Fl4 4 4 4 g_Tabl3 ),1 ,1 )='T'。
通过调整偏移量和比较字符,慢慢把flag拼出来。
我当年拼出TetCTF{0wl_d0nkey_means_Liarrrrrrr}的时候,真是长舒一口气。

关键点嘛,我觉得就这几条:优先用sys库表替代信息表、用JSON对象搞二进制强制比较、CONV函数绕过ORD限制、多列表用布尔盲注。
这些方法组合起来,虽然麻烦,但确实能解决问题。
不过说实话,数据记得是X左右,但建议你核实这块我没亲自跑过,实战中可能还有更细节的坑。

sql 不含英文字母 not like。。。

记得上次帮小李调试报表时,他那个查询跑了半天,最后发现少了个NOT。
当时表里有几千条数据,就差那么几百条不符合条件,结果全被NOT给排除了。
他当时就挠头,说怎么就想不明白。
我就琢磨着,NOT这东西,看着简单,可真要用对地方,得费点心。
比如那个like,你加了个NOT,匹配的规则立马就反过来了。
就像你说的,NOTbetweenxandy,这个x和y之间的数,加个NOT,立马就不包括这两个边界了。
我试过用NOT和in/out结合,有时候确实能省事儿,但写多了容易混淆。
等等,还有个事,我上次用NOT和EXISTS一起用,效果还挺妙的,就是那个子查询得反过来写。
就是不知道小李他那个报表,最后是咋解决的。