四大传统主流数据库:
Oracle MySQL SqlServer DB2
非关系型数据库: Redis MongoDB
主流数据库是关系型数据库:表与表之间是存在关联关系的
当我们说安装数据库的时候,指的是安装数据库服务
创建数据库的时候,指的是创建数据仓库
可以给数据仓库分成若干块,每一块就叫做一个表空间;
每个表空间都可以对应一个用户
初步使用数据库的时候,先创建一个用户,再给此用户指定一个表空间

如果不给用户提供创建表空间,就默认使用Oracle的默认表空间;为了安全期间,应该为每个用户都创建一个表空间
.DBF就是表空间文件的意思,表空间可以提高安全性。在表空间的用户只能访问存入当前表空间的内容
先创建表空间,创建用户让用户名与此表空间关联;
再建表,这样做的话,新建的表就会创建在刚才的表空间中;
最后再赋予登录,增删改权限即可

create tablespace 表空间名
datafile '存储的路径'
size 10M
autoextend on
next 10M
datafile 用于设置物理文件名称
size 用于设置表空间的初始大小
autoextend on 用于设置自动增长,如果存储量超过初始大小,则自动扩容
next 用于设置扩容的空间大小
注意必须先用语句执行,再手动删除磁盘空间,否则Oracle会崩溃
drop tablespace 表空间名称
--创建用户
create user 用户名
identified by 密码
default tablespace 表空间名称
--修改用户的表空间
alter user 用户名default tablespace 表空间名称
identified by 用于设置用户的密码
default tablespace 用于指定默认表空间名称
login denied 登录拒绝;就是缺失登录权限

grant connect to 用户名;
当建表时,显示没有操作权限

grant resource to 用户名
注意:同级别不能“互相伤害”,就是删除回收平级用户
--回收登录权限
revoke connect from 用户名;
--回收增删改权限
revoke resource from 用户名;
--给管理员权限
grant dba to 用户名;
--收回管理员权限
revoke dba from 用户名;
Oracle有几个默认用户
Sys,system,scott
Sys,system是管理员;Scott是普通用户
sys as sysdba //作为系统管理员身份登录
alter user 用户名 identified by 密码
:
--管理员执行:
alter user 用户名 account unlock;
删除用户时,如果有表则删除失败,因为安全起见;先删除所有表,再删除用户
--删除用户
drop user 用户名 cascade;
定义数据库对象语言,其语句包括动词create,drop等
--创建表空间
create tablespace 表空间名
datafile '存储的路径'
size 10M
autoextend on
next 10M
--创建用户
create user 用户名
identified by 密码
default table 表空间名称
default 向表中添加某个默认值
--创建表
create table 表名称(
字段名称 类型(长度),
字段名称 类型(长度)default ''
);
--利用现有的表创建新表,复制一个表
create table 新表名称 as select * from 旧表名称;
--只复制表的类型
--Where1=2的意思就是,不相等,复制表的时候就不复制表的信息,只复制表的类型
Create table 新表名 as select * from 旧表名 where 1=2;
--利用现有的表创建新表,复制的表中数据不重复
create table 新表名称 as select distinct * from 旧表名称;
主键:创建表的时候,每个表都要有主键,主键起到一个唯一识别的作用
约束的作用:约束用于规定表中的数据规则,如果存在违反约束的数据行为,行为会被约束终止
PK主键(Primary Key);UQ唯一(Unique )约束
CK检查(Check )约束;FK外键(Foreign Key)约束
--约束语法(可以直接在追加表后面)
alter table xx
add constraint 约束名 约束类型 具体约束说明
例如:
alter table product add constraint PK_PNO primary key (pno);
--添加年龄约束15~40
alter table stuInfo
add constraint checkAge check(stuAge>15 and stuAge<40);
--删除约束
alter table 表名
drop constraint 约束名
alter user 用户名 account unlock
--删除表
drop table 表名
包括insert插入,update更新,delete删除
也叫数据检索语句,用于从表中获取数据,确定数据怎样在应用程序给出。
关键字select是所有sql用的最多的动词;其他DQL常用关键字有where,order by,group by,having。这些关键字常与其他类型的SQL语句一起使用
--向表中插入数据
insert into 表名 values('xxx',to_date('2020-02-02','yyyy-mm-dd hh24:mi:ss'));
--如果插入的是部分数据
insert into 表名(字段名称,字段名称……) values('xxx','xxx');
select语句的作用是从数据库中返回信息;主要有以下作用
能够使用select语句的列选择功能选择表中的列,这些列是我们想要用查询返回的;当我们查询时,可以选择的查询表中指定的列
能够使用select语句的行选择功能选择表中的行,这些行是我们想要用查询返回的,能够使用不同的标准限制所看见的行
能够使用select语句的连接功能来集合数据,这些数据虽然被存储在不同的表中,但是我们可以通过连接查询到该数据
在最简单的形式中,select语句必须包含以下内容:
一个select子句,指定被显示的列
一个from子句,指定表,该表包含select子句中的字段列表
select是一个或多个字段的列表
* 选择所有的列
distinct 关键字表示禁止重复
column|expression 选择指定的字段或表达式
alias 给所选择的列不同的标题
from table 指定包含列的表
select *| {[distinct],column|expression [alias],....} from table;
select 确定哪些列
from 确定哪张表
from子句(哪张表)
where子句 (什么要求)
select子句 (怎么投影)
order by子句(怎么排序)
--查询表中所有信息
select * from 表名
--查看表结构
select * from user_tab_columns where table_name='departments'
--命令行窗口下查看表结构
--desc 表名

