常见的几个NO_SQL数据库

本文对比了几种主流NoSQL数据库的特点及适用场景,包括CouchDB、Cassandra、MongoDB、Redis和HBase等。每种数据库都有其独特的设计语言、优势、许可证类型、复制方式和支持的特性。
各个NO_SQL数据库的比较  CouchDB, Cassandra, Mongodb,Redis, Riak, Membase, Neo4j and HBase: 
1.CouchDB的(V1.1.0)
实现语言:Erlang
要点:DB一致性,易用性
许可证:apache
协议:HTTP / REST
双向的复制,
连续或即席
带有冲突检测,
还有,master-master的复制。 
MVCC(多版本一致性控制)- 写操作不阻止读
文件的以前版本
仅崩溃(可靠)的设计:Crash-only (reliable) design
需要不停的压缩
视图:内嵌的map/reduce
格式化视图:lists & shows
服务器端的文档验证
身份验证
实时更新通过 _changes
附件处理
因此,CouchApps(JS独立应用程序)
包括jQuery的库


最适用于:累积,偶尔变化的数据,预先定义的查询要运行。多用在版本很重要的地方
例如:客户关系管理(CRM),CMS系统。master-master replication是一个特别有趣的的的功能
,便于多站点部署。


2. redis(v2.4)
设计语言: c/c++
优点: 速度非常快
许可证: BSD的
协议:Telnet-like
带有磁盘备份的内存数据库
目前还没有磁盘交换
master-slave replication 
简单的值或者 hash表
NCR & co (对统计和速率限制很有好处)
sets
lists
hash tables
sorted sets
事务的支持 
可以对值进行过期时间设置
发布和订阅消息
最适用于:对于迅速变化的一个可预见的数据库的大小(应该适合大多在内存)的数据。
例如:股票价格。分析。实时数据采集。实时通信。
3. MongoDB
实现语言:c++
优点: 保留了一些友好的SQL属性,比如 查询和索引
许可证:AGPL (Drivers: Apache) 
协议:自定义,二进制(BSON)
Master/slave replication 主从复制
sharding build-in 内置分片
查询javascript的表达式
服务器端执行任意的JavaScript功能
比CouchDB有更好的update-in-place
使用内存映射文件的数据存储
很好的性能
32位的系统 内存限制到2.5G
空数据库占内存高达192M
GridFS存储大数据和其元数据(不是再真正的FS)
最适用于:如果您需要动态查询。如果你喜欢定义索引,而不是Map / Reduce的功能。
如果你需要一个大的DB的性能良好。如果你想CouchDB的,但您的数据变化太大,填补了磁盘。
例如:对于大多数事情,你会做与MySQL或PostgreSQL,但预定义的列的话 还是需要mongoDB。
4.Cassandra
实现语言:java
优点:bigTable的使用
许可证: apache
协议:用户自定义,二进制
Tunable trade-offs for distribution and replication (N, R, W) 
Querying by column, range of keys 
BigTable-like features: columns, column families 
Writes are much faster than reads (!) 
Map/reduce possible with Apache Hadoop 
I admit being a bit biased against it, because of the bloat and complexity it has partly 
ecause of Java (configuration, seeing exceptions, etc) 
Best used: When you write more than you read (logging). If every component of the system 
must be in Java. ("No one gets fired for choosing Apache's stuff.") 
For example: Banking, financial industry (though not necessarily for financial transactions,
 but these industries are much bigger than that.) Writes are faster than reads, so one natural
 niche is real time data analysis.

5.HBase
(With the help of ghshephard) 
Written in: Java 
Main point: Billions of rows X millions of columns 
License: Apache 
Protocol: HTTP/REST (also Thrift) 
Modeled after BigTable 
Map/reduce with Hadoop 
Query predicate push down via server side scan and get filters 
Optimizations for real time queries 
A high performance Thrift gateway 
HTTP supports XML, Protobuf, and binary 
Cascading, hive, and pig source and sink modules 
Jruby-based (JIRB) shell 
No single point of failure 
Rolling restart for configuration changes and minor upgrades 
Random access performance is like MySQL 
Best used: If you're in love with BigTable. :) And when you need random, realtime read/write access to your Big Data. 

For example: Facebook Messaging Database (more general example coming soon) 


注这些只是一些基本的指标,其实每个数据库都还有很多特性,具体使用哪个还是需要具体分析的。



