技术分享 | check(col_name<>‘‘)为何把空格拒之门外

CREATE TABLE实战指南:SQL schema设计与数据库建表规范 CREATE TABLE是关系型数据库中定义数据结构的基础操作,其本质是确立数据契约与业务规则的固化表达。理解SQL schema设计原理,需从数据类型选择、主键策略、索引规划、约束嵌入等核心维度展开——它们共同决定系统的可扩展性、查询性能与演进韧性。在高并发、多时区、强一致性要求的现代应用(如电商订单、金融交易、SaaS租户)中,一个未经审慎设计的建表语句可能引发慢查询、数据不一致甚至资损事故。本文聚焦真实工程场景,解析如何基于业务语义前置规划字段语义、约束边界与索引覆盖,并落地MySQL 8.0+下的高 阅读详情

1、问题描述

前两天在群里看到同事反馈一个空格问题,大致现象如下:

mysql> select @@version;
+-----------+
| @@version |
+-----------+
| 8.0.25    |
+-----------+
1 row in set (0.00 sec)

mysql> create table t1(
    -> c1 int,
    -> c2 varchar(4) check(c2<>'')  #单引号之间无空格
    -> )engine=innodb;
Query OK, 0 rows affected (0.21 sec)

mysql> insert into t1 select 1,'  ';  #c2字段插入两个空格
ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.

check定义c2<>'',往c2字段插入空格,提示违反check约束。

为什么insert语句中的' '(单引号之间有一个或多个空格)会被判断为''(单引号之间无空格),导致插入失败?

2、涉及知识

2.1、Stored and Retrieved

https://dev.mysql.com/doc/refman/8.0/en/char.html

When CHAR values are stored, they are right-padded with spaces to the specified length. When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH SQL mode is enabled.

VARCHAR values are not padded when they are stored. Trailing spaces are retained when values are stored and retrieved, in conformance with standard SQL.

CHAR(N):当插入的字符数小于N,它会在字符串的右边补充空格,直到总字符数达到N再进行存储;当查询返回数据时默认会将字符串尾部的空格去掉,除非SQL_MODE设置PAD_CHAR_TO_FULL_LENGTH(手册显示8.0.13 deprecated,8.0.25还能使用)。

VARCHAR(N):当插入的字符数小于N,它不会在字符串的右边补充空格,insert内容原封不动的进行存储;如果原本字符串右边有空格,在存储和查询返回时都会保留空格。

2.2、Collation Pad Attribute

https://dev.mysql.com/doc/refman/8.0/en/char.html

Values in CHAR, VARCHAR, and TEXT columns are sorted and compared according to the character set collation assigned to the column.

MySQL collations have a pad attribute of PAD SPACE, other than Unicode collations based on UCA 9.0.0 and higher, which have a pad attribute of NO PAD.

对于CHAR、VARCHAR、TEXT字段,排序和比较运算依赖字段上的Collation,Collation的Pad属性控制字符串尾部空格处理方式。 可以通过INFORMATION_SCHEMA.COLLATIONS表,查看Collation所使用的Pad属性:

mysql> select collation_name,pad_attribute from information_schema.collations;
+----------------------------+---------------+
| collation_name             | pad_attribute |
+----------------------------+---------------+
| armscii8_general_ci        | PAD SPACE     |
...
| utf8mb4_0900_bin           | NO PAD        |
+----------------------------+---------------+
272 rows in set (0.01 sec)

2.3、Trailing Space Handling in Comparisons

https://dev.mysql.com/doc/refman/8.0/en/charset-binary-collations.html#charset-binary-collations-trailing-space-comparisons

For nonbinary strings (CHAR, VARCHAR, and TEXT values), the string collation pad attribute determines treatment in comparisons of trailing spaces at the end of strings:

• For PAD SPACE collations, trailing spaces are insignificant in comparisons; strings are compared without regard to trailing spaces.

• NO PAD collations treat trailing spaces as significant in comparisons, like any other character.

"Comparison" in this context does not include the LIKE pattern-matching operator, for which trailing spaces are significant, regardless of collation.

PAD SPACE:在排序和比较运算中,忽略字符串尾部空格。 NO PAD:在排序和比较运算中,字符串尾部空格当成普通字符,不能忽略。