--查询指定的信息
select * from 表名 where 主键='xx';
--查询名称King或者pat的员工的工作编号
select job_id from employees where last_name='King' or first_name='Pat'
--指定数据进行 行和列 显示
select xx,xx from 表名
--显示筛选重复的行
select distinct xx,xx from 表名
--按照某个规则排序(年龄降序,学号升序)
select * from 表名 order by xxage DESC,xxno ASC;
--例如
--ascending 升序
select * from sc order by (要升序的字段名) asc;
--descending 降序
select * from sc order by 字段名 desc;
--默认显示是asc,可以为空
--列表别名,就是自定义个名称
--'S'|| 学生编号前面有个S
select 'S'||stuNO 学号,stuName"姓 名" FROM 表名
例如,别名显示后降序排序
--not in 范围 !=不等于具体的值
-- !=的效率比not in高,not in 会造成全盘扫描造成索引异常
--部门编号不等于10 !=
select * from emp where deptno!=10;
--not in
select * from emp where deptno not in('10','20');
--查询emp表2000-1-13入职的员工
select * from employees where hire_date=to_date('2000/1/13','YYYY-MM-DD')
--删除表中所有字段信息
delete from 表名
-- 删除表中的某个信息
delete from 表名 where 主键='xx'
--删除某个信息,多个信息可以and连接
delete from 表名 where xx=xx and xx=xx
--修改表中的某个信息
--一般都根据主键来修改数据
update 表名 set xx=xx,xx=xx where 主键=''
例如:
update 表名 set sname='james' where sid=2023;
它的语句能确保被DML语句影响的表的所有行得以及时更新
事务提交
设置回滚点
事务回滚
它的语句通过grant和revoke获取许可,确定单个用户和用户组对数据库对象的访问
grant connet to 用户名
--赋予增删改权限
grant resource to 用户名
--赋予管理员权限
grant dba to 用户名
--回收管理员权限
revoke dba from 用户名
--回收登录权限
revoke connect from 用户名
--回收增删改权限
revoke resource from 用户名

