欢迎光临
我们一直在努力

数据库资料 第2页

B树和哈希索引的比较(代码示例)-mysql教程-学派吧

本篇文章给大家带来的内容是关于B树和哈希索引的比较(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前言:了解B树和哈希数据结构有助于预测查询在这些使用不同索引数据结构的存储引擎上的执行情况,特别是对于MEMORY存储引擎,它是允许您选择B树或哈希作为索引的存储引擎。 1. B树指数特征 B树索引可以在使用表达式中使用的对列的比较 =, >, >=, <, <=,或BETWEEN关键字。如果使用LIKE 或to LIKE且是一个不以通配符开头的常量字符串,则索引也可用于比较 。 1.例如,以下SELECT语句将使用索引: SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%'; 在第一个语句中 ‘Patrick’ <= key_col < ‘Patricl’,在第二个语句中’Pat’ <= key_col < ‘Pau’ 2.以下SELECT语句不使用索引: SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%'; SELECT * FROM tbl_name WHERE key_col LIKE other_col; 在第一个语句中,LIKE 值以通配符开头。在第二个语句中,该LIKE值不是常量。 如果使用了像’%string%’且长度超过三个字符的字符串查询,那么MySQL将使用Turbo Boyer-Moore算法初始化这个模型,用这个模型来匹配速度会更快. 不跨越子句中的所有AND级别的 任何索引 WHERE不用于优化查询。换句话说,为了能够使用索引,必须在每个AND组中使用索引的前缀 。 3.以下WHERE子句使用索引: WHERE index_part1=1 AND index_part2=2 AND other_column=3 /* index = 1 OR index = 2 */ WHERE index=1 OR A=10 AND index=2 /* optimized like "index_part1='hello'" */ WHERE index_part1='hello' AND index_part3=5 /* Can use index on index1 but not on index2 or index3 */ WHERE index1=1 AND index2=2 OR index1=3 AND index3=3; 4.这些WHERE子句 不使用索引: /*...

赞(0)adminadmin阅读(2867)去评论
MySQL乱码的原因和设置UTF8数据格式的方法介绍-mysql教程-学派吧-

MySQL乱码的原因和设置UTF8数据格式的方法介绍-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL乱码的原因和设置UTF8数据格式的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 MySQL使用时,有一件很痛苦的事情肯定是结果乱码。将编码格式都设置为UTF8可以解决这个问题,我们今天来说下为什么要这么设置,以及怎么设置。 MySQL字符格式 字符集 在编程语言中,我们为了防止中文乱码,会使用unicode对中文字符做处理,而为了降低网络带宽和节省存储空间,我们使用UTF8进行编码。对这两者有什么不同不够了解的同学,可以参考Unicode字符集和UTF8编码编码的前世今生这篇文章。 同样在MySQL中,我们也会有这样的处理,我们可以查看当前数据库设置的编码方式(字符集): mysql> show variables like '%char%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec) 表中就是当前设置的字符集,先看不用关注的几个值: character_set_filesystem | binary:文件系统上的存储格式,默认为binary(二进制) character_set_system | utf8:系统的存储格式,默认为utf8 character_sets_dir | /usr/local/mysql/share/charsets/:可以使用的字符集的文件路径 剩下的几个就是日常影响读写乱码的参数了:– character_set_client:客户端请求数据的字符集– character_set_connection:从客户端接收到数据,然后传输的字符集– character_set_database:默认数据库的字符集;如果没有默认数据库,使用character_set_server字段– character_set_results:结果集的字符集– character_set_server:数据库服务器的默认字符集 字符集的转换流程分为3步: 1、客户端请求数据库数据,发送的数据使用character_set_client字符集 2、MySQL实例收到客户端发送的数据后,将其转换为character_set_connection字符集 3、进行内部操作时,将数据字符集转换为内部操作字符集: (1)使用每个数据字段的character set设定值 (2)若不存在,使用对应数据表的default character set设定值 (3)若不存在,使用对应数据库的default character set设定值 (4)若不存在,使用character_set_server设定值 4、将操作结果值从内部操作字符集转换为character_set_results 字符序 说字符序之前,我们需要了解一点基础知识: 字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等; 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A’赋予数值0,给字符’B’赋予数值1,则0就是字符’A’的编码; 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,给定字符列表为{‘A’,’B’}时,{‘A’=>0, ‘B’=>1}就是一个字符集; 字符序(Collation)是指在同一字符集内字符之间的比较规则; 确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系; 每个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序(Default Collation); MySQL中的字符序名称遵从命名惯例:以字符序对应的字符集名称开头;以_ci(表示大小写不敏感,case insensitive)、_cs(表示大小写敏感,case sensitive)或_bin(表示按编码值比较,binary)结尾。例如:在字符序“utf8_general_ci”下,字符“a”和“A”是等价的; 因此字符序不同于字符集,用于数据库字段的相等或大小比较。我们查看MySQL实例设置的字符序: mysql> show variables like 'collation%'; +----------------------+-------------------+ | Variable_name | Value...

赞(0)adminadmin阅读(2067)去评论

Mysql中utf8_unicode_ci、utf8_general_ci有什么区别?-mysql教程-学派吧

本篇文章给大家带来的内容是关于Mysql中utf8_unicode_ci、utf8_general_ci有什么区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_general_ci而不是utf8_unicode_ci呢? 用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别。。ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;bin 是二进制, a 和 A 会别区别对待.例如你运行:SELECT * FROM table WHERE txt = 'a'那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用。utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果utf8_bin:字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容 一、官方文档说明下面摘录一下Mysql 5.1中文手册中关于utf8_unicode_ci与utf8_general_ci的说明: 当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。 utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß'等于‘ss'。 utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。 例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:Ä = AÖ = OÜ = U 两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:ß = s 但是,对于utf8_unicode_ci下面等式成立:ß = ss 对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。 utf8_general_ci也适用与德语和法语,除了‘ß'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。 如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束,例如: create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1; 二、简短总结utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。utf8_general_ci校对速度快,但准确度稍差。utf8_unicode_ci准确度高,但校对速度稍慢。 如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了,到现在也没发现问题。。。 三、详细总结 1、对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。2、utf8_general_ci也适用与德语和法语,除了‘?'等于‘s',而不是‘ss'之外。如果你的应用能够接受这些,那么应该使用 utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。 用一句话概况上面这段话:utf8_unicode_ci比较准确,utf8_general_ci速度比较快。通常情况下 utf8_general_ci的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是utf8_general_ci,所以新建数据 库时一般选用utf8_general_ci就可以了 四、如何在MySQL5.0中使用UTF8在 my.cnf中增加下列参数 [mysqld] init_connect='SET NAMES utf8′ default-character-set=utf8 default-collation = utf8_general_ci 执行查询 mysql> show variables; 相关如下: character_set_client | utf8 character_set_connection | utf8 character_set_database | utf8 character_set_results | utf8 character_set_server | utf8 character_set_system | utf8 collation_connection | utf8_general_ci collation_database |...

赞(0)adminadmin阅读(2038)去评论
mysql存储引擎有哪些?-mysql教程-学派吧-

mysql存储引擎有哪些?-mysql教程-学派吧

存储引擎是数据库管理系统用来从数据库创建、读取和更新数据的软件模块。MySQL中有两种类型的存储引擎:事务型和非事务型。 对于MySQL 5.5及更高版本,默认的存储引擎是InnoDB。在5.5版本之前,MySQL的默认存储引擎是MyISAM。 那么mysql存储引擎有哪些? 一、InnoDB 这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。它支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。 二、MyISAM 该存储引擎管理非事务性表,提供高速存储和检索,支持全文搜索。 三、MEMORY 提供内存中的表,以前称为堆。它在RAM中处理所有数据,以便比在磁盘上存储数据更快地访问。用于快速查找引用和其他相同的数据。 四、MERGE 将多个类似的MyISAM表分组为一个表,可以处理非事务性表,默认情况下包括这些表。 五、EXAMPLE 你可以使用此引擎创建表,但不能存储或获取数据。这样做的目的是教开发人员如何编写新的存储引擎。 六、ARCHIVE 用于存储大量数据,不支持索引。 七、CSV 在文本文件中以逗号分隔值格式存储数据。 八、BLACKHOLE 受要存储的数据,但始终返回空。 九、FEDERATED 将数据存储在远程数据库中。 相关推荐:《MySQL教程》 本篇文章就是关于mysql存储引擎有哪些的介绍,希望对需要的朋友有所帮助! 以上就是mysql存储引擎有哪些?的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(2287)去评论
SQL中datediff函数怎么用?(代码详解)-mysql教程-学派吧-

SQL中datediff函数怎么用?(代码详解)-mysql教程-学派吧

在SQL Server中,可以使用T-SQL DATEDIFF()函数返回两个日期之间的差异。它适用于任何可以解析为time、date、smalldatetime、datetime、datetime2或datetimeoffset值的表达式。因此,你也可以得到两次的差值。 本文提供了SQL Server中的DATEDIFF()函数的使用示例。 DATEDIFF()函数语法如下: DATEDIFF ( datepart , startdate , enddate ) 其中datepart是你想要比较的日期的一部分。startdate是第一个日期,enddate是结束日期。 它的工作方式是从enddate中减去startdate。 示例1 下面是一个基本的例子,我们可以算出两个日期之间的天数: SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result; 结果: +----------+ | Result | |----------| | 365 | +----------+ 示例2 下面是另一个例子,我声明了两个变量并为它们分配了两个不同的日期(我使用DATEADD()将第一个日期添加1年)。然后使用DATEDIFF()返回该日期的各个dateparts: DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1, @date1); SELECT DATEDIFF( year, @date1, @date2 ) AS Years, DATEDIFF( quarter, @date1, @date2 ) AS Quarters, DATEDIFF( month, @date1, @date2 ) AS Months, DATEDIFF( week, @date1, @date2 ) AS Weeks, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days; 结果: +---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366...

赞(0)adminadmin阅读(2207)去评论
什么是T-SQL?-mysql教程-学派吧-

什么是T-SQL?-mysql教程-学派吧

Transact-SQL通常缩写为T-SQL,或者TSQL,是Microsoft和Sybase对SQL的专有扩展。Transact-SQL对SQL标准进行扩展,以包含SQL标准中不包含的额外特性。 下面是一个简单的T-SQL语句的例子: CREATE DATABASE Movies; 这是一个简单的T-SQL示例。这将创建一个名为Movies的新数据库。 但是,T-SQL提供了在此语句中包含的其他选项,例如数据库文件应该位于何处、这些文件的大小、它们的最大大小应该是多少,等等。 T-SQL的一些特性包括: 1、程序编程 2、局部变量 3、支持字符串处理、数据处理、数学等多种功能 4、对DELETE和UPDATE语句的更改。特别是,它们允许添加FROM子句,这允许包含连接。 5、T-SQL有一个BULK INSERT批量插入语句,允许你以用户指定的格式将数据文件导入数据库表或视图。 上述扩展的主要好处之一是,在使用T-SQL和SQL时,你有更多的可编程性。例如,存储过程允许你将编程逻辑合并到数据库中。你可以将一个或多个参数传递给存储过程,存储过程将返回一个输出,该输出根据参数的值而变化。 T-SQL还包含大量内置函数,以及支持用户定义的函数。 一个内置函数的例子 下面是另一个基本的例子,这次使用的是T-SQL的内置函数之一: SELECT GETDATE(); 输出: 2018-05-06 23:30:37.003 在本例中,我们使用T-SQL的GETDATE()函数返回当前日期和时间。这与SELECT语句一起使用,SELECT语句是返回数据的常用SQL语句。 我们也可以用这个函数作为另一个函数的参数。这里有一个例子: SELECT FORMAT(GETDATE(), 'MMM'); 结果: May T-SQL的历史 虽然Transact-SQL(和SQL Server)最广为人知的名称是Microsoft,但它实际上是Microsoft和Sybase于1987年开始合作的结果。这一伙伴关系于1994年解散。 此后,T-SQL继续得到两家公司发布的数据库产品的支持,但是,每家公司都按照自己的方向开发了自己的数据库产品。因此,Sybase T-SQL和Microsoft T-SQL之间存在一些差异。 T-SQL和GUI工具 Transact-SQL是SQL Server的核心。SQL Server中的大多数操作都是使用T-SQL完成的。即使您使用GUI工具(如SSMS或DBeaver)而实际上不进行任何编程,这也是正确的。无论何时使用应用程序与SQL Server交互,应用程序都会在后台使用T-SQL执行指定的任务。 但SQL Server并不是唯一支持Transact-SQL的数据库管理系统。Microsoft Azure SQL数据库也支持T-SQL。应用程序使用的大多数T-SQL特性在Microsoft SQL Server和Azure SQL数据库中都得到了完全支持(尽管有一些例外)。 关于GO命令 任何使用过T-SQL的人都可能熟悉GO命令。这个关键字通常放在一批语句的末尾。例如,上面的第一个例子也可以这样写: CREATE DATABASE Movies;GO 然而,GO命令实际上不是Transact-SQL的一部分。事实上,GO命令甚至不能占用Transact-SQL语句的同一行。 GO是sqlcmd和osql实用程序以及SQL Server Management Studio代码编辑器可以识别的命令之一,这些命令可以促进批处理和脚本的可读性和执行。GO命令将一批Transact-SQL语句的结束信号发送给SQL Server实用程序。 SQL Server实用程序将GO解释为一个信号,表示它们应该将当前这批Transact-SQL语句发送到SQL Server的一个实例。当前这批语句由自上次执行操作以来输入的所有语句组成,如果这是第一次执行操作,则由自特别会话或脚本开始执行以来输入的所有语句组成。 其他专有SQL扩展 Transact-SQL不是SQL标准的唯一扩展。各种数据库系统都有自己的扩展。例如,Oracle使用一种私有的过程语言PL/SQL, PostgreSQL使用一种过程语言PL/pgSQL。 尽管专有SQL扩展有其优点(比如扩展功能),但它们也有缺点。一个主要缺点是,如果你需要将数据库从一个系统移植到另一个系统,它们可能会使事情变得困难。例如,如果你的组织突然决定使用Oracle而不是SQL Server,你可能需要遍历所有SQL Server代码并为Oracle重写它。这还要求你熟悉这两个系统的语法。 相关推荐:《MySQL教程》 以上就是什么是T-SQL?的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(2466)去评论

MySQL中utf8和utf8mb4编码有什么区别?-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL中utf8和utf8mb4编码有什么区别?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一、简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。 二、内容描述 那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。 三、问题根源 最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。 utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。 Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100) Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。 要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8. 对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR 替代 CHAR。 以上就是MySQL中utf8和utf8mb4编码有什么区别?的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(1915)去评论

MySQL如何导入格式化数据-mysql教程-学派吧

在MySQL中如何导入格式化数据?本篇文章就来给大家介绍MySQL导入格式化数据的方法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在有些场景下,我们需要把一批特定格式的数据导入到mysql数据库中,做法有很多,使用shell脚本、python都可以,今天来介绍两个更便捷的命令,mysqlimport 和 load data mysqlimport 使用方法 mysqlimport [options] db_name textfile1 [textfile2 ...] # db_name 对应数据库名称 # textfile 文件名,对应要插入的数据库表名 # 比如:mysqlimport a8 campaign.txt 会把campaign.txt中的数据插入到a8数据库中的campaign表 注意:campaign.txt文件必须在/usr/local/mysql/var/a8/目录下,即数据库所在目录 如果不在对应的目录下,会返回以下错误: mysqlimport -uroot -p123456 -hlocalhost -P3306 a8 campaign.txt /usr/local/mysql/bin/mysqlimport: Error: File '/usr/local/mysql/var/a8/campaign.txt' not found (Errcode: 2), when using table: campaign 常用选项 --columns=id,name,creator... # 对应的数据表列名,定义被导入文件中的每一列对应的数据库表列名 --fields-terminated-by= # 文件字段以什么分隔,参数为字符串,默认为\t --fields-enclosed-by= # 数据域用什么符号扩起来,默认为空,一般可以是双引号、括号等 --fields-optionally-enclosed-by= # 数据域可以用什么符号括起来,因为为只有部分数据用这些符号括起来 --fields-escaped-by= # 转义字符,参数为字符,默认为\ --lines-terminated-by= # 数据行以什么结束,参数为字符串,windows默认为\r\n --user=user_name 或 -u user_name --password=[password] 或 -p[password] --host=host_name 或 -h hostname --port=port_num,或 -P port_num # 定义用户名、密码、mysql服务器地址和用于连接的TCP/IP端口号,默认为mysql默认端口3306 --ignore-lines=n # 忽视数据文件的前n行,因为很多数据文件前面有表头 --delete -D # 在把文件中的数据插入前删除表中原先的数据 --local -L # 指定从客户端电脑读入数据文件,否则从服务器电脑读取 --lock-tables -l # 处理文本文件前锁定所有表以便写入,确保所有表在服务器上保持同步 --protocol={TCP | SOCKET | PIPE | MEMORY} 使用的连接协议 --force -f #忽视错误。例如,如果某个文本文件的表不存在,继续处理其它文件,不使用--force,如果表不存在则mysqlimport退出 --compress -C # 压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩) --silent,-s # 沉默模式,只有出现错误时才输出 --socket=path,-S path # 当连接localhost时使用的套接字文件(为默认主机) --verbose,-v # 冗长模式。打印出程序操作的详细信息。...

赞(0)adminadmin阅读(1842)去评论

什么是SQL注入、XSS和CSRF?-mysql教程-学派吧

什么是SQL注入、XSS和CSRF?本篇文章就来带大家了解一下SQL注入、XSS和CSRF,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 SQL注入 SQL注入是属于注入式攻击,这种攻击是因为在项目中没有将代码与数据(比如用户敏感数据)隔离,在读取数据的时候,错误的将数据作为代码的一部分执行而导致的。 典型的例子就是当对SQL语句进行字符串拼接的时候,直接使用未转义的用户输入内容作为变量。这时,只要在sql语句的中间做修改,比如加上drop、delete等关键字,执行之后后果不堪设想。 说到这里,那么该怎么处理这种情况呢?三个方面: 1、过滤用户输入参数中的特殊字符,降低风险。 2、禁止通过字符串拼接sql语句,要严格使用参数绑定来传入参数。 3、合理使用数据库框架提供的机制。就比如Mybatis提供的传入参数的方式 #{},禁止使用${},后者相当于是字符串拼接sql,要使用参数化的语句。 总结下,就是要正确使用参数化绑定sql变量。 XSS XSS:跨站脚本攻击,Cross-Site Scripting,为了和前端的css避免重名,简称为XSS,是指通过技术手段,向正常用户请求的HTML页面中插入恶意脚本,执行。 这种攻击主要是用于信息窃取和破坏等目的。比如2011年的微博XSS攻击事件,攻击者利用了微博发布功能中未对action-data漏洞做有效的过滤,在发布微博信息的时候带上了包含攻击脚本的URL,用户访问就会加载恶意脚本,导致大量用户被攻击。 关于防范XSS上,主要就是通过对用户输入的数据做过滤或者是转义,可以使用框架提供的工具类HtmlUtil。另外前端在浏览器展示数据的时候,要使用安全的API展示数据。比如使用innerText而不是innerHTML。 CSRF 跨站请求伪造,在用户并不知情的情况下,冒充用户发送请求,在当前已经登录的web网站上执行恶意操作,比如恶意发帖,修改密码等。 大致来看,与XSS有重合的地方,前者是黑客盗用用户浏览器中的登录信息,冒充用户去执行操作。后者是在正常用户请求的HTML中放入恶意代码,XSS问题出在用户数据没有转义,过滤;CSRF问题出现在HTTP接口没有防范不守信用的调用。 防范CSRF的漏洞方式: 1、CSRF Token验证,利用浏览器的同源限制,在HTTP接口执行前验证Cookie中的Token,验证通过才会继续执行请求。 2、人机交互,例如短信验证码、界面的滑块。 相关视频教程推荐:《MySQL教程》 以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!! 以上就是什么是SQL注入、XSS和CSRF?的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(2029)去评论

MySQL MID()函数的用法详解(代码示例)-mysql教程-学派吧

在MySQL中,MID()函数返回从指定位置开始的子字符串。 MID()和SUBSTR()都是SUBSTRING()的同义词。 基本语法是这样的: MID(str,pos,len) 这里,str是字符串,pos是起始子字符串的位置,len是一个可选参数,它决定从起始位置返回的字符数。 这个函数有几种不同的使用方法,所以完整的语法看起来是这样的: MID(str,pos) MID(str FROM pos) MID(str,pos,len) MID(str FROM pos FOR len) 例1 -基本用法 下面是MID(str,pos)语法的一个例子: SELECT MID('I drink coffee', 3) Result; 结果: +--------------+ | Result | +--------------+ | drink coffee | +--------------+ 在本例中,我从字符串中取一个子字符串,从位置3开始。 例2 -使用FROM子句 这次使用的是MID(str FROM pos)语法: SELECT MID('I drink coffee' FROM 3) Result; 结果: +--------------+ | Result | +--------------+ | drink coffee | +--------------+ 结果是一样的。 在本例中,FROM是标准SQL。注意,该语法不使用逗号。 例3 -指定长度 在这个例子中,我使用了MID(str,pos,len)语法: SELECT MID('I drink coffee', 3, 5) Result; 结果: +--------+ | Result | +--------+ | drink | +--------+ 这里我指定返回的子字符串长度为5个字符。 例4 -指定长度(使用FOR子句) 在这个例子中,我使用了MID(str FROM pos FOR len)语法: SELECT MID('I drink coffee' FROM 3 FOR 5) Result; 结果: +--------+ | Result | +--------+ | drink | +--------+ 因此,这一次我们使用标准SQL来实现相同的结果。 相关推荐:《MySQL教程》 本篇文章就是关于MySQL MID()函数的用法详解,简单易懂,希望对需要的朋友有所帮助! 以上就是MySQL MID()函数的用法详解(代码示例)的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(2073)去评论

在MySQL中如何使用LOAD_FILE()函数?(代码示例)-mysql教程-学派吧

在MySQL中,LOAD_FILE()函数读取一个文件并将其内容作为字符串返回。 语法 LOAD_FILE(file_name) 其中file_name是文件的完整路径。 下面是我从一个文件中选择内容的示例: SELECT LOAD_FILE('/data/test.txt') AS Result; 结果: +------------------------------------------+ | Result | +------------------------------------------+ | This text is all that the file contains! | +------------------------------------------+ 一个数据库的例子 下面是一个将文件内容插入数据库时查询的示例: INSERT INTO MyTable (FileId, UserId, MyBlobColumn) VALUES (1, 20, LOAD_FILE('/data/test.txt')); 在本例中,列MyBlobColumn有一个BLOB数据类型(允许它存储二进制数据)。 现在它在数据库中,我们可以选择它: SELECT MyBlobColumn FROM MyTable WHERE UserId = 20; 结果: +------------------------------------------+ | MyBlobColumn | +------------------------------------------+ | This text is all that the file contains! | +------------------------------------------+ 如果文件不存在,返回NULL: SELECT LOAD_FILE('/data/oops.txt') AS Result; 结果: +--------+ | Result | +--------+ | NULL | +--------+ 如果不满足以下条件之一,都有可能返回NUll: 1.文件必须位于服务器主机上。 2.你必须具有该FILE权限才能读取该文件。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的。 3.文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节。 你可以这样检查: SHOW VARIABLES LIKE 'max_allowed_packet'; 结果: +--------------------+----------+ | Variable_name | Value | +--------------------+----------+ | max_allowed_packet | 67108864 | +--------------------+----------+ 如果secure_file_priv系统变量被设置为非空目录名,则要加载的文件必须位于该目录中。 你可以这样检查: SHOW VARIABLES LIKE 'secure_file_priv'; 结果: +------------------+--------+ | Variable_name | Value | +------------------+--------+ | secure_file_priv |...

赞(0)adminadmin阅读(2408)去评论
MySQL数据库优化的介绍(图文)-mysql教程-学派吧-

MySQL数据库优化的介绍(图文)-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL数据库优化的介绍(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷.(相关推荐:MySQL教程) 1. 优化一览图 2. 优化 笔者将优化分为了两大类,软优化和硬优化,软优化一般是操作数据库即可,而硬优化则是操作服务器硬件及参数设置. 2.1 软优化 2.1.1 查询语句优化 1.首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息.2.例: DESC SELECT * FROM `user` 显示: 其中会显示索引和查询数据读取数据条数等信息. 2.1.2 优化子查询 在MySQL中,尽量使用JOIN来代替子查询.因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高. 2.1.3 使用索引 索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项: LIKE关键字匹配'%'开头的字符串,不会使用索引. OR关键字的两个字段必须都是用了索引,该查询才会使用索引. 使用多列索引必须满足最左匹配. 2.1.4 分解表 对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表, 2.1.5 中间表 对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时. 2.1.6 增加冗余字段 类似于创建中间表,增加冗余也是为了减少连接查询. 2.1.7 分析表,,检查表,优化表 分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费. 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user; Op:表示执行的操作.Msg_type:信息类型,有status,info,note,warning,error.Msg_text:显示信息. 检查表: 使用 CHECK关键字,如CHECK TABLE user [option] option 只对MyISAM有效,共五个参数值: QUICK:不扫描行,不检查错误的连接. FAST:只检查没有正确关闭的表. CHANGED:只检查上次检查后被更改的表和没被正确关闭的表. MEDIUM:扫描行,以验证被删除的连接是有效的,也可以计算各行关键字校验和. EXTENDED:最全面的的检查,对每行关键字全面查找. 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user; LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志.,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁. 2.2 硬优化 2.2.1 硬件三件套 1、配置多核心和频率高的cpu,多核心可以执行多个线程. 2.配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度. 3.配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行操作的能力. 2.2.2 优化数据库参数 优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能.MySQL服务的配置参数都在my.cnf或my.ini,下面列出性能影响较大的几个参数. key_buffer_size:索引缓冲区大小 table_cache:能同时打开表的个数 query_cache_size和query_cache_type:前者是查询缓冲区大小,后者是前面参数的开关,0表示不使用缓冲区,1表示使用缓冲区,但可以在查询中使用SQL_NO_CACHE表示不要使用缓冲区,2表示在查询中明确指出使用缓冲区才用缓冲区,即SQL_CACHE. sort_buffer_size:排序缓冲区 传送门:更多参数 2.2.3 分库分表 因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。 2.2.4 缓存集群 如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。 结语 一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计.因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了. 以上就是MySQL数据库优化的介绍(图文)的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(2152)去评论

MySQL数据库索引的内容介绍-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL数据库索引的内容介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 存储引擎是数据库的核心,常用的MySQL存储引擎有InnoDB,MyISAM,memory.索引是加速数据的查询的一种数据结构. 1. 索引简介 1.1 索引优点 查询数据块 数据唯一性 加速表之间的连接 1.2 索引缺点 索引会占用存储空间,可能比本身的表数据还大 只对查有利,增加了增删改的负担 1.3 使用索引的注意事项 字段值差别大的数据使用索引(性别列就不要用索引了) 字符字段可以只选取字段的前几位字符建立索引,能简少存储数据. 2.两个重要存储引擎InnoDB和MyISAM 2.1 InnoDB 2.1.1 特点 支持事务 处理数据量巨大 表数据和索引分开存储 支持行级锁定 缺省 6B长度主键 主键本身就是索引,其索引映射的不是地址,而是主键,从而找到行记录 2.1.2 InnoDB索引 只支持B+树 2.2 MyISAM 2.2.1 特点 不支持事务 插入和查找极快 不支持事务 单纯增查数据的首选 2.2.2 MyISAM索引 只支持B+树 2.2.3 memory索引 支持 B+树和HASHMySQL数据库一般默认innoDB存储引擎. 3. 索引的分类 普通索引和唯一索引 单列索引和组合索引(组合索引:最左匹配才能使用) 全文索引:创建分词,为每个分词映射地址,从而通过找到索引中的分词而找到数据的地址. 空间索引 4. 索引设计原则 并非越多越好. 避免对经常更新的表建立过多索引. 数据量小的表不使用索引. 索引应该建立在值差异较大的列上. 频繁分组操作表上建立组合索引. 尽量使用短索引,节省磁盘空间. 本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的MySQL视频教程栏目! 以上就是MySQL数据库索引的内容介绍的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(1802)去评论

Mac下MySQL环境搭建的步骤详解-mysql教程-学派吧

本篇文章给大家带来的内容是关于Mac下MySQL环境搭建的步骤详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Mac 下安装 MySQL 还是很方便的, 总结来看有2个方法。 方法一:用dmg镜像安装 1、安装 官网下载好 MySQL Mac 版安装包,常规步骤安装,安装过程中会出现如下提示: 2019-03-24T18:27:31.043133Z 1 [Note] A temporary password is generated for root@localhost: TdfRm19!o0Xi 其中TdfRm19!o0Xi是初始密码,最好先记住! 2、登陆 在终端命令行 登陆mysql: $ mysql -u root -p # 输入上述密码即可 如果这一步提示: bash: mysql: command not found, 执行下面2个命令做个软连接即可: cd /usr/local/bin ln -fs /usr/local/mysql-8.0.11-macos10.13-x86_64/bin/mysql mysql 3、修改密码 在 MySQL8.0.4 以前,执行 SET PASSWORD=PASSWORD('新密码') 即可。但新版本不能这样改了,因为密码认证变了。具体步骤可以参考 https://blog.csdn.net/yi247630676/article/details/80352655。 方法二:用 Homebrew 进行安装 总所周知,Mac 可以利用 homebrew 进行安装管理,十分方便,如果没有安装 homebrew, 可以点击 https://brew.sh/ 安装。 下面是 mysql 的安装方式 $ brew install mysql # 安装指定版本: brew install mysql@1.1.1 接下来只要等待就可以了,出现下面文字后我们已经很清楚我们需要做什么了: ==> mysql We've installed your MySQL database without a root password. To secure it run: mysql_secure_installation MySQL is configured to only allow connections from localhost by default To connect run: mysql -u root To have launchd start mysql now and restart...

赞(0)adminadmin阅读(2080)去评论
MySQL数据库的事务隔离和MVCC的详细介绍(图文)-mysql教程-学派吧-

MySQL数据库的事务隔离和MVCC的详细介绍(图文)-mysql教程-学派吧

本篇文章给大家带来的内容是关于MySQL数据库的事务隔离和MVCC的详细介绍(图文),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 前言:事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取. 1. 什么是事务? 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:1.原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。2.一致性(Consistency)  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态.3.隔离性(Isolation)  在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务.4.持久性(Durability)  持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 2. 事务的作用 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性. 3. 遇到的并发问题 1.第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了.2.第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失.3.脏读:A事务读取了事务B中未提交的数据.4.不可重复读:A事务多次读取的值不同,因为该值被B事务修改并提交了.5.幻读:A事务两次读之间,B事务插入了数据. 4. 如何解决上面的问题呢? 为了解决上面的问题,开发者为MySQL数据库设计了以下四种事务隔离级别:1.Read Uncommitted(未提交读):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据. 2.Read Committed(提交读):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读). 3.Repeated Read(可重复读):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读. 4.Serializable(串行读):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞. 隔离级别 脏读 不可重复度 不幻读 Read Uncommitted(未提交读) 可能 可能 可能 Read Committed(提交读) 不可能 可能 可能 Repeated Read(可重复读) 不可能 不可能 可能 Serializable(串行读) 不可能 不可能 不可能 5. 小尝试 1.查看全局或会话的事务隔离级别 SELECT @@global.tx_isolation, @@tx_isolation; 2.修改全局或会话的事务隔离级别 SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE] 6. MySQL默认Repeated Read隔离级别,按道理并不能解决幻读问题呀? 以下将先介绍数据库所涉及的锁. 7. 锁的基本叙述 1.锁简介数据库中的锁是指一种软件机制,用来控制防止某个用户(进程会话)在已经占用了某种数据资源时,其他用户做出影响本用户数据操作或导致数据非完整性和非一致性问题发生的手段。2.锁的级别按照锁级别划分,锁可分为共享锁、排他锁。 共享锁(读锁) 针对同一块数据,多个读操作可以同时进行而不会互相影响。共享锁只针对UPDATE时候加锁,在未对UPDATE操作提交之前,其他事务只能够获取最新的记录但不能够UPDATE操作。 排他锁(写锁) 当前写操作没有完成前,阻断其他写锁和读锁。 3.锁的粒度按锁的粒度划分,锁可分为表级锁、行级锁、页级锁。 行级锁 开销大,加锁慢,会出现死锁,锁定力度最小,发生锁冲突的概率最低,并发度高。 表级锁 开销小,加锁快,不会出现死锁,锁定力度大,发生冲突所的概率高,并发度低。 页面锁 开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定力度介于表和行行级锁之间,并发度一般。 8. 悲观锁和乐观锁 8.1 悲观锁 1.基本思想:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁.所以不管冲突是否真的发生,都会使用锁机制。2.悲观锁功能: 锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束。 悲观锁是在使用了数据库的事务隔离功能的基础上,独享占用的资源,以此保证读取数据一致性,避免修改丢失。 悲观锁可以使用Repeatable Read事务,它完全满足悲观锁的要求。 8.2 乐观锁 1.基本思想:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量.2.解释:乐观锁是一种思想,乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。所以它不是一种锁机制.如果使用乐观锁,那么数据库就必须加版本字段,否则就只能比较所有字段,但因为浮点类型不能比较,所以实际上没有版本字段是不可行的 8.3 版本号机制 一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。 8.4 CAS算法 1.核心思想:Compare and Swap,即比较再交换。2.过程:假设有A线程准备去修改内存中变量名为name的值,因此A线程会用以前自己读到的name变量值和此刻name的值做对比,如果一样,则表明在变量值没被修改过,因此可以更新修改,否则更新失败. 9. 回到MySQL的重复读(Repeated Read)事务隔离级别 前面说过,MySQL默认实现了可重复读的事务隔离级别,但是不能解决幻读的问题,然而在MySQL数据库使用可重复读的事务隔离条件下,并未发生幻读.MySQL使用MVCC(多版本并发控制)进行了控制. 9.1名词简析: 1.MVCC:是multiversion concurrency control的简称,也就是多版本并发控制,是个很基本的概念。MVCC的作用是让事务在并行发生时,在一定隔离级别前提下,可以保证在某个事务中能实现一致性读,也就是该事务启动时根据某个条件读取到的数据,直到事务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化(不会看到被其他并行事务修改的数据)。2.read view:InnoDB MVCC使用的内部快照的意思。在不同的隔离级别下,事务启动时(有些情况下,可能是SQL语句开始时)看到的数据快照版本可能也不同。在上面介绍的几个隔离级别下会用到 read view。3.快照读: 就是所谓的根据read view去获取信息和数据,不会加任何的锁。4.当前读:前读会获取得到所有已经提交数据,按照逻辑上来讲的话,在一个事务中第一次当前读和第二次当前读的中间有新的事务进行DML操作,这个时候俩次当前读的结果应该是不一致的,但是实际的情况却是在当前读的这个事务还没提交之前,所有针对当前读的数据修改和插入都会被阻塞,主要是因为next-key lock解决了当前读可能会发生幻读的情况。next-key lock当使用主键索引进行当前读的时候,会降级为record lock(行锁) 9.2 Read view详析 InnoDB支持MVCC多版本控制,其中READ COMMITTED和REPEATABLE...

赞(0)adminadmin阅读(1942)去评论
SQL Server数学函数的简单总结-mysql教程-学派吧-

SQL Server数学函数的简单总结-mysql教程-学派吧

在前面的文章中,我们给大家介绍《mysql数学函数的简单总结》,下面我们继续为大家简单整理了SQL Server数学函数。 Transact-SQL包含许多可以与SQL Server一起使用的数学函数。 可以在SQL Server 2012及更高版本中使用以下标量函数。这些函数中的大多数接受一个或多个参数,并将根据提供的参数返回一个数值。 ABS() 返回指定数值表达式的绝对(正)值。换句话说,它允许您确定数字是正数,负数还是零。 ACOS() 返回反余弦。换句话说,它以弧度为单位返回角度,其余弦值是指定的浮点表达式。 ASIN() 返回反正弦。换句话说,它返回以弧度表示的角度,其正弦值是指定的浮点表达式。 ATAN() 返回反正切值。换句话说,它以弧度为单位返回角度,其切线是指定的浮点表达式。 ATN2() 返回正x轴与从原点到点(y,x)的光线之间的角度(以弧度表示),其中x和y是两个指定的float表达式的值。 CEILING() 允许您将数字四舍五入到最接近的整数。它返回大于或等于指定数值表达式的最小整数。 COS() 返回指定表达式中指定角度的三角余弦值(以弧度为单位)。 COT() 返回指定float值表达式中指定角度的三角余切值(以弧度表示)。 DEGREES() 让我们从弧度转换为度数。具体来说,此函数返回以弧度指定的角度的相应角度(以度为单位)。 EXP() 返回指定的float表达式的指数值。 FLOOR() 可以向下舍入到最接近的整数。它返回小于或等于指定数值表达式的最大整数。 LOG() 返回指定的float表达式的自然对数。 LOG10() 返回指定的float表达式的以10为底的对数。 PI() 返回PI的常量值。 POWER() 将指定表达式的值返回到指定的幂。 RADIANS() 允许您将度数转换为弧度。具体来说,它在输入数字表达式(以度为单位)时返回弧度。 RAND() 返回从0到1的伪随机浮点值,不包括。 ROUND() 返回一个数值,舍入为指定的长度或精度。 SIGN() 返回指定表达式的正(+1),零(0)或负(-1)符号。 SIN() 返回指定角度的三角正弦值(以弧度为单位)和近似数值浮点表达式。 SQRT() 返回指定float值的平方根。 SQUARE() 返回指定float值的平方。 TAN() 返回输入表达式的正切值。 除RAND()之外的所有函数都是确定性的。这意味着每次用一组特定的输入值调用它们时,它们返回相同的结果。RAND()仅在指定子参数时才具有确定性。 相关推荐:《SQL教程》《MySQL教程》 以上就是SQL Server数学函数的简单总结的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(1706)去评论

MySQL中如何将字符串转为base64编码?-mysql教程-学派吧

在MySQL中,TO_BASE64()函数将字符串转换为以base-64编码的字符串并返回结果。(相关推荐:《MySQL教程》) 语法 TO_BASE64(str) 其中str是需要编码的字符串。 例1 -基本用法 下面是一个例子来演示基本用法: SELECT TO_BASE64('Dog'); 结果: +------------------+ | TO_BASE64('Dog') | +------------------+ | RG9n | +------------------+ 在这个例子中,参数是Dog,一旦转换为base-64,它就变成了RG9n。 我们可以使用FROM_BASE64()函数来解码base-64字符串: SELECT FROM_BASE64('RG9n'); 结果: +---------------------+ | FROM_BASE64('RG9n') | +---------------------+ | Dog | +---------------------+ 例2 -一个较长的字符串 下面是一个使用更长的字符串的例子: SELECT TO_BASE64('My cat chases dogs!'); 结果: +----------------------------------+ | TO_BASE64('My cat chases dogs!') | +----------------------------------+ | TXkgY2F0IGNoYXNlcyBkb2dzIQ== | +----------------------------------+ 例3 -非字符串参数 如果参数不是字符串,它将首先转换为字符串: SELECT TO_BASE64(123); 结果: +----------------+ | TO_BASE64(123) | +----------------+ | MTIz | +----------------+ 例4 -NULL参数 如果你输入NULL,你会得到NULL: SELECT TO_BASE64(NULL); 结果: +-----------------+ | TO_BASE64(NULL) | +-----------------+ | NULL | +-----------------+ 例5 -缺少参数 如果你不传递一个参数,你会得到一个错误: SELECT TO_BASE64(); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to native function 'TO_BASE64' 例6 -参数太多 如果你传入太多的参数,你也会得到一个错误: SELECT TO_BASE64('Cat', 'Dog'); 结果: ERROR 1582 (42000): Incorrect parameter count in the call to...

赞(0)adminadmin阅读(2476)去评论
数据隔离四个级别分别是哪些-mysql教程-学派吧-

数据隔离四个级别分别是哪些-mysql教程-学派吧

数据库的四个级别分为:读取未提交内容,读取提交内容,可重读以及可串行化。但隔离级别也会造成脏读,不可重复读以及幻读等问题 【推荐课程:MySQL教程】 数据库隔离的四个级别分别为: Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 Repeatable Read(可重读) 这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 Serializable(可串行化) 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。 隔离级别所产生的问题 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如: 脏读(Drity Read): 某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。 不可重复读(Non-repeatable read): 在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。 幻读(Phantom Read): 在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示: 隔离级别 脏读 不可重复读 幻读 读未提交 √ √ √ 读已提交 X √ √ 可重复读 X X √ 可串行化 X X X 总结:以上就是本篇文章的全部内容了,希望对大家有所帮助 以上就是数据隔离四个级别分别是哪些的详细内容,更多请关注php中文网其它相关文章!

赞(0)adminadmin阅读(1716)去评论

更好的服务器推荐选择

本站主要用于阿里云、腾讯云、华为云服务器活动的推荐及优惠购买方式、并搜集服务器运维的日常解决方案!

联系我们联系我们

登录

找回密码

注册