3、问题解决

以下操作基于MySQL 8.0.25 社区版

3.1、查看字段使用的Collation

mysql> show full fields in t1;
+-------+------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type       | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| c1    | int        | NULL               | YES  |     | NULL    |       | select,insert,update,references |         |
| c2    | varchar(4) | utf8mb4_unicode_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)

c2列的Collation是utf8mb4_unicode_ci。

3.2、查看Collation的Pad属性

mysql> select COLLATION_NAME,PAD_ATTRIBUTE from INFORMATION_SCHEMA.COLLATIONS where COLLATION_NAME in('utf8mb4_unicode_ci','utf8mb4_0900_ai_ci');
+--------------------+---------------+
| COLLATION_NAME     | PAD_ATTRIBUTE |
+--------------------+---------------+
| utf8mb4_0900_ai_ci | NO PAD        |
| utf8mb4_unicode_ci | PAD SPACE     |
+--------------------+---------------+
1 row in set (0.00 sec)

utf8mb4_unicode_ci的Pad属性是PAD SPACE,由2.3可知c2列在排序和比较运算中,忽略字符串尾部空格。

因此check比较时,会将插入的' '中的空格忽略,显然忽略空格后和check约束存在冲突,插入失败。

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.00 sec)

mysql> select '  ' = '';
+--------+
| ' '='' |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)

3.3、如何让check约束按常规逻辑生效

这里的常规是指空格就是空格,不应该把空格忽略。只需将c2字段修改为NO PAD的Collation后,就能将空格正常插入:

mysql> insert into t1 select 1,'  ';  #c2字段插入两个空格
ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.