注:查询的emp表在scott用户里
--avg()平均值
---求所有人平均工资
select avg(sal) from emp;
--求20号部门的平均工资
select avg(sal) 平均工资 from emp where deptno=20;
--求20号部门的平均工资 和 部门编号
select deptno,avg(sal) 平均工资 from emp where deptno=20 group by deptno;
--按照部门编号进行分组,求每组的平均工资
select deptno,avg(sal) from emp group by deptno;
--min()最小值
--求本公司薪资最低的人的工资
select min(sal) from emp;
--求20号部门工资最低的人
select min(sal) from emp where deptno=20;
--求本公司每个部门的最低工资
select deptno,min(sal) from emp group by deptno;
--分组,就添加group by
--max()最大值
--求本公司薪资最高的人的工资
select max(sal)最高工资 from emp;
--求30号部门工资最高的人
select max(sal)部门最高工资 from emp where deptno=30;
--求本公司每个部门的高工资
select deptno,max(sal) from emp group by deptno;
--sun()求和
--求公司每月要发的总工资
select sum(sal)总工资 from emp;
--求每个月给30号部分发的总工资
select sum(sal) from emp where deptno=30;
--求本公司每个部门的总工资
select deptno 部门编号,sum(sal)总工资 from emp group by deptno;
--count()累加
--求公司总人数
select count(*) from emp;
--求20号部门的人数
select count(*) from emp where deptno=20;
--最好不要用count(*);*代表查找所有字段
select deptno,count(*) from emp group by deptno;
--求每个部门的总人数
select deptno,count(empno) from emp group by deptno;
--每个部门的。。。值,只要2000以上的
select deptno 部门编号,max(sal) 最大值,AVG(sal) 平均值,min(sal) 最小值
from emp
group by deptno
having avg(sal)>2000;
用于将信息划分为更小的组;每一组行返回针对该组的单个结果(分组,就添加group by)
--group by子句
SELECT deptno,MAX(sal) maxSal,
AVG(sal) avgSal,
MIN(sal) minSal
FROM emp
GROUP BY deptno;
一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;降序:DESC;默认为升序;order by 子句在select语句的最后)
在排序中也可以使用没有包括在select子句定义的列排序,就是没有做投影
当排列为空值时,升序排序显示在最后,降序排序显示在最前面
选择多个列属性进行排序,然后排序的顺序是,从左到右,依次排序。
如果前面列属性有些是一样的话,再按后面的列属性排序。(前提一定要满足前面的属性排序,因为在前面的优先级高)
--按照某个规则排序(年龄降序,学号升序)
select * from xxx order by xxage DECS,xxno ASC;
--男同学的年龄升序输出asc,降序desc
select sno 男同学编号,sage 男同学年龄 from student where ssex='男' order by sage desc
可以使用投影的列的序号指定排序列,但是不推荐
--对员工名称,薪资进行排序
--不建议使用列号排序,如果变动就失效了
select last_name,job_id,salary from employees order by 1 asc,3 desc
可以使用列的列表名指定排序列
--使用列别名进行排序
select last_name as name,job_id,salary from employees order by name asc
select last_name as name,job_id as id,salary from employees order by id desc
多列排序,可以用多列排序查询结果。在order by 子句中,多个指定的列名之间用逗号分开。如果想要对某个列倒序排序需则在该列名后面指定desc
--多列排序,注意逗号隔开
select last_name as name,job_id as id,salary from employees order by name asc,id asc
用于指定group by 子句检索行的条件
只有满足HAVING短语指定条件的组才输出。
HAVING短语与WHERE子句的区别:作用对象不同。
1》WHERE子句作用于基表或视图,从中选择满足条件的元组。
2》HAVING短语作用于组,从中选择满足条件的组。
理解:要用having的话,前面的语句必须要有having的字段,否则会报错;而where不用
因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。
--having子句
--条件可以用and追加
SELECT deptno,
MAX(sal) maxSal,
AVG(sal) avgSal,
MIN(sal) minSal
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000;
select *| {[distinct],column|expression [alias],....} from table [where condition(s)];
where 子句跟着from子句
where 限制查询满足条件的行
condition 由列名、表达式、常数、比较操作组成
选择限制的行
可以用where子句限制从查询返回的行。一个where子句包含一个必须满足的条件,where子句紧跟着from子句。如果条件是true,返回满足条件的行。
where子句能够比较列值、文字值、算术表达式或者函数,where子句由三个元素组成:

执行顺序: where -> group by -> select ... from ... -> order by..
SQL函数分为单行函数、聚合函数、分析函数
单行函数对于从表中查询的每一行只返回一个值;可以出现在select子句中和where子句中;
单行函数大致可以划分为:
转换函数将值从一种数据类型转换成另一种数据类型
常用的转换函数有:
--如下
SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日" HH24:MI:SS')
FROM dual;
SELECT TO_CHAR (123456.03,'099,999.99') FROM dual;
SELECT TO_DATE('2005-12-06' , 'yyyy-mm-dd')
FROM dual;
SELECT TO_NUMBER('100') FROM dual;
用算术表达式创建数字和日期数据的表达式(+ - * /)
注意:如果对日期进行计算,我们只能对date和timestamp数据类型使用加和减操作
运算符的优先级(* / + -)
--算数表达式练习
--计算employees表的员工年薪+100以后是多少
select employee_id,first_name,salary*12+100 from employees;
--然后进行对薪水进行降序排序
select employee_id 员工id,first_name 员工名称,salary*12+100 年薪 from employees order by salary desc;
--计算employees表的员工薪水+100以后的年薪是多少,升序排序
select employee_id,first_name,(salary+100)*12 from employees order by salary asc;
连字运算符:
我们能够用连字运算符进行列与列之间、列与算术表达式之间或者列与常数值之间的连接,来创建一个字符表达式,连字运算符两边的列被合并成一个单个的输出列
--连字运算符 ||
--连接e表中的员工名称
select first_name||last_name 员工名称 from employees;

文字字符串不是列名或者别名,对每个返回行打印一次。任意格式的文本文字字符串能够被包含在查询结果中,并且作为select列表中的列处理;日期和字符文字必须放在单引号中,数字不需要
--文字字符串,文字需要加'' 数值不需要
select first_name||' is a '||job_id as 员工职务 from employees;
select first_name||0744||job_id as 员工职务 from employees;

在select语句中用distinct关键字除去相同的行。
为了在结果中除去相同的行,在select子句中的select关键字后面紧跟distinct关键字
--去除e表中的department_id重复数据
select distinct department_id from employees order by department_id desc;
--注意 distinct 剔除的数据后面还有数据的话,这两个结果将构成一个条件来执行distinct关键字
select distinct department_id,first_name from employees order by department_id desc;
注意:两个结果将构成一个条件来执行distinct关键字,所以还会重复
用的很少;前端拿到的数据是string类型,保存在数据库的话要转换成 日期类型;
从数据库拿数据展示到页面,就需要把日期类型的数据转换成字符串;