<think>嗯,用户想了解这个特定的sql_mode配置里面的各个模式是什么意思。首先,我需要回忆一下MySQLsql_mode的作用,它是用来控制数据库如何处理数据验证和SQL语法的严格性。用户给出的配置包括STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER和NO_ENGINE_SUBSTITUTION这几个选项,每个都有不同的功能。 首先,STRICT_TRANS_TABLES,这个模式在事务性存储引擎中启用严格模式,如果数据插入或更新时不符合字段定义,比如字符串太长或者数值超出范围,就会报错而不是警告。不过需要确认严格模式是否只影响事务表,非事务表可能还是会有不同的行为? 接下来是NO_ZERO_IN_DATE和NO_ZERO_DATE,这两个都和日期中的零值有关。前者禁止像'2023-00-15'这样的日期,月份或日为00的情况,而后者则不允许'0000-00-00'这样的零日期。需要注意的是,在MySQL 5.7以上版本中,NO_ZERO_DATE可能已经被包含在严格模式里,或者有变更,需要确认版本差异的影响。 然后是ERROR_FOR_DIVISION_BY_ZERO,这个模式在除零的时候会报错,而不是返回NULL。不过需要提醒用户,在严格模式下这个错误可能会导致整个语句失败,而不仅仅是警告。另外,这个模式在MySQL 5.7之后可能和严格模式一起使用,或者有变化,需要查证。 NO_AUTO_CREATE_USER这个选项阻止GRANT语句在用户不存在时自动创建用户,这可能和MySQL 8.0的改动有关,因为8.0之后这个选项已经被移除了,所以如果用户使用的是较新版本,可能不需要这个设置。需要确认用户是否了解他们使用的MySQL版本。 最后是NO_ENGINE_SUBSTITUTION,当指定的存储引擎不可用时,默认会替换为默认引擎(比如InnoDB),但启用这个选项后,如果引擎不可用会直接报错,而不是自动替换。这对于确保表使用正确的引擎很重要,比如需要Memory引擎的时候,如果不可用就报错,而不是用其他引擎替代。 在整理这些信息的时候,需要注意各个模式之间的相互作用,比如严格模式是否会影响其他选项的行为。另外,还要考虑不同MySQL版本之间的差异,比如某些选项在较新版本中是否被废弃或合并到其他模式中。例如,MySQL 8.0中已经移除了NO_AUTO_CREATE_USER,所以如果用户使用的是8.0或更高版本,这个设置会被忽略,需要提醒用户注意。 同时,需要告诉用户这些设置如何影响数据库的行为,比如数据插入时的严格检查,日期合法性,除零错误处理,用户创建和存储引擎替换等。还要建议用户根据实际需求选择配置,比如在开发环境启用严格模式以尽早发现问题,而在生产环境中确保数据的一致性和正确性。 另外,用户可能需要知道如何设置这些模式,是在配置文件my.cnf中设置,还是在运行时通过SET语句配置。以及这些设置对现有数据和表结构的影响,比如启用严格模式后,之前能插入的数据现在可能报错,需要检查应用是否处理了这些错误。 最后,可能用户的问题背后是想解决一些数据插入或查询时遇到的错误,比如突然出现的除零错误,或者日期无效的问题,所以需要解释清楚每个模式的作用,帮助他们调整配置或者修改应用代码来适应这些设置。</think>以下是对 `sql_mode` 配置项中各个模式的详细解释: --- ### 1. **`STRICT_TRANS_TABLES`** - **作用**:启用严格模式(针对事务型存储引擎的表)。 - **行为**: - 插入或更新数据时,若数据类型不匹配(如字符串超长、数值超出范围等),会直接报错而非警告。 - 对非事务型表(如 MyISAM),若错误发生在第一行,会终止操作;否则允许部分更新(但可能导致数据不一致)。 --- ### 2. **`NO_ZERO_IN_DATE`** - **作用**:禁止日期中的“零值”部分(如 `2023-00-15`)。 - **行为**: - 若日期或月份为 `00`,会被视为无效日期,触发错误或警告(取决于是否启用严格模式)。 --- ### 3. **`NO_ZERO_DATE`** - **作用**:禁止 `0000-00-00` 作为有效日期。 - **行为**: - 严格模式下,插入 `0000-00-00` 会报错;非严格模式可能允许但生成警告。 --- ### 4. **`ERROR_FOR_DIVISION_BY_ZERO`** - **作用**:禁止除以零的操作。 - **行为**: - 执行 `SELECT 1/0` 时,严格模式下会报错;非严格模式返回 `NULL` 并生成警告。 - 需配合 `STRICT_TRANS_TABLES` 使用,否则可能仅生成警告。 --- ### 5. **`NO_AUTO_CREATE_USER`** - **作用**:禁止通过 `GRANT` 语句自动创建用户。 - **行为**: - 执行 `GRANT` 时若用户不存在,会直接报错(MySQL 8.0+ 已移除该模式,默认禁止自动创建用户)。 --- ### 6. **`NO_ENGINE_SUBSTITUTION`** - **作用**:禁止存储引擎自动替换。 - **行为**: - 若创建表时指定了不可用的存储引擎(如未启用的 `InnoDB`),会直接报错,而非自动替换为默认引擎。 --- ### **配置示例与建议** ```sql -- 设置方式(临时生效) SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; -- 或写入配置文件 my.cnf(永久生效) [mysqld] sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" ``` --- ### **注意事项** 1. **版本兼容性**: - MySQL 5.7+ 默认包含 `STRICT_TRANS_TABLES`, `NO_ZERO_IN_DATE`, `NO_ZERO_DATE`, `ERROR_FOR_DIVISION_BY_ZERO`。 - MySQL 8.0+ 移除了 `NO_AUTO_CREATE_USER`,需通过其他方式管理用户。 2. **严格模式的重要性**: - 推荐在开发和生产环境中启用严格模式,避免无效或截断数据写入。 3. **应用兼容性**: - 启用前需确保应用程序能正确处理严格模式触发的错误(如数据校验、异常捕获)。 --- 通过合理配置 `sql_mode`,可显著提升数据一致性和安全性,减少隐式错误的发生。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值