MySQL 中 不等于 会过滤掉 Null 的问题

  在写SQL 条件语句时经常用到 不等于 != 的筛选条件。
  此时要注意此条件会将字段为 Null 的数据也当做满足不等于的条件而将数据筛选掉。

#####例:表A

A1B1
10
21
3Null

执行如下查询:

SELECT * FROM A WHERE B1 != 1

得到的结果如下:

A1B1
10

第三列 B1为空的也是会筛选掉的。

要查出第三列只需将SQL 改为如下语句 即可。

SELECT * FROM A WHERE B1 != 1 OR B1 is Null

上面这种方法最通俗,网上也最多,但是我总是感觉效率太低。

目前我使用的方法是:

SELECT * FROM A WHERE IFNULL(B1,'')  != 1

开发中遇到的问题,在此做下记录,谨防下次入坑。
如果有问题,欢迎指出。

<think>好的,我现在需要解决用户的问题:如何从MySQL数据中筛选出只包含中文的数据。首先,我得理解用户的需求。用户可能有一个包含各种文本数据的表,想要过滤非中文的数据,只保留那些字段完全由中文字符组成的数据行。 接下来,我需要回忆一下MySQL中处理这类问题的方法。通常,处理字符串匹配可以使用正则表达式,MySQL的REGEXP运算符可以派上用场。中文的Unicode范围是怎样的呢?记得中文字符的Unicode范围主要在\u4E00到\u9FFF之间,所以正则表达式应该匹配这个范围。 然后,我需要验证这个思路是否正确。例如,使用REGEXP '^[\u4E00-\u9FFF]+$'是否能够正确匹配仅包含中文的字符串。这里需要注意,MySQL中的正则表达式语法是否支持这种写法。可能需要使用双反斜杠来转义Unicode字符,或者使用特定的语法结构。 另外,还要考虑字段中可能包含空格、标点符号或者其他字符的情况。如果用户希望字段中只包含中文,没有数字、字母或其他符号,那么正则表达式必须严格限定在中文范围内。如果有允许的空格或标点,可能需要调整正则表达式。 还有可能遇到的情况是,某些中文字符可能在这个范围内,比如扩展区的汉字,这时候正则表达式可能需要扩展。但通常基本的中文字符都在4E00到9FFF之间,所以对于大多数情况应该是足够的。 然后,我需要参考用户提供的引用内容,看看是否有相关的例子。用户提供的引用主要是关于删除重复数据,保留一条记录,但其中涉及到使用GROUP BY和HAVING子句,以及子查询的方法。虽然问题同,但可能在构造查询语句时有借鉴之处,比如子查询的使用或者条件筛选的方法。 接下来,构造具体的SQL语句。假设用户有一个表叫my_table,字段是content,类型是VARCHAR。那么基本的查询语句应该是: SELECT * FROM my_table WHERE content REGEXP '^[\\u4E00-\\u9FFF]+$'; 这里需要注意,在MySQL中,正则表达式的Unicode编码可能需要使用双反斜杠转义,或者使用十六进制表示。另外,正则表达式的开头^和结尾$确保整个字符串从头到尾都是中文字符,没有其他字符混杂。 还需要测试这个查询是否正确。例如,如果content字段中有“中文abc”,这个正则表达式应该匹配,而“中文”应该匹配。同时,检查是否有例外情况,比如全角符号或者中文字符的变体。 另外,考虑到MySQL版本的同,某些版本可能对正则表达式的支持有差异。比如,是否支持Unicode属性或者特定的字符类。如果遇到问题,可能需要使用其他方法,比如使用CHAR_LENGTH和LENGTH函数来判断是否包含多字节字符,但这种方法可能够准确。 还有一种情况是,字段可能包含NULL值,这时候需要确保WHERE条件排除NULL,或者在查询中添加content IS NOT NULL的条件,避免错误。 总结步骤: 1. 确定字段和表名。 2. 使用REGEXP匹配仅包含中文字符的字符串。 3. 确保正则表达式正确,包括Unicode范围。 4. 处理可能的边缘情况,如NULL值或特殊字符。 5. 测试查询语句,验证结果是否符合预期。 如果用户的需求是包含中文字符,但也可以有其他字符,那么正则表达式需要调整,比如改成包含至少一个中文字符,可以使用REGEXP '[\\u4E00-\\u9FFF]',而限定整个字符串。但根据用户的问题描述,“只保留含中文数据”,可能指的是字段值完全由中文组成,因此使用严格的正则表达式更合适。 最后,给出示例代码,并提醒用户根据实际情况调整表名和字段名,以及可能的MySQL版本差异。</think>### MySQL过滤只保留含中文数据的方法 要筛选出仅包含中文的数据,可以通过正则表达式匹配中文字符的Unicode范围实现。中文字符的Unicode编码范围为`\u4E00-\u9FFF`,在MySQL中需使用双反斜杠转义。 #### 步骤说明 1. **基础筛选语句** 使用`REGEXP`运算符匹配完全由中文字符组成的字段: ```sql SELECT * FROM 表名 WHERE 字段名 REGEXP '^[\\u4E00-\\u9FFF]+$'; ``` 此正则表达式`^[...]+$`确保字段值从头到尾**仅包含中文**。 2. **允许混合字符的筛选** 若需保留**包含中文但限于中文**的数据(如允许中英文混合),移除首尾限定符: ```sql SELECT * FROM 表名 WHERE 字段名 REGEXP '[\\u4E00-\\u9FFF]'; ``` 3. **排除空值** 添加`字段名 IS NOT NULL`条件避免空值干扰: ```sql SELECT * FROM 表名 WHERE 字段名 REGEXP '^[\\u4E00-\\u9FFF]+$' AND 字段名 IS NOT NULL; ``` #### 示例 假设表名为`documents`,字段为`content`: ```sql -- 仅保留纯中文内容 SELECT * FROM documents WHERE content REGEXP '^[\\u4E00-\\u9FFF]+$'; -- 保留包含中文的混合内容 SELECT * FROM documents WHERE content REGEXP '[\\u4E00-\\u9FFF]'; ``` #### 注意事项 - **字符范围覆盖**:Unicode的`4E00-9FFF`覆盖了大部分常用汉字,但扩展区字符(如部分生僻字)可能需要扩展范围。 - **MySQL版本兼容性**:同版本对正则表达式的支持可能存在差异,建议测试验证。 - **性能优化**:若数据量较大,可对目标字段添加索引(需根据存储引擎支持情况)。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Siona_xin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值