| 运算 | 含义 |
| = | 等于 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| <> | 不等于(也可以使用!= 和 ^= 来表示) |
--查询薪水小于等于3000的员工
select first_name 员工名称,salary 薪水
from employees where salary<=3000 order by salary desc
| 操作 | 含义 |
| between...and... | 在两个值之间(包含) |
| is(set) | 匹配一个任意值列表 |
| like | 匹配一个字符模板 |
| is null | 是一个空值 |
between条件:可以用between范围条件显示基于一个值的范围的行。指定的范围包含一个上限和一个下限。between...and...实际上是由Oracle服务器转变为and条件:(a>=上限)and(a<=下限),所以使用between...and...并没有性能的提高,只是逻辑上简单
--between...and..下限,上限
--查询薪水2500~3000的员工
select first_name 员工名称,salary 薪水
from employees where salary between 2500 and 3500 order by salary desc
--between只是对条件进行简化处理,实际上还是会被解析成and....
select first_name 员工名称,salary 薪水
from employees where salary>=2500 and salary<=3500 order by salary asc
in条件:用in条件在指定的一组值中进行选择;in(...)实际上是由Oracle服务器转变为一组or条件:a=valuel OR a=value2 OR a=value3,所以使用in(...)并没有得到性能的提高,只是逻辑上简单
注意:in只能做相等的判断;多条件的值最终会被转换成or
--int(...)多个选择
--查询所有经理号为100,101,102的雇员的信息
select manager_id,last_name,salary from employees
where manager_id in (100,101,102,103)
--or用法
select manager_id,last_name,salary from employees
where manager_id=101 or manager_id=102 or manager_id=103
使用like条件执行有效搜索串值的通配符搜索
搜索条件既可以包含文字也可以包含数字:
like条件:我们也许不能总知道要搜索的确切的值,但能够选择那些用like条件匹配一个字符模板的行。字符模板匹配运算涉及通配符查询。有两个符号 %和 _ 可以用来构造搜索串
--like 查询名称带a的
--% 表示零个多个字符,-表示一个字符
select first_name from employees where first_name like '%a%';
--名称首字母是a的,注意对大小写敏感
select first_name from employees where first_name like 'C%';
--名称第二个字母是d
select first_name from employees where first_name like '_d%'
escape标识符:可以用escape标识符搜索实际的 % 和 _ 符号。使用escape选项,该选项指定换码符是什么。如果你想要搜索包含‘sa_’的字符串可以使用escape对\表示该符号为转义符号
like'%sa\_%'escape'\'; 意思就是把 '\' 定义成转移符号
--escape标识符,转义符号,任意符号都可以设置
--查询employee表的工作id包含sa_的员工姓名
--'_'符号是占位符号,不是文本的;所有就要设置新的转义字符
select first_name,job_id from employees where job_id like'SA\_%' escape'\'
null条件:null条件中包括 is null 条件和 is not null 条件。is null 条件用于空值测试。空值的意思是难以获得的、未指定的、未知的或者不适用的。因此,不能用=判断,因为null不能等于或不等于任何值。is not null 测试不是空值
--查询有佣金的员工
select last_name,job_id,commission_pct from employees
where commission_pct is not null
--查询没有佣金的员工
select last_name,job_id,commission_pct from employees
where commission_pct is null
| 运算 | 含义 |
| and | 如果两个组成部分的条件都为真,则返回true |
| or | 如果两个组成部分中的任何一个条件为真,则返回true |
| not | 如果跟随的条件为假,则返回true |
逻辑条件:逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆转一个单一条件的结果。当所有条件的结果为真时,返回行;
SQL的三个逻辑运算符是:and、or、not
and:and要求两个条件同时为真
--查询工作岗位包含‘MAN’ 并且收入大于等于1000,降序输出
select employee_id,job_id,last_name,salary from employees
where job_id like'%MAN%' and salary>=10000 order by salary desc
or:or操作要求两者之一为真即可
--查询工作岗位包含‘MAN’ 或者收入大于等于1000,升序输出
select employee_id,job_id,last_name,salary from employees
where job_id like'%MAN%' or salary>=10000 order by salary asc
not:取反,not运算符也可以用于另一个SQL运算符。例如,between、like、null
--查询工作岗不是it_prog,st_clerk,sa_rep的雇员
select last_name,job_id from employees
where job_id!='IT_PROG' and job_id!='SA_REP' and job_id!='IT_PROG'
select last_name,job_id from employees
where job_id not in('IT_PROG','SA_REP','IT_PROG')
| 求值顺序(数字越小优先级越高) | 说明 |
| 1 | 算术运算 |
| 2 | 连字运算 |
| 3 | 比较运算 |
| 4 | is(not)null,like,(not)in |
| 5 | (not)between |
| 6 | not逻辑条件 |
| 7 | and逻辑条件 |
| 8 | or逻辑条件 |
优先规则:优先规则定义表达式求值和计算的顺序,表中列出了默认的优先顺序。可以用圆括号括住想要先计算的表达式来覆盖默认的优先顺序
--查询工作岗位是sa_rep,ad_pres并且它们的薪水大于15000的员工
select last_name,job_id,salary from employees
where job_id in('SA_REP','AD_PRES') and salary>15000
--查询工作岗位是sa_rep,或者 工作岗位是ad_pres并且薪水大于15000的员工
--建议加上括号() 可读性更好更严谨,预防数据查的到底对不对
select last_name,job_id,salary from employees
where job_id='SA_REP' or (job_id='AD_PRES' and salary>15000)
--遇到百分号怎么办
--显示所有佣金为20%的雇员,需要把百分号转换成小数
--三种写法
select last_name,commission_pct from employees
where commission_pct=.2
where commission_pct=0.2
where commission_pct=0.20
空值是一个未分配、未知的、或不适用的值
空值不是0,也不是空格
如果一行中的某个列缺少数据值,则该值被置为空值;空值和0或空格不相同,0是一个数字,空格是一个字符。任何数据类型的列都可以包含空值。可是某些约束,如not null,primary key 可以防止在列中使用空值
如果算数表达式中,有个字段的类型为空值(如commission_pct;某些员工的佣金为空值),则计算结果一定为空
--计算e表中的员工年薪+年佣金
select employee_id,first_name,salary*12*commission_pct from employees order by salary desc,employee_id asc;

从此表可以看出,有些值为空值;因为佣金是空值,进行运算后也变为空值
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手