mysql> alter table t1 modify c2 varchar(4) collate utf8mb4_0900_ai_ci;  #修改为NO PAD的Collation
Query OK, 0 rows affected (0.15 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into t1 select 1,'  ';  #c2字段插入两个空格
Query OK, 1 row affected (0.12 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t1 select 1,'';  #''之间无空格
ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.

mysql> select c1,c2,hex(c2) from t1;
+------+------+---------+
| c1   | c2   | hex(c2) |
+------+------+---------+
|    1 |      | 2020    |
+------+------+---------+
1 row in set (0.01 sec)

4、扩展

4.1、如果c2列是CHAR类型,和前面的问题表现一样吗

一样。CHAR、VARCHAR、TEXT在做排序和比较运算时,都是依据列的Collation的Pad属性处理字符串尾部的空格。此时拿来做比较运算的字符串是insert中的内容。

4.2、WHERE条件中表现形式是怎样的

创建一张新表并插入数据

mysql> create table t3(
    -> c1 int,
    -> c2 char(4) collate utf8mb4_unicode_ci,
    -> c3 char(4) collate utf8mb4_0900_ai_ci,
    -> c4 varchar(4) collate utf8mb4_unicode_ci,
    -> c5 varchar(4) collate utf8mb4_0900_ai_ci
    -> )engine=innodb;
Query OK, 0 rows affected (0.29 sec)

mysql> insert into t3 select 1,'a','a','a','a';
Query OK, 1 row affected (0.09 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t3 select 2,'a ','a ','a ','a ';  #各列包含1个空格
Query OK, 1 row affected (0.20 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t3 select 3,'a   ','a   ','a  ','a  ';  #前两列3个空格,后两列2个空格
Query OK, 1 row affected (0.17 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> insert into t3 select 4,'a  ','a  ','a   ','a   ';  #前两列2个空格,后两列3个空格
Query OK, 1 row affected (0.14 sec)
Records: 1  Duplicates: 0  Warnings: 0

观察WHERE条件返回结果,CHAR类型的返回受PAD_CHAR_TO_FULL_LENGTH影响(参考2.1)

mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c2='a';
+------+------+------+------+------+---------+---------+----------+----------+
| c1   | c2   | c3   | c4   | c5   | hex(c2) | hex(c3) | hex(c4)  | hex(c5)  |
+------+------+------+------+------+---------+---------+----------+----------+
|    1 | a    | a    | a    | a    | 61      | 61      | 61       | 61       |
|    2 | a    | a    | a    | a    | 61      | 61      | 6120     | 6120     |
|    3 | a    | a    | a    | a    | 61      | 61      | 612020   | 612020   |
|    4 | a    | a    | a    | a    | 61      | 61      | 61202020 | 61202020 |
+------+------+------+------+------+---------+---------+----------+----------+
4 rows in set (0.00 sec)

c2 char->返回数据去掉字符串尾部的空格

c2 utf8mb4_unicode_ci->PAD SPACE->排序和比较运算,忽略字符串尾部空格

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c3='a';
+------+------+------+------+------+---------+---------+----------+----------+
| c1   | c2   | c3   | c4   | c5   | hex(c2) | hex(c3) | hex(c4)  | hex(c5)  |
+------+------+------+------+------+---------+---------+----------+----------+
|    1 | a    | a    | a    | a    | 61      | 61      | 61       | 61       |
|    2 | a    | a    | a    | a    | 61      | 61      | 6120     | 6120     |
|    3 | a    | a    | a    | a    | 61      | 61      | 612020   | 612020   |
|    4 | a    | a    | a    | a    | 61      | 61      | 61202020 | 61202020 |
+------+------+------+------+------+---------+---------+----------+----------+
4 rows in set (0.01 sec)

c3 char->返回数据去掉字符串尾部的空格

c3 utf8mb4_0900_ai_ci->NO PAD->排序和比较运算,字符串尾部空格当成普通字符

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c4='a';
+------+------+------+------+------+---------+---------+----------+----------+
| c1   | c2   | c3   | c4   | c5   | hex(c2) | hex(c3) | hex(c4)  | hex(c5)  |
+------+------+------+------+------+---------+---------+----------+----------+
|    1 | a    | a    | a    | a    | 61      | 61      | 61       | 61       |
|    2 | a    | a    | a    | a    | 61      | 61      | 6120     | 6120     |
|    3 | a    | a    | a    | a    | 61      | 61      | 612020   | 612020   |
|    4 | a    | a    | a    | a    | 61      | 61      | 61202020 | 61202020 |
+------+------+------+------+------+---------+---------+----------+----------+
4 rows in set (0.00 sec)

c4 varchar->返回数据保留插入时的空格

c4 utf8mb4_unicode_ci->PAD SPACE->排序和比较运算,忽略字符串尾部空格

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c5='a';
+------+------+------+------+------+---------+---------+---------+---------+
| c1   | c2   | c3   | c4   | c5   | hex(c2) | hex(c3) | hex(c4) | hex(c5) |
+------+------+------+------+------+---------+---------+---------+---------+
|    1 | a    | a    | a    | a    | 61      | 61      | 61      | 61      |
+------+------+------+------+------+---------+---------+---------+---------+
1 row in set (0.00 sec)

c5 varchar->返回数据保留插入时的空格

c5 utf8mb4_0900_ai_ci->NO PAD->排序和比较运算,字符串尾部空格当成普通字符


mysql> set sql_mode='PAD_CHAR_TO_FULL_LENGTH';
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c2='a';
+------+------+------+------+------+----------+----------+----------+----------+
| c1   | c2   | c3   | c4   | c5   | hex(c2)  | hex(c3)  | hex(c4)  | hex(c5)  |
+------+------+------+------+------+----------+----------+----------+----------+
|    1 | a    | a    | a    | a    | 61202020 | 61202020 | 61       | 61       |
|    2 | a    | a    | a    | a    | 61202020 | 61202020 | 6120     | 6120     |
|    3 | a    | a    | a    | a    | 61202020 | 61202020 | 612020   | 612020   |
|    4 | a    | a    | a    | a    | 61202020 | 61202020 | 61202020 | 61202020 |
+------+------+------+------+------+----------+----------+----------+----------+
4 rows in set (0.00 sec)

c2 char->PAD_CHAR_TO_FULL_LENGTH->返回数据字符串右边补充空格

c2 utf8mb4_unicode_ci->PAD SPACE->排序和比较运算,忽略字符串尾部空格

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c3='a';
Empty set (0.00 sec)

c3 char->PAD_CHAR_TO_FULL_LENGTH->返回数据字符串右边补充空格

c3 utf8mb4_0900_ai_ci->NO PAD->排序和比较运算,字符串尾部空格当成普通字符

1~4行c3列返回值都包含空格,且c3列的Collation是NO PAD,字符串尾部空格不能忽略,where过滤找不到记录

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c4='a';
+------+------+------+------+------+----------+----------+----------+----------+
| c1   | c2   | c3   | c4   | c5   | hex(c2)  | hex(c3)  | hex(c4)  | hex(c5)  |
+------+------+------+------+------+----------+----------+----------+----------+
|    1 | a    | a    | a    | a    | 61202020 | 61202020 | 61       | 61       |
|    2 | a    | a    | a    | a    | 61202020 | 61202020 | 6120     | 6120     |
|    3 | a    | a    | a    | a    | 61202020 | 61202020 | 612020   | 612020   |
|    4 | a    | a    | a    | a    | 61202020 | 61202020 | 61202020 | 61202020 |
+------+------+------+------+------+----------+----------+----------+----------+
4 rows in set (0.00 sec)
c4 varchar->返回数据保留插入时的空格
c4 utf8mb4_unicode_ci->PAD SPACE->排序和比较运算,忽略字符串尾部空格

mysql> select *,hex(c2),hex(c3),hex(c4),hex(c5) from t3 where c5='a';
+------+------+------+------+------+----------+----------+---------+---------+
| c1   | c2   | c3   | c4   | c5   | hex(c2)  | hex(c3)  | hex(c4) | hex(c5) |
+------+------+------+------+------+----------+----------+---------+---------+
|    1 | a    | a    | a    | a    | 61202020 | 61202020 | 61      | 61      |
+------+------+------+------+------+----------+----------+---------+---------+
1 row in set (0.00 sec)

c5 varchar->返回数据保留插入时的空格

c5 utf8mb4_0900_ai_ci->NO PAD->排序和比较运算,字符串尾部空格当成普通字符

此时拿来做比较运算的字符串是Retrieved的内容,CHAR和VARCHAR返回数据时对字符串尾部的空格处理方式不同,并且PAD_CHAR_TO_FULL_LENGTH只影响CHAR类型。

4.3、对唯一索引的影响

https://dev.mysql.com/doc/refman/8.0/en/char.html

For those cases where trailing pad characters are stripped or comparisons ignore them, if a column has an index that requires unique values, inserting into the column values that differ only in number of trailing pad characters results in a duplicate-key error. For example, if a table contains 'a', an attempt to store 'a ' causes a duplicate-key error.

如果存在唯一索引(单列、字符类型),插入的数据仅在尾部空格个数不同,有可能会报duplicate-key错误:

mysql> select c1,c4,c5,hex(c4),hex(c5) from t3;
+------+------+------+----------+----------+
| c1   | c4   | c5   | hex(c4)  | hex(c5)  |
+------+------+------+----------+----------+
|    1 | a    | a    | 61       | 61       |
|    2 | a    | a    | 6120     | 6120     |
|    3 | a    | a    | 612020   | 612020   |
|    4 | a    | a    | 61202020 | 61202020 |
+------+------+------+----------+----------+
4 rows in set (0.00 sec)

mysql> alter table t3 add unique(c4);
ERROR 1062 (23000): Duplicate entry 'a' for key 't3.c4'

mysql> alter table t3 add unique(c5);
Query OK, 0 rows affected (0.44 sec)
Records: 0  Duplicates: 0  Warnings: 0

可以看到c4列创建唯一索引失败,c5列创建唯一索引成功。

c4 utf8mb4_unicode_ci->PAD SPACE->排序和比较运算,忽略字符串尾部空格,4行数据重复。

c5 utf8mb4_0900_ai_ci->NO PAD->排序和比较运算,字符串尾部空格当成普通字符,4行数据不同。

5、总结

Stored

-CHAR(N)VARCHAR(N)
Stored字符不足N右边补空格保留插入时的空格,不会在右边额外补充空格

Retrieved

SQL_MODECHAR(N)VARCHAR(N)
Default Value去掉字符串尾部的空格保留插入时的空格
PAD_CHAR_TO_FULL_LENGTH返回完整字符串,不足N右边补空格保留插入时的空格

Comparison(不包括like)

| Pad Attribute | CHAR(N)/VARCHAR(N) | | --- | --- |--- | | PAD SPACE | 忽略字符串尾部空格 | | NO PAD | 字符串尾部空格当成普通字符,不能忽略 |

Enjoy GreatSQL :)

文章推荐:

技术分享 | MGR最佳实践(MGR Best Practice) https://mp.weixin.qq.com/s/66u5K7a9u8GcE2KPn4kCaA

技术分享 | 万里数据库MGR Bug修复之路 https://mp.weixin.qq.com/s/IavpeP93haOKVBt7eO8luQ

Macos系统编译percona及部分函数在Macos系统上运算差异 https://mp.weixin.qq.com/s/jAbwicbRc1nQ0f2cIa_2nQ

技术分享 | 利用systemd管理MySQL单机多实例 https://mp.weixin.qq.com/s/iJjXwd0z1a6isUJtuAAHtQ

产品 | GreatSQL,打造更好的MGR生态 https://mp.weixin.qq.com/s/ByAjPOwHIwEPFtwC5jA28Q

产品 | GreatSQL MGR优化参考 https://mp.weixin.qq.com/s/5mL_ERRIjpdOuONian8_Ow

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

微信&QQ群:

可扫码添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群,亦可直接扫码加入GreatSQL/MGR交流QQ群。

file

本文由博客一文多发平台 OpenWrite 发布!

MySQL学习记录 MySQL学习记录 一、sql语言入门 我们都知道,数据库管理人员(DBA)通过数据库管理系统(DBMS)可以对数据库(DB)中的数据进行操作,但具体是如何操作的呢?这就涉及到我们本节要讲的SQL语言。 SQL(Structured Query Language)是结构化查询语言的简称,它是一种数据库查询和程序设计语言,同时也是目前使用最广泛的关系型数据库操作语言。在数据库管理系统中,使用SQL语言来实现数据的存取、查询、更新等功能。SQL是一种非过程化语言,只需提出“做什么”,而不需要指明“怎么做”。 S 阅读详情

相关推荐

CTFshow SQL注入实战:从联合查询到盲注与过滤绕过

SQL注入是一种通过将恶意SQL代码插入到应用输入参数中,从而操纵后端数据库查询的常见Web安全漏洞。其原理在于应用程序未对用户输入进行充分验证和过滤,使得攻击者能够修改原始查询逻辑。掌握SQL注入技术对于理解Web应用安全、进行渗透测试和CTF竞赛至关重要,尤其在需要从数据库提取敏感信息(如用户凭证、业务数据)的场景中。本文基于CTFshow平台的实战演练,详细拆解了从基础的联合查询注入到复杂的布尔盲注和报错注入的完整流程,并探讨了如何通过Python脚本实现自动化注入,以应对各种过滤机制,提升安全测试效

432

报错Check constraint “book_chk_1“ is violated。难道MySQL中insert 语句只能一条一条插入?

SqlServer代码在MySQL报错Check constraint "book_chk_1" is violated。难道MySQL中insert 语句只能一条一条插入?

LifeGamble的博客 8206

Python五子棋实战:从二维列表到AI对弈的完整项目指南

在编程学习中,数据结构是构建应用的基础,其中二维列表因其直观的网格表示能力,常被用于棋盘、地图等场景的建模。其原理是通过行索引和列索引快速定位元素,这为游戏状态管理提供了高效支持。掌握二维列表的运用,能显著提升解决实际问题的技术价值,尤其在游戏开发、矩阵运算等领域应用广泛。本文以五子棋项目为例,详细展示了如何利用二维列表构建棋盘模型,并结合方向向量算法实现胜负判断,同时融入简易AI的随机落子与获胜点搜索策略,为Python初学者提供了一个从语法练习到项目实战的完整路径。

weixin_33851604的博客 368

Check constraint ‘Phone‘ is violated.

插入测试数据-员工信息表(Employe)中,报错检查约束'Phone'是否被违反,但是我看我的电话号码都是1开头,位数也是11位,网上找了一些例子,一直不能解决。中的把 like 改成REGEXP。将alter table Employe ADD CONSTRAINT Phone CHECK(Phone。

Lydia868的专栏 796

如果有人问你 SQL 约束,记得把这篇文章给他

介绍 SQL 标准中定义的完整性约束,包括非空约束、唯一约束、主键约束、外键约束、检查约束和默认值,以及主流数据库中的实现:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、SQLite。

Tony.Dong的专栏 4757

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

关于数据库报错Check constraint ‘XXXX_chk_n‘ is violated,控制变量找到问题。(alter table add +check())

最近在学习数据库。本人最近使用的是Mysql。之前已经建完了库和表,并且已经有数据。老师要求我们添加条件:男老师的基本工资必须超过2500元如何实现? 由于已经建了teacher表,我就想着使用 alter table teacher add check(性别="男" and 工资>2500 or 性别="女"); 这个语句来为表添加条件。但是我跑这行代码时候报了个错: 我一直不太理解,刚开始以为是自己语法用的不熟练导致语法错误。后面连查带问,似乎没啥问题。。后面上网去查这种错误的原因是

weixin_49866788的博客 2万+

【全网最全最详细】智能体提示词prompt教程

定义:提示词是用户输入给AI模型(如ChatGPT、MidJourney等)的指令或问题,用于引导模型生成特定类型的输出。它是用户与AI交互的核心媒介。作用:提示词的质量直接影响AI输出的准确性和相关性。好的提示词能明确任务边界、减少歧义,并激发模型的创造力。提示词就是“给AI下指令的说明书”——越清楚、越具体,AI干得越好!帮你更快、更准地拿到想要的结果,不用和AI“猜谜语”。

qq_38196449的博客 8220

2020.04.10 【ABAP随笔】- ABAP面试分享

ABAP面试分享

weixin_40672823的博客 1328

小米手机Magisk解锁与Root完整指南:从Bootloader到模块管理

Android系统Root权限获取是设备深度定制的核心技术之一,其核心原理在于通过修改系统启动流程获取超级用户权限。Systemless Root技术通过动态挂载修改,在不触碰系统分区的前提下实现功能注入,既保证了系统完整性,又能绕过完整性检测。这一技术为设备带来了极高的可定制性,用户可以通过模块化方式增强系统功能、修改UI界面或启用隐藏特性。在小米手机生态中,由于官方提供了完整的Bootloader解锁通道,结合Magisk的无系统修改Root方案,使得安全可控的深度定制成为可能。本文聚焦于Bootloa

weixin_29164185的博客 334

win11 labelme 汉化菜单

【代码】win11 labelme 汉化菜单。

一直记录 1169

程序员副业变现:6种技术变现路径与实战指南

技术变现是程序员将专业技能转化为经济价值的重要途径,其核心原理在于通过解决特定场景下的技术痛点来创造市场需求。从技术工具开发到知识付费,多样化的变现方式为开发者提供了丰富的选择。在工程实践中,关键在于识别真实需求并构建可复用的解决方案,比如开发实用的代码工具或提供专业的技术咨询服务。通过合理的技术选型和敏捷开发方法,开发者可以高效实现产品化落地。本文聚焦程序员副业变现,结合技术工具开发和内容创作等热词,深入探讨如何将技术能力转化为可持续的收入来源,为开发者提供实用的变现策略和实战经验。

weixin_30617695的博客 365

2万字大厂面经:小米嵌入式面试题及参考答案(持续更新)

BIOS (Basic Input/Output System) 是一种存储在ROM中的固件程序,它为计算机提供了最基础的硬件初始化和服务。BIOS主要存在于传统的x86架构计算机中。嵌入式系统的启动流程取决于具体的硬件平台和所采用的操作系统。复位阶段:当系统通电或复位时,CPU进入复位状态。硬件初始化:CPU和必要的硬件设备(如内存控制器)被初始化。加载引导加载程序:引导加载程序(如U-Boot)被加载到内存中。执行引导加载程序:引导加载程序开始执行,初始化更多的硬件设备,并检测存储介质。

大模型大数据攻城狮的专栏 2529

YimMenu 完整安装指南:GTA5 防护菜单编译注入与配置方法

按这份 YimMenu 安装教程走完一遍,你能独立完成克隆源码、编译出 YimMenu.dll、注入 GTA5 并呼出菜单,再按自己的玩法调整配置,并清楚哪些功能能开、哪些碰不得。YimMenu 是一个面向 GTA5 Online 的开源菜单,定位是防护优先:仓库内置 26 项崩溃防护钩子、210 条可调用命令,单人玩法和公开战局各取所需。 ## 📌 YimMenu 项目速览:它是做什么的、和

gitblog_00072的博客 923

[Dify] 如何构建一个带评分功能的 Dify AI 教练系统

本文介绍如何利用Dify开源平台构建具备自动评分功能的AI教练系统。系统通过Prompt设计AI教练角色,使用OpenAPI定义评分工具接口,结合工作流编排实现提问、回答收集、评分和反馈的全流程。文章详细讲解了从AI教练身份设定、多维度评分标准设计到前端可视化展示的实现方法,并提供了可扩展建议,适用于语言训练、面试模拟等多种场景。该系统展示了Dify平台在构建智能化评估应用方面的优势,实现零代码开发专业AI教练解决方案。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 333

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍

MATLAB与ROS联合仿真——订阅ROS消息类功能模块介绍 (1)输入参数:无 (2)输出参数:Xr和Yr是小车当前在世界坐标系下的坐标 (3)主要作用:作为ROS与MATLAB的通讯接口,从ROS中订阅小车当前的位置信息,并输出 (4)内部结构: (5)具体实现过程:通过ROS工具箱中的Subscribe模块从ROS中订阅话题/gazebo/link_statesa 通过Bus Selector模块选择ROS总线中的Pose

慕羽★的博客 2699

dbt Snapshot 实战指南:SCD Type 2 历史追踪与快照策略选型

SCD(缓慢变化维度)是数据仓库建模的核心概念,尤其在用户画像、客户生命周期分析等场景中,需精准捕获字段的历史变更。dbt Snapshot 作为声明式 SCD Type 2 实现机制,不依赖数据库触发器或 binlog,而是通过 SQL 驱动的两阶段比对(检测变更+生成 DML),自动管理 `dbt_valid_from`/`dbt_valid_to` 和 `current_flag` 等关键字段。其技术价值在于平衡业务系统写入效率与分析系统历史可追溯性,广泛应用于合规审计、指标归因、特征工程等工程实践。

cnracht8153的博客 392

OpenCV实例(二)手势识别

手势识别的范围很广泛,在不同场景下,有不同类型的手势需要识别,例如:● 识别手势所表示的数值。● 识别手势在特定游戏中的含义,如“石头、剪刀、布”等。● 识别手势在游戏中表示的动作,如前进、跳跃、后退等。● 识别特定手势的含义,如表示“OK”的手势、表示胜利的手势等。理论基础凸包和凸缺陷在图像处理中具有非常重要的意义,被广泛地用于图像识别等领域。逼近多边形是轮廓的高度近似,但是有时候,我们希望使用一个多边形的凸包来简化它。凸包和逼近多边形很像,只不过凸包是物体最外层的凸多边形。

小幽余生不加糖 9410

AI时代开发者生存指南:技术变革下的职业规划与实战策略

人工智能作为当今最具颠覆性的技术趋势,其核心原理是通过机器学习算法从数据中提取模式并做出智能决策。在工程实践中,AI技术的价值体现在自动化处理、效率提升和智能决策支持等方面,广泛应用于代码生成、数据分析、系统优化等场景。随着大语言模型和机器学习框架的成熟,开发者需要掌握AI集成、MLOps等关键技术。特别是在编程领域,AI助手能够显著提升开发效率,但同时也对开发者的技能栈提出了新要求。本文聚焦AI技术发展对就业市场的实际影响,探讨开发者如何通过实战项目和技术学习路径保持竞争力,涵盖从初级到高级不同阶段的发展

weixin_30421809的博客 435

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Abaqus交互式二次开发:提升CAE仿真效率的关键技术

CAE仿真中的参数化建模与自动化流程是提升工程效率的核心技术。通过Python脚本实现Abaqus二次开发,可以解决传统手动操作效率低下、易出错的问题。交互式开发技术不仅支持用户友好的GUI界面创建,还能实现动态模型更新和智能错误检查,特别适用于需要反复修改模型参数或批量处理相似工况的场景。在汽车、航空航天等领域,这类技术已广泛应用于参数化螺栓连接设计、复合材料铺层优化等典型工程问题,使设计效率提升5倍以上。掌握Abaqus交互式二次开发能力,已成为CAE工程师实现工作流程自动化的重要技能。

weixin_30915951的博客 317

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SQL Server约束设计实战:从数据质量防火墙到性能优化关键

SQL约束是关系型数据库保障数据完整性与一致性的核心机制,其本质是定义数据写入时必须遵循的强制规则。在SQL Server中,PRIMARY KEY、FOREIGN KEY、UNIQUE、CHECK和NOT NULL等约束不仅影响数据校验逻辑,更深度绑定物理存储(如聚集索引)、事务行为(如级联锁)、查询优化(如执行计划选择)及运维可观测性(如错误号2627/547)。合理设计约束能显著提升系统数据可信度与运行效率,避免线上出现重复主键、外键级联误删、NULL值唯一性陷阱等典型问题。本文聚焦SQL Serve

cucanqi9387的博客 455

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AI开发流程优化与工程实践:从数据准备到团队协作

机器学习与人工智能开发流程是现代软件工程的重要分支,其核心在于构建可重复、高质量的模型训练流水线。从数据质量控制开始,通过标准化检查确保训练数据的完整性,这是模型效果的基础保障。在工程实践中,Git工作流和代码审查机制能够有效提升团队协作效率,而CI/CD自动化部署则大幅缩短了从开发到上线的周期。技术债务管理作为长期项目维护的关键,需要通过定期评估和重构来保持代码健康度。这些工程实践最终服务于AI项目的实际应用,帮助团队建立从数据准备、模型训练到部署监控的完整技术体系,实现开发效率与产品质量的双重提升。

weixin_30471561的博客 395

没有备份、没有闪回,DELETE 数据怎么办?分享Oracle 数据恢复脚本(原理与演示)(仅做研究使用)

Oracle的数据存储于数据文件当中,而delete一个表后,被delete的数据不会立刻消失,在被复用之前仍会存储在数据文件上。此时只需要找到目标表数据存储的位置,并将底层数据读取出来并进行对应转换,就能得到真实的数据,再将这些数据插入到一张结构一致的新表上,数据就成功恢复了。

Leon-Ning Liu的博客 318

数据科学家工业级生存指南:从模型上线到技术债治理

数据科学已超越算法学习阶段,进入以稳定性、可维护性与业务协同为核心的工业实践期。其核心原理在于将模型生命周期嵌入真实产线约束——包括特征漂移检测、服务熔断机制、AB测试分流验证等工程化保障;技术价值体现在降低隐性成本(如解释成本、回滚耗时、跨团队协调开销),提升线上系统鲁棒性与决策可信度;典型应用场景覆盖大促实时推荐延迟治理、风控模型负样本污染诊断、跨部门‘黑箱’信任构建等高频痛点。本文聚焦数据科学家在模型上线后第7天、AB测试第三周、故障凌晨三点等具体时间切片中的关键动作,提供可验证的最小执行单元(MVU

weixin_30500473的博客 444

R语言数据导入实战:编码、类型推断与大文件处理全解析

数据导入是数据分析的基石环节,本质涉及字符编码识别、列类型推断、缺失值处理及内存管理等核心机制。在R中,不同函数(如read.csv、fread、readr::read_csv)底层原理差异显著:base函数依赖隐式规则,易引发中文乱码或下划线转义;data.table::fread凭借C实现与多线程解析,在性能与鲁棒性上优势突出;readr则通过可复现的col_types声明保障科研可重复性。技术价值在于规避自动转换陷阱、确保生产环境零人工干预,并支撑金融风控、用户行为分析等高可靠性场景。本文聚焦R生态下

weixin_30367169的博客 423

dbt Snapshot原理与实战:构建可追溯的数据变更历史

在数据工程中,缓慢变化维度(SCD)和业务记录的增量变更管理是核心挑战。dbt Snapshot作为一种声明式、SQL驱动的轻量级变更捕获机制,不依赖数据库日志或上游CDC能力,而是通过时间戳比对或字段校验策略,在数仓层自主构建带生效周期(dbt_valid_from/dbt_valid_to)的版本化历史表。其技术价值在于实现变更可追溯性与业务逻辑可解释性,支撑精准归因分析、合规审计及A/B测试基线管理。典型应用场景包括SaaS数据源集成、无binlog权限的MySQL/PostgreSQL同步、客户主数

转些好文章,促进分享。 367
下一篇: 在Ubuntu下编译安装GreatSQL
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值