随着数据的飞速增长，数据的组织变得至关重要。本文将简要介绍当今软件开发中最流行的数据库。在软件系统中，数据被格式化地组织和存储，通过数据库可以以电子方式访问它们。因为数据已经成为一种非常重要的资产，对我们来说，掌握当今使用的各种数据库的基本知识是非常重要的。我们要看的第一个数据库是 MySQL。MySQLMySQL 官网MySQL 是使用最广泛的开源数据库管理系统之一。它由 甲骨文公司 Oracle Corporation 所有。它可以在大多数主流操作系统上运行，如 Windows、MacOS、Linux 等。MySQL 既适用于小型应用，同时也能胜任大型应用。优点适配各种操作系统适配多种编程语言，如 PHP、C、C++、Perl 等开源、免费它支持高达 8 百万 Tb 的巨大数据量可定制化比其他数据库快得多要在基于 Ubuntu 的计算机上安装并使用 MySQL，使用下面的命令：$sudo apt update $sudo apt install mysql-server $sudo systemctl start mysql.service MariaDBMariaDB 官网MariaDB 是一款由 MySQL 的开发人员开发的开源关系型数据库，因其优秀的性能和与 MySQL 良好的兼容性而广受欢迎。它是当今大多数主要云产品的一部分，对其稳定性和性能起到重要作用。最近通过使用 Galera Cluster 技术，MariaDB 新增了集群功能。另外 MariaDB 还与 Oracle 数据库有（一定的）兼容性。优点安装方便支持大数据操作高可扩展性易于导入数据要在基于 Ubuntu 的计算机上安装并使用 MariaDB，请使用以下命令:$sudo apt update $sudo apt install mariadb-server $sudo systemctl start mariadb.service RethinkDBRethinkDB 官网RethinkDB 是一个开源、免费、分布式、基于文档的 NoSQL 数据库。它由 RethinkDB 公司开发。（LCTT 译注：RethinkDB 公司已于 2016 年倒闭。RethinkDB 数据库现作为开源项目继续维护。消息来源）它可以存储具有动态模式的 JSON 文件。更重要的是，它可以将查询结果的实时更新推送给应用程序。由于它的分布式特性，它具有高度可扩展性。RethinkDB 提供了丰富的内置函数，使其成为一个高可用性的数据库。由于它是当今流行的数据库，学习如何使用它是很重要的。优点适合于 Web 应用易于扩展内置函数多，可用性高基于 JSON 动态文档要在基于 Ubuntu 的计算机上使用 RethinkDB，下面的命令会有帮助：# 添加软件仓库源 source /etc/lsb-release && echo "deb https://download.rethinkdb.com/repository/ubuntu-$DISTRIB_CODENAME $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list # 下载并安装 RethinkDB 的 GPG 密钥 $wget -qO- https://download.rethinkdb.com/repository/raw/pubkey.gpg | sudo apt-key add - $sudo apt update $sudo apt-get install rethinkdb $sudo systemctl start rethinkdb OrientDBOrientDB 官网OrientDB 是一个基于 Java 的开源 NoSQL 数据库管理系统。它支持多种数据模型，比如文档、字典、对象和图。它以图数据库的形式存储关系。下面的命令可以帮助你在 Ubuntu 机器上使用 OrientDB：$sudo apt-get update $wget -O orientdb-community-2.2.20.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.20.tar.gz&os=linux $tar -zxvf orientdb-community-2.2.20.tar.gz $sudo mv ~/orientdb-community-2.2.20 /opt/orientdb CouchDBCouchDB 官网CouchDB 是用 Erlang 开发的开源 NoSQL 数据库。它使用多种协议和格式来传输、处理和共享数据。它使用 JSON 格式存储数据，支持 MapReduce，并用 JavaScript 作为查询语言。优点可以存储任何类型的数据支持 MapReduce，可以高效地处理数据整体结构非常简单索引和检索速度快下面的命令可以帮助你在 Ubuntu 机器上使用 CouchDB：$echo "deb https://apache.bintray.com/couchdb-deb focal main" >> /etc/apt/sources.list $sudo apt-get update $sudo apt install apache2 couchdb -y FirebirdFirebird 官网Firebird 是一个开源关系型数据库。它兼容所有操作系统，如 Linux、Windows 和 MacOS。它最初是从开源数据库 Interbase 派生而来的。优点数据库功能不受限制非常稳定，功能强大配置和使用简单以下命令可以帮助你在 Ubuntu 机器上使用 Firebird：$sudo apt-get update $sudo apt-get install firebird2.5-superclassic CassandraCassandra 官网Cassandra 是一个 Apache 基金会旗下的 NoSQL 数据库。它具有高度可扩展性、分布式、高性能的特点，可以很好地处理大量数据。其分布式的特性，使它没有单点故障。优点高性能高可扩展性采用点对点架构以下命令可以帮助你在 Ubuntu 机器上使用 Cassandra：$curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add - $sudo apt-get update $sudo apt-get install cassandra $sudo systemctl enable cassandra $sudo systemctl start cassandra PostgreSQLPostgreSQL 官网如今，PostgreSQL 是最流行的开源关系数据库管理系统之一。它易于扩展，同时还与 SQL 兼容。这个数据库管理系统经过了 30 多年的积极开发。优点与 MySQL 相比，Postgres 可以存储更多种类的数据支持几乎所有的 SQL 特性高度可扩展下面的命令可以帮助你在 Ubuntu 机器上使用 PostgreSQL：$sudo apt-get update $sudo apt-get install postgresql postgresql-contrib CockroachDBCockroachDB 官网CockroachDB 是一个为可靠性而生的数据库。它可以像 蟑螂 cockroach 一样在灾难性的情况下顽强生存、蓬勃发展。它可以处理大量的数据。还可以构建多集群数据库。优点很容易部署高一致性分布式事务高可用性兼容 SQLRedisRedis 官网Redis 是一个基于键值的开源 NoSQL 数据存储数据库。它支持各种类型的键，使用非常方便。结语我们已经浏览了最知名和最流行的开源数据库管理系统。了解这些不同的数据库非常有趣。尝试不同的选择，发现最适合你需求的数据库。另外，一定要查看这些数据库的官方文档。（题图：MJ/40ba9f14-5948-431a-a899-36c6b1ff4dfe）via: https://www.opensourceforu.com/2022/09/are-you-familiar-with-these-popular-open-source-databases/作者：Jishnu Saurav Mittapalli 选题：lkxed 译者：toknow-gh 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
这篇关于 MySQL 中日期和时间的概述将帮助你在数据库表中处理时间值。流行数据库系统 MySQL 的新老用户常常会对数据库处理时间值的方式感到困惑。有时用户不会费心去了解时间值的数据类型。这可能是因为他们觉得本身也没有什么好了解的。日期就是日期，对吧？好吧，并非总是如此。花几分钟时间了解 MySQL 如何存储和显示日期和时间是有益的。学习如何最好地利用数据库表中的时间值可以帮助你成为更好的编码者。MySQL 时间值类型当你在 MySQL 中新建表时，选择合适的数据类型（INT、FLOAT、CHAR 等）高效地保存插入到表中的数据。MySQL 为时间值提供了五种数据类型。它们是 DATE、TIME、DATETIME、TIMESTAMP 和 YEAR。MySQL 使用 ISO 8601 格式来存储以下格式的值（LCTT 译注：国际标准 ISO 8601，是国际标准化组织的日期和时间的表示方法，全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》）：DATE：YYYY-MM-DDTIME：HH:MM:SSTIMESTAMP：YYYY-MM-DD HH:MM:SSYEAR：YYYYDATETIME 与 TIMESTAMP 的比较你可能已经注意到 日期时间 DATETIME 和 时间戳 TIMESTAMP 数据类型存有相同的数据。你可能想知道这两者之间是否有差异。答案是：有。首先，可以使用的日期范围不同。DATETIME 可以保存 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期，而 TIMESTAMP 的范围更有限，从 1970-01-01 00:00:01 到 2038-01-19 03:14:07 UTC。其次，虽然两种数据类型都允许你 自动初始化 auto_initialize 或 自动更新 auto_update 它们各自的值（分别用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP），但在 5.6.5 版本之前，对 DATETIME 值不能这样操作。如果你要用 DATETIME，你可以使用 CURRENT_TIMESTAMP 的 MySQL 同义词之一，例如 NOW() 或 LOCALTIME()。如果你对一个 DATETIME 值使用 ON UPDATE CURENT_TIMESTAMP（或其同义词之一），但没有使用 DEFAULT CURRENT_TIMESTAMP 子句，那么这个列的默认值为 NULL。除非你在表的定义中包含 NOT NULL，在这种情况下，它默认为 0。另一件需要记住的重要事情是，尽管通常情况下，除非你声明一个默认值，否则 DATETIME 和 TIMESTAMP 列都没有一个默认值，但这个规则有一个例外。如果没有指定 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 这两个子句，并且禁用 explicit_defaults_for_timestamp 这个变量，那么你表中的第一个 TIMESTAMP 列将被隐式创建。要检查这个变量的状态，请运行：mysql> show variables like 'explicit_default%'; 如果你想打开或关闭它，运行这段代码（用 0 表示关闭，用 1 表示打开）：mysql> set explicit_defaults_for_timestamp = 0; TIMEMySQL 的 时间 TIME 数据类型可能看起来很简单，但有几件事是一个优秀的程序员应该牢记的。首先要注意的是，虽然 TIME 经常被认为是一天中的时间，但它实际上是经过的时间。换句话说，它可以是一个负值，或者可以大于 23:59:59。在 MySQL 中，一个 TIME 值的范围可以是 -838:59:59 到 838:59:59。另外，如果你缩写一个时间值，MySQL 会因你是否使用冒号作出不同解释。例如，10:34 这个值被 MySQL 看作是 10:34:00。也就是说，十点过后的 34 分钟。但是，如果你不使用冒号写作 1034，MySQL 将其视为 00:10:34，意思是 10 分钟 34 秒。最后，你应该知道 TIME 值（以及 DATETIME 和 TIMESTAMP 字段的时间部分）从 5.6.4 版本开始，可以取一个小数部分。要使用它，请在数据类型定义的结尾处添加一个整数（最大值为 6）的圆括号。time_column TIME(2) 时区时区变化不仅在现实世界中产生混乱和疲劳，而且也会在数据库系统中制造麻烦。地球被划分为 24 个独立的时区，通常每隔 15 度经度就会发生变化。我说通常是因为一些国家行事方式不同。例如中国只在一个时区运作，而不是预期的五个时区。你如何处理处于不同时区的数据库系统的用户就成了一个问题。幸运的是，MySQL 并没有使这个问题变得太困难。要检查你的会话时区，请运行：mysql> select @@session.time_zone; 如果结果显示 System，这意味着它正在使用你的 my.cnf 配置文件中设置的时区。如果你在本地计算机上运行你的 MySQL 服务器，这可能就是你会得到的，你不需要做任何改变。如果你想改变你的会话的时区，请运行如下命令：mysql> set time_zone = '-05:00'; 这将你的时区设置为 美国/东部 US/Eastern ，比 协调世界时 UTC 晚五个小时。获得一周的日期为了跟上本教程后面部分的代码，你应该在你的系统中创建一个带有日期值类型的表。比如：mysql> create table test ( row_id smallint not null auto_increment primary key, the_date date not null); 然后使用 ISO 8601 格式在表中插入一些随机日期，如mysql> insert into test (the_date) VALUES ('2022-01-05'); 我在我的 test 表中插入了四行日期值，你插入多少行都可以。有时你可能想知道某一天是星期几。MySQL 给了你几种实现方法。第一种，也是最显而易见的方法，是使用 DAYNAME() 函数。如下示例表所展示，DAYNAME() 函数可以告诉你每个日期是星期几：mysql> SELECT the_date, DAYNAME(the_date) FROM test; +------------+-------------------------------+ | the_date | DAYNAME(the_date) | +------------+-------------------------------+ | 2021-11-02 | Tuesday | | 2022-01-05 | Wednesday | | 2022-05-03 | Tuesday | | 2023-01-13 | Friday | +------------+-------------------------------+ 4 rows in set (0.00 sec) 另外两种获取星期几的方法是返回整数值，而不是星期几的名称，分别是 WEEKDAY() 和 DAYOFWEEK()。他们都返回数字，却又各不相同。WEEKDAY() 函数返回从 0 到 6 的数字，其中 0 代表星期一，6 代表星期日。而 DAYOFWEEK() 则返回从 1 到 7 的数字，其中 1 代表星期日，7 代表星期六。mysql> SELECT the_date, DAYNAME(the_date), WEEKDAY(the_date), DAYOFWEEK(the_date) FROM test; +------------+------------------+------------------+--------------------+ | the_date | DAYNAME(the_date)| WEEKDAY(the_date)| DAYOFWEEK(the_date)| | 2021-11-02 | Tuesday | 1 | 3 | | 2022-01-05 | Wednesday | 2 | 4 | | 2022-05-03 | Tuesday | 1 | 3 | | 2023-01-13 | Friday | 4 | 6 | +------------+------------------+------------------+--------------------+ 4 rows in set (0.00 sec) 当你只想获取日期的一部分时有时你可能在 MySQL 表中存储了一个日期，但是你只想获取日期的一部分。这并不是问题。MySQL 中有几个顾名思义的函数，可以轻松获取日期对象的特定部分。以下是一些示例：mysql> SELECT the_date, YEAR(the_date), MONTHNAME(the_date), DAYOFMONTH(the_date) FROM test ; +-----------+---------------+-------------------+---------------------+ | the_date | YEAR(the_date)|MONTHNAME(the_date)| DAYOFMONTH(the_date)| +-----------+---------------+-------------------+---------------------+ | 2021-11-02| 2021 | November | 2 | | 2022-01-05| 2022 | January | 5 | | 2022-05-03| 2022 | May | 3 | | 2023-01-13| 2023 | January | 13 | +-----------+---------------+-------------------+---------------------+ 4 rows in set (0.00 sec) MySQL 也允许你使用 EXTRACT() 函数来获取日期的一部分。你提供给函数的参数是一个单位说明符（确保是单数形式）、FROM 和列名。因此，为了从我们的 test 表中仅获取年份，你可以写：mysql> SELECT EXTRACT(YEAR FROM the_date) FROM test; +----------------------------------------------+ | EXTRACT(YEAR FROM the_date) | +----------------------------------------------+ | 2021 | | 2022 | | 2022 | | 2023 | +----------------------------------------------+ 4 rows in set (0.01 sec) 插入和读取不同格式的日期正如之前提到的，MySQL 使用 ISO 8601 格式存储日期和时间值。但是如果你想以另一种方式存储日期和时间值，例如 MM-DD-YYYY 格式，怎么办？首先，不要尝试这样做。MySQL 以 8601 格式存储日期和时间，就是这样。不要尝试更改它。但是，这并不意味着你必须在将数据输入到数据库之前将数据转换为特定的格式，或者你不能以任何你想要的格式展示数据。如果你想要将非 ISO 的格式的日期输入到表中，你可以使用 STR_TO_DATE() 函数。第一个参数是你想要存储在数据库中的日期的字符串值。第二个参数是格式化字符串，它让 MySQL 知道日期的组织方式。让我们看一个简单的例子，然后我将更深入地研究这个看起来很奇怪的格式化字符串是什么。mysql> insert into test (the_date) values (str_to_date('January 13, 2023','%M %d, %Y')); Query OK, 1 row affected (0.00 sec) 你将格式化字符串放在引号中，并在每个特殊字符前加上百分号。上面代码中的格式序列告诉 MySQL 我的日期由一个完整的月份名称 %M，后跟一个两位数的日期%d，然后是一个逗号，最后由一个四位数的年份 %Y 组成。请注意，大写很重要。一些其他常用的格式化字符串字符是：%b 缩写月份的名称（例如: Jan）%c 数字月份（例如: 1）%W 星期名称（例如: `Saturday）%a 星期名称的缩写（例如: Sat）%T 24 小时制的时间（例如: 22:01:22）%r 带 AM/PM 的 12 小时制的时间（例如: 10:01:22 PM）%y 两位数的年份（例如: 23）请注意，对于两位数年份 %y，年份范围是 1970 到 2069。因此，从 70 到 99 的数字被假定为 20 世纪，而从 00 到 69 的数字被假定为 21 世纪。如果你有一个日期存储在你的数据库中，你想用不同的格式显示它，你可以使用这个 DATE_FORMAT() 函数：mysql> SELECT DATE_FORMAT(the_date, '%W, %b. %d, %y') FROM test; +-----------------------------------------+ | DATE_FORMAT(the_date, '%W, %b. %d, %y') | +-----------------------------------------+ | Tuesday, Nov. 02, 21 | | Wednesday, Jan. 05, 22 | | Tuesday, May. 03, 22 | | Friday, Jan. 13, 23 | +-----------------------------------------+ 4 rows in set (0.00 sec) 总结本教程应该为你提供了一个关于 MySQL 中的日期和时间值的有用的概述。我希望本文教会了您一些新知识，使您能够更好地控制和理解 MySQL 数据库如何处理时间值。（题图：MJ/76b6481a-a271-4e81-bc17-dd7fbe08a240）via: https://opensource.com/article/23/2/temporal-values-mysql作者：Hunter Coleman 选题：lkxed 译者：hanszhao80 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。字符串是你在 MySQL 中使用的最常见的数据类型之一。许多用户在他们的数据库中插入和读取字符串，而没有认真地了解过它们。本文旨在让你深入了解 MySQL 如何存储和显示你的字符串变量，以便你能更好地控制你的数据。你可以把字符串分成两类：二进制和非二进制。你可能在大多数时候想到的是非二进制字符串。非二进制字符串有字符集和排序的不同。另一方面，二进制字符串存储诸如 MP3 文件或图像等东西。即使你在二进制字符串中存储了一个词，比如“歌曲”，它的存储方式也与非二进制字符串不同。我将重点讨论非二进制字符串。MySQL 中的所有非二进制字符串都与字符集和排序相关。字符串的字符集控制哪些字符可以存储在字符串中，而它的排序方式控制当你显示字符串时如何排序。字符集要查看你系统中的字符集，请运行以下命令：SHOW CHARACTER SET; 这个命令将输出四列数据，包括字符集：名称简要描述默认的排序方式字符集中每个字符的最大尺寸MySQL 过去默认为 latin1 字符集，但自 8.0 版以来，默认为 utf8mb4。现在的默认排序方式是 utf8mb4_0900_ai_ci。ai 表示该排序对音调不敏感（ á = a），而 ci 则指定它对大小写不敏感（a = A）。不同的字符集将其字符存储在内存中不同大小的块中。例如，从上面的命令可以看出，存储在 utf8mb4 的字符被存储在 1 到 4 个字节大小的内存中。如果你想看看一个字符串是否包含多字节的字符，你可以使用 CHAR_LENGTH() 和 LENGTH() 函数。CHAR_LENGTH() 显示一个字符串包含多少个字符，而 LENGTH() 显示一个字符串有多少个字节，根据字符集的不同，它可能与一个字符串的字符长度相同，也可能不相同。下面是一个例子：SET @a = CONVERT('data' USING latin1); SELECT LENGTH(@a), CHAR_LENGTH(@a); +------------+-----------------+ | LENGTH(@a) | CHAR_LENGTH(@a) | +------------+-----------------+ | 4 | 4 | +------------+-----------------+ 这个例子表明，latin1 字符集以单字节为单位存储字符。其他字符集，如 utf16，允许多字节的字符：SET @b = CONVERT('data' USING utf16); SELECT LENGTH(@b), CHAR_LENGTH(@b); +------------+------------------+ | LENGTH(@b) | CHAR_LENGTH(@b) | +------------+------------------+ | 8 | 4 | +------------+------------------+ 排序当你运行带有 ORDER BY 子句的 SQL 语句时，字符串排序方式将决定值的显示方式。你对排序方式的选择是由你选择的字符集决定的。当你运行上面的 SHOW CHARACTER SET 命令时，你看到了每个字符集的默认排序方式。你可以很容易地看到某个特定字符集的所有排序方式。例如，如果你想查看 utf8mb4 字符集允许哪些排序，请运行：SHOW COLLATION LIKE 'utf8mb4%'; 排序方式可以是不区分大小写的，也可以是区分大小写的，或者是二进制的。让我们建立一个简单的表，向其中插入一些值，然后用不同的排序方式查看数据，看看输出结果有什么不同：CREATE TABLE sample (s CHAR(5)); INSERT INTO sample (s) VALUES ('AAAAA'), ('ccccc'), ('bbbbb'), ('BBBBB'), ('aaaaa'), ('CCCCC'); SELECT * FROM sample; +-----------+ | s | +-----------+ | AAAAA | | ccccc | | bbbbb | | BBBBB | | aaaaa | | CCCCC | +-----------+ 在不区分大小写的情况下，你的数据会按字母顺序返回，但不能保证大写的单词会排在小写的单词之前，如下图所示：SELECT * FROM sample ORDER BY s COLLATE utf8mb4_turkish_ci; +-----------+ | s | +-----------+ | AAAAA | | aaaaa | | bbbbb | | BBBBB | | ccccc | | CCCCC | +-----------+ 另一方面，当 MySQL 运行大小写敏感的搜索时，每个字母的小写将排在大写之前：SELECT * FROM sample ORDER BY s COLLATE utf8mb4_0900_as_cs; +-----------+ | s | +-----------+ | aaaaa | | AAAAA | | bbbbb | | BBBBB | | ccccc | | CCCCC | +-----------+ 而按二进制排序方式将返回所有大写的值，然后再返回小写的值：SELECT * FROM sample ORDER BY s COLLATE utf8mb4_0900_bin; +-----------+ | s | +-----------+ | AAAAA | | ccccc | | bbbbb | | BBBBB | | aaaaa | | CCCCC | +-----------+ 如果你想知道一个字符串使用哪种字符集和排序，你可以使用被恰当命名的 charset 和 collation 函数。运行 MySQL 8.0 或更高版本的服务器将默认使用 utf8mb4 字符集和 utf8mb4_0900_ai_ci 排序：SELECT charset('data'); +-------------------+ | charset('data') | +-------------------+ | utf8mb4 | +-------------------+ SELECT collation('data'); +--------------------+ | collation('data') | +--------------------+ | utf8mb4_0900_ai_ci | +--------------------+ 你可以使用 SET NAMES 命令来改变所使用的字符集或排序方式。要从 utf8mb4 字符集改为 utf16，运行这个命令：SET NAMES 'utf16'; 如果你想选择默认以外的排序方式，你可以在 SET NAMES 命令中添加一个 COLLATE 子句。例如，假设你的数据库存储西班牙语的单词。MySQL 的默认排序（utf8mb4_0900_ai_ci）将 ch 和 ll 视为两个不同的字符，并将它们排序。但在西班牙语中，ch 和 ll 是单独的字母，所以如果你想让它们按正确的顺序排序（分别排在 c 和 l 之后），你需要使用不同的排序。一个选择是使用 utf8mb4_spanish2_ci 排序方式：SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish2_ci'; 储存字符串MySQL 允许你为你的字符串值选择不同的数据类型。（甚至比其他流行的数据库，如 PostgreSQL 和 MongoDB 更多。）下面是 MySQL 的二进制字符串数据类型的列表、它们的非二进制对应物，以及它们的最大长度：binary：char（255）varbinary：varchar（65,535）tinyblob：tinytext（255）blob：text（65,535）mediumblob：mediumtext（16,777,215）longblob：longtext（4,294,967,295）要记住的一件重要事情是，与被存储在可变长度的字段中的 varbinary、varchar、text 和 blob 类型不同（也就是说，只使用需要的空间），MySQL 将二进制（binary）和字符（char）类型存储在固定长度的字段。因此，像 char(20) 或 binary(20) 这样的值将总是占用 20 个字节，即使你在其中存储了少于 20 个字符。对于二进制类型，MySQL用 ASCII NUL 值（0x00）填充这些值，对于 字符类型，用空格填充。在选择数据类型时要考虑的另一件事是，你是否希望在字符串后面的空格被保留或剥离。在显示数据时，MySQL 会从以字符数据类型存储的数据中剥离空格，但不会剥离 varchar 的空格。CREATE TABLE sample2 (s1 CHAR(10), s2 VARCHAR(10)); INSERT INTO sample2 (s1, s2) VALUES ('cat ', 'cat '); SELECT s1, s2, CHAR_LENGTH(s1), CHAR_LENGTH(s2) FROM sample2; +---------+---------+-----------------------------------+ | s1 | s2 | CHAR_LENGTH(s1) | CHAR_LENGTH(s2) | +---------+---------+-----------------------------------+ | cat | cat | 3 | 10 | +---------+---------+-----------------------------------+ 总结字符串是数据库中最常用的数据类型之一，而 MySQL 仍然是当今最流行的数据库系统之一。我希望你能从这篇文章中学到一些新的东西，并能用你的新知识来提高你的数据库技能。via: https://opensource.com/article/23/1/strings-mysql作者：Hunter Coleman 选题：lkxed 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
硬核观察 #655 智能手机将在三年内扼杀单反相机
智能手机将在三年内扼杀单反相机索尼半导体解决方案 CEO 在会议上称，手机的静止图像预计将在 2024 年超过可换镜头相机的图像质量。这包括无反光镜相机，以及现代基本上放弃的老式单反相机。智能手机摄像技术远未达到技术天花板，预计将继续其成像技术的演变，而对大多数人来说，独立的相机是多余的。索尼在全球手机图像传感器市场上占有 42% 的份额。消息来源：techradar老王点评：确实，我有多久没拿出来相机了？除了给它的电池充一下电？没想到打败相机的不是更先进的相机，却是手机。同样已经被或即将被手机消灭的设备有哪些呢？苹果称其应用商店阻止了价值 15 亿美元的欺诈交易根据苹果两年来发布的预防欺诈分析报告称，苹果在 2020 年和 2021 年各阻止了 15 亿美元的欺诈交易。并且，苹果还成功地打击了各类有问题的应用程序，它在 2020 年和 2021 年分别阻止了 100 万和 160 万个应用。苹果还因欺诈活动终止了 80 万个开发者账户，因类似理由拒绝了 15 万个账户。消息来源：9to5mac老王点评：不得不说，苹果在商店的管理上还是下了不少功夫，相对安卓商店，无论是谷歌的还是第三方的，我更信任苹果商店。360 万台 MySQL 服务器暴露于互联网上网络安全研究组织扫描发现，有近 360 万台 MySQL 服务器在使用默认的 3306 号 TCP 端口暴露在互联网上。其中 IPv4 地址约 230 万台，IPv6 地址约 130 台。按国家划分，这些可以轻松访问的 IPv4 MySQL 服务器数量如下：美国（74 万）、中国（30 万）、波兰（21 万）和德国（17 万）。而对于 IPv6 则是：美国（46 万）、荷兰（30 万）、新加坡（22 万）和德国（17 万）。不知道什么原因，没有统计到中国 IPv6 的 MySQL 服务器。消息来源：shadowserver老王点评：我只能说这些都是自找的，连最最起码安全措施都没有。
阅读本文并下载我们的免费备忘单，去使用开源的数据库吧。当你写一个程序或配置一个服务时，你最终都要持久化存储信息。有时候，你只需要一个 INI 或者 YAML 配置文件就够了。而有时候，一个自定义格式的 XML 或者 JSON 或其他类似的文件会更好。但也有时候你需要校验输入、快速查询信息、关联数据、通常还要熟练地处理你的用户的请求。这就是设计数据库的目的，而 MariaDB（由 MySQL 的原始开发人员开发的一个分支） 是一个极佳的选项。在本文中我使用的是 MariaDB，但这些信息同样适用于 MySQL。通过编程语言与数据库进行交互是很普遍的。正因如此，出现了大量 Java、Python、Lua、PHP、Ruby、C++ 和其他语言的 SQL 库。然而，在使用这些库之前，理解数据库引擎做了什么以及为什么选择数据库是重要的对我们会很有帮助。本文介绍 MariaDB 和 mysql 命令来帮助你熟悉数据库处理数据的基本原理。如果你还没有安装 MariaDB，请查阅我的文章 在 Linux 上安装 MariaDB。如果你没有使用 Linux，请参照 MariaDB 下载页面提供的指导方法。与 MariaDB 交互你可以使用 mysql 命令与 MariaDB 进行交互。首先使用子命令 ping 确认你的服务是运行着的，在提示后输入密码：$ mysqladmin -u root -p ping Enter password: mysqld is alive 为了易于读者理解，打开一个交互式的 MariaDB 会话：$ mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. [...] Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> 你现在是在一个 MariaDB 子 shell 中，提示符是 MariaDB 提示符。普通的 Bash 命令在这里不能使用，只能用 MariaDB 命令。输入 help （或 ?）查看命令列表。这些是你的 MariaDB shell 的管理命令，使用它们可以定制你的 shell，但它们不属于 SQL 语言。学习 SQL 基本知识结构化查询语言是基于它们的能力定义的：一种通过有规则且一致的语法来查询数据库中的内容以得到有用的结果的方法。SQL 看起来像是普通的英文语句，有一点点生硬。例如，如果你登入数据库服务器，想查看有哪些库，输入 SHOW DATABASES; 并回车就能看到结果。SQL 命令以分号作为结尾。如果你忘记输入分号，MariaDB 会认为你是想在下一行继续输入你的查询命令，在下一行你可以继续输入命令也可以输入分号结束命令。MariaDB [(NONE)]> SHOW DATABASES; +--------------------+ | DATABASE | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 ROWS IN SET (0.000 sec) 上面的例子显示当前有四个数据库：information_schema、mysql、performance_schema 和 test。你必须指定 MariaDB 使用哪个库，才能对该库使用查询语句。指定数据库的命令是 use。当你选择了一个库后，MariaDB 提示框会切换为选择的库。MariaDB [(NONE)]> USE test; MariaDB [(test)]> 显示数据库的表数据库里有表，与电子表格类似：有一系列的行（在数据库中称为记录）和列。一个行和一个列唯一确定一个字段。查看一个数据库中可用的表（可以理解为多表单电子表格中的一页），使用 SQL 关键字 SHOW：MariaDB [(test)]> SHOW TABLES; empty SET test 数据库是空的，所以使用 use 命令切换到 mysql 数据库：MariaDB [(test)]> USE mysql; MariaDB [(mysql)]> SHOW TABLES; +---------------------------+ | Tables_in_mysql | +---------------------------+ | column_stats | | columns_priv | | db | [...] | time_zone_transition_type | | transaction_registry | | USER | +---------------------------+ 31 ROWS IN SET (0.000 sec) 这个数据库中有很多表！mysql 数据库是这个 MariaDB 实例的系统管理数据库。它里面包含重要数据，比如用来管理数据库权限的用户结构。这个数据库很重要，你不需要经常直接与它交互，但是使用 SQL 脚本来操作它却很常见。当你学习 MariaDB 时理解 mysql 数据库很有用，因为它有助于说明一些基本的 SQL 命令。检查一个表这个实例的 mysql 数据库的最后一个表名为 USER。这个表包含了可以访问这个数据库的用户。当前里面只有一个 root 用户，但是你可以添加不同权限的用户，赋予它们查看、更新或创建数据的权限。你可以查看一个表的列首来了解一个 MariaDB 用户的所有属性：> SHOW COLUMNS IN USER; MariaDB [mysql]> SHOW COLUMNS IN USER; +-------------+---------------+------+-----+----------+ | FIELD | TYPE | NULL | KEY | DEFAULT | +-------------+---------------+------+-----+----------+ | Host | CHAR(60) | NO | PRI | | | USER | CHAR(80) | NO | PRI | | | Password | CHAR(41) | NO | | | | Select_priv | enum('N','Y') | NO | | N | | Insert_priv | enum('N','Y') | NO | | N | | Update_priv | enum('N','Y') | NO | | N | | Delete_priv | enum('N','Y') | NO | | N | | Create_priv | enum('N','Y') | NO | | N | | Drop_priv | enum('N','Y') | NO | | N | [...] 47 ROWS IN SET (0.001 sec) 创建一个新的用户不论你是否需要一个普通的账号来管理数据库或者为计算机配置数据库（例如安装 WordPress、Drupal 或 Joomla时），在 MariaDB 中多建一个用户账号是很普遍的。你可以通过向 mysql 数据库的 USER 表中添加一个用户或使用 SQL 关键字 CREATE 来提示 MariaDB 创建一个 MariaDB 用户。使用 CREATE 来创建新用户会默认执行一些有用的方法，因此你不需要手动生成所有的信息：> CREATE USER 'tux'@'localhost' IDENTIFIED BY 'really_secure_password'; 查看表的字段你可以使用 SELECT 关键字来查看数据库表的字段和值。这本例中，你创建了一个名为 tux 的用户，因此查询 USER 表中的列：> SELECT USER,host FROM USER; +------+------------+ | USER | host | +------+------------+ | root | localhost | [...] | tux | localhost | +------+------------+ 7 ROWS IN SET (0.000 sec) 为一个用户赋予权限通过查看 USER 表列出的信息，你可以看到用户的状态。例如，新用户 tux 对这个数据库没有任何权限。使用 WHERE 语句你可以只查 tux 那一条记录。> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; +------+-------------+-------------+-------------+ | USER | select_priv | insert_priv | update_priv | +------+-------------+-------------+-------------+ | tux | N | N | N | +------+-------------+-------------+-------------+ 使用 GRANT 命令修改用户的权限：> GRANT SELECT ON *.* TO 'tux'@'localhost'; > FLUSH PRIVILEGES; 验证你的修改：> SELECT USER,select_priv,insert_priv,update_priv FROM USER WHERE USER='tux'; +------+-------------+-------------+-------------+ | USER | select_priv | insert_priv | update_priv | +------+-------------+-------------+-------------+ | tux | Y | N | N | +------+-------------+-------------+-------------+ tux 用户现在有了从所有表中查询记录的权限。创建自定义的数据库到目前为止，你一直在与默认的数据库进行交互。除了用户管理，大部分人很少会与默认的数据库进行交互。通常，你会用自定义的数据来填充创建的数据库。创建一个 MariaDB 数据库你可能已经可以自己在 MariaDB 中创建新数据库了。创建数据库跟新建用户差不多。> CREATE DATABASE example; Query OK, 1 ROW affected (0.000 sec) > SHOW DATABASES; +--------------------+ | DATABASE | +--------------------+ | example | [...] 使用 use 命令来把这个新建的数据库作为当前使用的库：> USE example; 创建一个表创建表比创建数据库要复杂，因为你必须定义列首。MariaDB 提供了很多方便的函数，可以用于创建列，引入数据类型定义，自增选项，对空值的约束，自动时间戳等等。下面是用来描述一系列用户的一个简单的表：> CREATE TABLE IF NOT EXISTS member ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> name VARCHAR(128) NOT NULL, -> startdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP); Query OK, 0 ROWS affected (0.030 sec) 这个表通过使用一个自动递增的方法来唯一标识每一行。表示用户名字的字段不能为空（或 null），每一行被创建时会自动生成时间戳。使用 SQL 关键字 INSERT 向这个表填充一些示例数据：> INSERT INTO member (name) VALUES ('Alice'); Query OK, 1 ROW affected (0.011 sec) > INSERT INTO member (name) VALUES ('Bob'); Query OK, 1 ROW affected (0.011 sec) > INSERT INTO member (name) VALUES ('Carol'); Query OK, 1 ROW affected (0.011 sec) > INSERT INTO member (name) VALUES ('David'); Query OK, 1 ROW affected (0.011 sec) 验证一下表里的数据：> SELECT * FROM member; +----+-------+---------------------+ | id | name | startdate | +----+-------+---------------------+ | 1 | Alice | 2020-10-03 15:25:06 | | 2 | Bob | 2020-10-03 15:26:43 | | 3 | Carol | 2020-10-03 15:26:46 | | 4 | David | 2020-10-03 15:26:51 | +----+-------+---------------------+ 4 ROWS IN SET (0.000 sec) 同时增加多行数据再创建一个表：> CREATE TABLE IF NOT EXISTS linux ( -> id INT AUTO_INCREMENT PRIMARY KEY, -> distro VARCHAR(128) NOT NULL); Query OK, 0 ROWS affected (0.030 sec) 填充一些示例数据，这次使用 VALUES 快捷方式，这样你可以一次添加多行数据。VALUES 关键字需要一个用括号包围的列表作为参数，也可以用逗号分隔的多个列表作为参数。> INSERT INTO linux (distro) -> VALUES ('Slackware'), ('RHEL'),('Fedora'),('Debian'); Query OK, 4 ROWS affected (0.011 sec) Records: 4 Duplicates: 0 Warnings: 0 > SELECT * FROM linux; +----+-----------+ | id | distro | +----+-----------+ | 1 | Slackware | | 2 | RHEL | | 3 | Fedora | | 4 | Debian | +----+-----------+ 关联多个表现在你有两个表，之间没有关联。两个表的数据是独立的，但是你可能需要表一中的一个值来识别表二的记录。你可以在表一中新增一列对应表二中的值。因为两个表都有唯一的标识符（自动递增的 id 字段），关联的它们的最简单的方式是，使用表一中的 id 字段作为表二的查询条件。在表一中创建一列用来表示表二中的一个值：> ALTER TABLE member ADD COLUMN (os INT); Query OK, 0 ROWS affected (0.012 sec) Records: 0 Duplicates: 0 Warnings: 0 > DESCRIBE member; DESCRIBE member; +-----------+--------------+------+-----+---------+------+ | FIELD | TYPE | NULL | KEY | DEFAULT | Extra| +-----------+--------------+------+-----+---------+------+ | id | INT(11) | NO | PRI | NULL | auto_| | name | VARCHAR(128) | NO | | NULL | | | startdate | TIMESTAMP | NO | | cur[...]| | | os | INT(11) | YES | | NULL | | +-----------+--------------+------+-----+---------+------+ 把 linux 表中的唯一 ID 分配给每个成员。因为记录已经存在，使用 UPDATE 关键字而不是 INSERT。尤其是当你想查询某行然后再更新某列值时。语法上，表达方式有点倒装，先更新后查询：> UPDATE member SET os=1 WHERE name='Alice'; Query OK, 1 ROW affected (0.007 sec) ROWS matched: 1 Changed: 1 Warnings: 0 要填充数据，请对其他名字重复执行这个过程。为了数据的多样性，在四行记录中分配三个不同的值。连接表现在这两个表彼此有了关联，你可以使用 SQL 来展示关联的数据。数据库中有很多种连接方式，你可以尽请尝试。下面的例子是关联 member 表中 os 字段和 linux 表中 id 字段：SELECT * FROM member JOIN linux ON member.os=linux.id; +----+-------+---------------------+------+----+-----------+ | id | name | startdate | os | id | distro | +----+-------+---------------------+------+----+-----------+ | 1 | Alice | 2020-10-03 15:25:06 | 1 | 1 | Slackware | | 2 | Bob | 2020-10-03 15:26:43 | 3 | 3 | Fedora | | 4 | David | 2020-10-03 15:26:51 | 3 | 3 | Fedora | | 3 | Carol | 2020-10-03 15:26:46 | 4 | 4 | Debian | +----+-------+---------------------+------+----+-----------+ 4 ROWS IN SET (0.000 sec) 连接 os 和 id 字段。在图形化的应用中，你可以想象 os 字段可以在下拉菜单中设置，值的来源是 linux 表中的 distro 字段。通过使用多个表中独立却有关联的数据，你可以保证数据的一致性和有效性，使用 SQL 你可以动态地关联它们。下载 MariaDB 和 MySQL 备忘单MariaDB 是企业级的数据库。它是健壮、强大、高效的数据库引擎。学习它是你向管理 web 应用和编写语言库迈出的伟大的一步。你可以下载 MariaDB 和 MySQL 备忘单，在你使用 MariaDB 时可以快速参考。via: https://opensource.com/article/20/10/mariadb-mysql-cheat-sheet作者：Seth Kenlon 选题：lujun9972 译者：lxbwolf 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
开始在 Linux 系统上使用开源的 SQL 数据库吧。MariaDB 和 MySQL 都是使用 SQL 的开源数据库，并且共享相同的初始代码库。MariaDB 是 MySQL 的替代品，你可以使用相同的命令（mysql）与 MySQL 和 MariaDB 数据库进行交互。因此，本文同时适用于 MariaDB 和 MySQL。安装 MariaDB你可以使用你的 Linux 发行版的包管理器安装 MariaDB。在大多数发行版上，MariaDB 分为服务器包和客户端包。服务器包提供了数据库“引擎”，即 MariaDB 在后台运行（通常在物理服务器上）的部分，它监听数据输入或数据输出请求。客户端包提供了 mysql 命令，你可以用它来与服务器通信。在 RHEL、Fedora、CentOS 或类似的发行版上：$ sudo dnf install mariadb mariadb-server 在 Debian、Ubuntu、Elementary 或类似的发行版上：$ sudo apt install mariadb-client mariadb-server 其他操作系统可能会以不同的打包系统封装 MariaDB，所以你可能需要搜索你的软件仓库来了解你的发行版的维护者是如何提供它的。启动 MariaDB因为 MariaDB 被设计为部分作为数据库服务器，它可以在一台计算机上运行，并从另一台计算机上进行管理。只要你能访问运行它的计算机，你就可以使用 mysql 命令来管理数据库。在写这篇文章时，我在本地计算机上运行了 MariaDB，但你同样可与远程系统上托管的 MariaDB 数据库进行交互。在启动 MariaDB 之前，你必须创建一个初始数据库。在初始化其文件结构时，你应该定义你希望 MariaDB 使用的用户。默认情况下，MariaDB 使用当前用户，但你可能希望它使用一个专用的用户帐户。你的包管理器可能为你配置了一个系统用户和组。使用 grep 查找是否有一个 mysql 组：$ grep mysql /etc/group mysql:x:27: 你也可以在 /etc/passwd 中寻找这个专门的用户，但通常情况下，有组就会有用户。如果没有专门的 mysql 用户和组，可以在 /etc/group 中寻找一个明显的替代品（比如 mariadb）。如果没有，请阅读你的发行版文档来了解 MariaDB 是如何运行的。假设你的安装使用 mysql，初始化数据库环境：$ sudo mysql_install_db --user=mysql Installing MariaDB/MySQL system tables in '/var/lib/mysql'... OK [...] 这一步的结果显示了接下来你必须执行的配置 MariaDB 的任务：PLEASE REMEMBER TO SET A PASSWORD FOR THE MariaDB root USER ! To do so, start the server, then issue the following commands: '/usr/bin/mysqladmin' -u root password 'new-password' '/usr/bin/mysqladmin' -u root -h $(hostname) password 'new-password' Alternatively you can run: '/usr/bin/mysql_secure_installation' which will also give you the option of removing the test databases and anonymous user created by default. This is strongly recommended for production servers. 使用你的发行版的初始化系统启动 MariaDB：$ sudo systemctl start mariadb 在启动时启用 MariaDB 服务器：$ sudo systemctl enable --now mariadb 现在你已经有了一个 MariaDB 服务器，为它设置一个密码：mysqladmin -u root password 'myreallysecurepassphrase' mysqladmin -u root -h $(hostname) password 'myreallysecurepassphrase' 最后，如果你打算在生产服务器上使用它，请在上线前运行 mysql_secure_installation 命令。via: https://opensource.com/article/20/10/mariadb-mysql-linux作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在 Linux 上检查 MySQL/MariaDB 数据库正常运行时间的三种方法
我们都知道在 Linux 中使用 uptime 命令的目的。它用于检查 Linux 系统的正常运行时间以及系统上次启动以来运行的时间。而 Linux 管理员的工作是保持系统正常运行。如果要检查 Linux 上的其他服务（例如 Apache、MySQL、MariaDB、sftp 等）运行了多长时间，该怎么做？每个服务都有自己的命令来检查服务的正常运行时间。但是你也可以为此使用其他命令。方法 1：如何使用 ps 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间ps 命令的意思是 进程状态 process status 。这是最基本的命令之一，它显示了系统正在运行的进程的详细信息。为此，你首先需要使用 pidof 命令查找 MySQL/MariaDB 的 PID。# pidof mysqld | cut -d" " -f1 2412获取 MySQL/MariaDB 的 PID 后，请在 ps 命令中使用 --etime 选项获得正常运行时间。--etime：自进程启动以来经过的时间，形式为 [[DD-]hh:]mm:ss。# ps -p 2412 -o etime ELAPSED 2-08:49:30或者，在 ps 命令中使用 --lstart 选项来获取指定 PID 的正常运行时间。# ps -p 2412 -o lstart STARTED Sat May 2 03:02:15 2020MySQL/MariaDB 进程已经运行了 2 天 03 小时 02 分 15 秒。方法 2：如何使用 systemctl 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间systemctl 命令用于控制 systemd 系统和服务管理器。systemd 是新的初始化系统和系统管理器，现在大多数 Linux 发行版都淘汰了传统的 SysVinit 管理器而采用了 systemd。# systemctl status mariadb 或者 # systemctl status mysql ● mariadb.service - MariaDB 10.1.44 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/mariadb.service.d └─migrated-from-my.cnf-settings.conf Active: active (running) since Sat 2020-05-02 03:02:18 UTC; 2 days ago Docs: man:mysqld(8) https://mariadb.com/kb/en/library/systemd/ Process: 2448 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Process: 2388 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=/usr/bin/galera_recovery; [ $? -eq 0 ] && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS) Process: 2386 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS) Main PID: 2412 (mysqld) Status: "Taking your SQL requests now…" CGroup: /system.slice/mariadb.service └─2412 /usr/sbin/mysqld May 03 21:41:26 ns2.2daygeek.com mysqld[2412]: 2020-05-03 21:41:26 140328136861440 [Warning] Host name '1.1.1.1' could not be resolved: … not known May 04 02:00:46 ns2.2daygeek.com mysqld[2412]: 2020-05-04 2:00:46 140328436418304 [Warning] IP address '1.1.1.1' has been resolved to the host name '2…ss itself. May 04 03:01:31 ns2.2daygeek.com mysqld[2412]: 2020-05-04 3:01:31 140328436111104 [Warning] IP address '1.1.1.1' could not be resolved: Temporary fai…resolution May 04 04:03:06 ns2.2daygeek.com mysqld[2412]: 2020-05-04 4:03:06 140328136861440 [Warning] IP address '1.1.1.1' could not be resolved: Name or ser… not known May 04 07:23:54 ns2.2daygeek.com mysqld[2412]: 2020-05-04 7:23:54 140328435189504 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known May 04 08:03:31 ns2.2daygeek.com mysqld[2412]: 2020-05-04 8:03:31 140328436418304 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known May 04 08:25:56 ns2.2daygeek.com mysqld[2412]: 2020-05-04 8:25:56 140328135325440 [Warning] IP address '1.1.1.1' could not be resolved: Name or service not known Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable. Hint: Some lines were ellipsized, use -l to show in full.方法 3：如何使用 MySQLAdmin 命令在 Linux 上检查 MySQL/MariaDB 数据库的正常运行时间MySQLAdmin 是安装 MySQL 软件包时安装的 MySQL 服务器命令行程序。MySQLAdmin 客户端允许你在 MySQL 服务器上执行一些基本的管理功能。它用于创建数据库、删除数据库、设置 root 密码、更改 root 密码、检查 MySQL 状态、验证 MySQL 功能、监视 mysql 进程以及验证服务器的配置。# mysqladmin -u root -pPassword version mysqladmin Ver 8.42 Distrib 5.7.27, for Linux on x86_64 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 5.7.27 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 1 day 10 hours 44 min 13 secvia: https://www.2daygeek.com/check-mysql-mariadb-database-server-uptime-linux/作者：Magesh Maruthamuthu 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
本教程教你如何在基于 Ubuntu 的 Linux 发行版上安装 MySQL。对于首次使用的用户，你将会学习到如何验证你的安装和第一次怎样去连接 MySQL。MySQL 是一个典型的数据库管理系统。它被用于许多技术栈中，包括流行的 LAMP) （Linux、Apache、MySQL、PHP）技术栈。它已经被证实了其稳定性。另一个让 MySQL 受欢迎的原因是它是开源的。MySQL 是关系型数据库（基本上是表格数据）。以这种方式它很容易去存储、组织和访问数据。它使用SQL（结构化查询语言）来管理数据。这这篇文章中，我将向你展示如何在 Ubuntu 18.04 安装和使用 MySQL 8.0。让我们一起来看看吧！在 Ubuntu 上安装 MySQL我将会介绍两种在 Ubuntu 18.04 上安装 MySQL 的方法：从 Ubuntu 仓库上安装 MySQL。非常简单，但不是最新版（5.7）从官方仓库安装 MySQL。你将额外增加一些步处理过程，但不用担心。你将会拥有最新版的MySQL（8.0）有必要的时候，我将会提供屏幕截图去引导你。但这篇文章中的大部分步骤，我将直接在终端（默认热键： CTRL+ALT+T）输入命令。别害怕！方法 1、从 Ubuntu 仓库安装 MySQL首先，输入下列命令确保你的仓库已经被更新：sudo apt update现在，安装 MySQL 5.7，简单输入下列命令：sudo apt install mysql-server -y就是这样！简单且高效。方法 2、使用官方仓库安装 MySQL虽然这个方法多了一些步骤，但我将逐一介绍，并尝试写下清晰的笔记。首先浏览 MySQL 官方网站的下载页面。在这里，选择 DEB 软件包，点击“Download”链接。滑到有关于 Oracle 网站信息的底部，右键 “No thanks, just start my download.”，然后选择 “Copy link location”。现在回到终端，我们将使用 Curl 命令去下载这个软件包：curl -OL https://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.debhttps://dev.mysql.com/get/mysql-apt-config_0.8.12-1_all.deb 是我刚刚从网页上复制的链接。根据当前的 MySQL 版本，它有可能不同。让我们使用 dpkg 去开始安装 MySQL：sudo dpkg -i mysql-apt-config*更新你的仓库：sudo apt update要实际安装 MySQL，我们将使用像第一个方法中同样的命令来安装：sudo apt install mysql-server -y这样做会在你的终端中打开包配置的提示。使用向下箭头选择“Ok”选项。点击回车。这应该会提示你输入密码：这是在为 MySQL 设置 root 密码。不要与 Ubuntu 的 root 密码混淆。输入密码然后点击 Tab 键去选择“Ok“。点击回车键，你将重新输入密码。操作完之后，再次键入 Tab 去选择 “Ok”。按下回车键。将会展示一些关于 MySQL Server 的配置信息。再次按下 Tab 去选择 “Ok” 和按下回车键：这里你需要去选择默认验证插件。确保选择了“Use Strong Password Encryption”。按下 Tab 键和回车键。就是这样！你已经成功地安装了 MySQL。验证你的 MySQL 安装要验证 MySQL 已经正确安装，使用下列命令：sudo systemctl status mysql.service这将展示一些关于 MySQL 服务的信息：你应该在那里看到 “Active: active (running)”。如果你没有看到，使用下列命令去开始这个服务：sudo systemctl start mysql.service配置/保护 MySQL对于刚安装的 MySQL，你应该运行它提供的安全相关的更新命令。就是：sudo mysql_secure_installation这样做首先会询问你是否想使用 “ 密码有效强度 validate password component ”。如果你想使用它，你将必须选择一个最小密码强度（0 – 低，1 – 中，2 – 高）。你将无法输入任何不遵守所选规则的密码。如果你没有使用强密码的习惯（本应该使用），这可能会配上用场。如果你认为它可能有帮助，那你就键入 y 或者 Y，按下回车键，然后为你的密码选择一个强度等级和输入一个你想使用的密码。如果成功，你将继续强化过程；否则你将重新输入一个密码。但是，如果你不想要此功能（我不会），只需按回车或任何其他键即可跳过使用它。对于其他选项，我建议开启它们（对于每一步输入 y 或者 Y 和按下回车）。它们（依序）是：“ 移除匿名用户 remove anonymous user ”，“ 禁止 root 远程登录 disallow root login remotely ”，“ 移除测试数据库及其访问 remove test database and access to it ”。“ 重新载入权限表 reload privilege tables now ”。链接与断开 MySQL Server为了运行 SQL 查询，你首先必须使用 MySQL 连到服务器并在 MySQL 提示符使用。执行此操作的命令是：mysql -h host_name -u user -p-h 用来指定一个主机名（如果这个服务被安装到其他机器上，那么会有用；如果没有，忽略它）-u 指定登录的用户-p 指定你想输入的密码.虽然出于安全原因不建议，但是你可以在命令行最右边的 -p 后直接输入密码。例如，如果用户test_user 的密码是 1234，那么你可以在你使用的机器上尝试去连接，你可以这样使用：mysql -u test_user -p1234如果你成功输入了必要的参数，你将会收到由 MySQL shell 提示符提供的欢迎（mysql >）：要从服务端断开连接和离开 MySQL 提示符，输入：QUIT输入 quit （MySQL 不区分大小写）或者 \q 也能工作。按下回车退出。你使用简单的命令也能输出关于版本的信息：sudo mysqladmin -u root version -p如果你想看命令行选项列表，使用：mysql --help卸载 MySQL如果您决定要使用较新版本或只是想停止使用 MySQL。首先，关闭服务：sudo systemctl stop mysql.service && sudo systemctl disable mysql.service确保你备份了你的数据库，以防你之后想使用它们。你可以通过运行下列命令卸载 MySQL：sudo apt purge mysql*清理依赖：sudo apt autoremove小结在这篇文章中，我已经介绍如何在 Ubuntu Linux 上安装 Mysql。我很高兴如果这篇文章能帮助到那些正为此挣扎的用户或者刚刚开始的用户。如果你发现这篇文章是一个很有用的资源，在评论里告诉我们。你为了什么使用 MySQL? 我们渴望收到你的任何反馈、印象和建议。感谢阅读，并毫不犹豫地尝试这个很棒的工具！via: https://itsfoss.com/install-mysql-ubuntu/作者：Sergiu 选题：lujun9972 译者：arrowfeng 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
几个月前，我在Ubuntu 18.04 上安装了 LAMP。今天，我尝试以 root 用户身份登录数据库，但我完全忘记了密码。经过一阵 Google 搜索并浏览一些文章后，我成功重置了密码。对于那些想知道如何做到这一点的人，这个简短的教程解释了如何在类 Unix 操作系统中重置 MySQL 或 MariaDB Root 密码。重置 MySQL 或 MariaDB Root 密码首先，停止数据库。如果你使用 MySQL，请输入以下命令并下按回车键。$ sudo systemctl stop mysql对于 MariaDB：$ sudo systemctl stop mariadb接下来，使用以下命令在没有权限检查的情况下重新启动数据库：$ sudo mysqld_safe --skip-grant-tables &这里， --skip-grant-tables 选项让你在没有密码和所有权限的情况下进行连接。如果使用此选项启动服务器，它还会启用 --skip-networking 选项，这用于防止其他客户端连接到数据库服务器。并且，& 符号用于在后台运行命令，因此你可以在以下步骤中输入其他命令。请注意，上述命令很危险，并且你的数据库会变得不安全。你应该只在短时间内运行此命令以重置密码。接下来，以 root 用户身份登录 MySQL/MariaDB 服务器：$ mysql在 mysql > 或 MariaDB [(none)] > 提示符下，运行以下命令重置 root 用户密码：UPDATE mysql.user SET Password=PASSWORD('NEW-PASSWORD') WHERE User='root';使用你自己的密码替换上述命令中的 NEW-PASSWORD。然后，输入以下命令退出 mysql 控制台。FLUSH PRIVILEGES; exit最后，关闭之前使用 --skip-grant-tables 选项运行的数据库。为此，运行：$ sudo mysqladmin -u root -p shutdown系统将要求你输入在上一步中设置的 MySQL/MariaDB 用户密码。现在，使用以下命令正常启动 MySQL/MariaDB 服务：$ sudo systemctl start mysql对于 MariaDB：$ sudo systemctl start mariadb使用以下命令验证密码是否确实已更改：$ mysql -u root -p今天就是这些了。还有更多好东西。敬请期待！干杯!via: https://www.ostechnix.com/how-to-reset-mysql-or-mariadb-root-password/作者：SK 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
MySQL 文档存储 可以跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作，直接存储数据。MySQL 可以提供 NoSQL JSON 文档存储 Document Store 了，这样开发者保存数据前无需 规范化 normalize 数据、创建数据库，也无需在开发之前就制定好数据样式。从 MySQL 5.7 版本和 MySQL 8.0 版本开始，开发者可以在表的一列中存储 JSON 文档。由于引入 X DevAPI，你可以从你的代码中移除令人不爽的结构化查询字符串，改为使用支持现代编程设计的 API 调用。系统学习过结构化查询语言（SQL）、 关系理论 relational theory 、 集合 set 和其它关系数据库底层理论的开发者并不多，但他们需要一个安全可靠的数据存储。如果数据库管理人员不足，事情很快就会变得一团糟，MySQL 文档存储 允许开发者跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作，直接存储数据。只需创建一个 JSON 文档集合 document collection ，接着就可以使用了。JSON 数据类型所有这一切都基于多年前 MySQL 5.7 引入的 JSON 数据类型。它允许在表的一行中提供大约 1GB 大小的列。数据必须是有效的 JSON，否则服务器会报错；但开发者可以自由使用这些空间。X DevAPI旧的 MySQL 协议已经历经差不多四分之一个世纪，已经显现出疲态，因此新的协议被开发出来，协议名为 X DevAPI。协议引入高级会话概念，允许代码从单台服务器扩展到多台，使用符合 通用主机编程语言样式 common host-language programming patterns 的非阻塞异步 I/O。需要关注的是如何遵循现代实践和编码风格，同时使用 CRUD （Create、 Read、 Update、 Delete）样式。换句话说，你不再需要在你精美、纯洁的代码中嵌入丑陋的 SQL 语句字符串。一个新的 shell 支持这种新协议，即所谓的 MySQL Shell。该 shell 可用于设置 高可用集群 high-availability cluster 、检查服务器 升级就绪状态 upgrade readiness 以及与 MySQL 服务器交互。支持的交互方式有以下三种：JavaScript，Python 和 SQL。代码示例下面的代码示例基于 JavaScript 方式使用 MySQL Shell，可以从 JS> 提示符看出。下面，我们将使用用户 dstokes 、密码 password 登录本地系统上的 demo 库。db 是一个指针，指向 demo 库。$ mysqlsh dstokes:password@localhost/demo JS> db.createCollection("example") JS> db.example.add( { Name: "Dave", State: "Texas", foo : "bar" } ) JS> 在上面的示例中，我们登录服务器，连接到 demo 库，创建了一个名为 example 的集合，最后插入一条记录；整个过程无需创建表，也无需使用 SQL。只要你能想象的到，你可以使用甚至滥用这些数据。这不是一种代码对象与关系语句之间的映射器，因为并没有将代码映射为 SQL；新协议直接与服务器层打交道。Node.js 支持新 shell 看起来挺不错，你可以用其完成很多工作；但你可能更希望使用你选用的编程语言。下面的例子使用 world_x 示例数据库，搜索 _id 字段匹配 CAN. 的记录。我们指定数据库中的特定集合，使用特定参数调用 find 命令。同样地，操作也不涉及 SQL。var mysqlx = require('@mysql/xdevapi'); mysqlx.getSession({ //Auth to server host: 'localhost', port: '33060', dbUser: 'root', dbPassword: 'password' }).then(function (session) { // use world_x.country.info var schema = session.getSchema('world_x'); var collection = schema.getCollection('countryinfo'); collection // Get row for 'CAN' .find("$._id == 'CAN'") .limit(1) .execute(doc => console.log(doc)) .then(() => console.log("\n\nAll done")); session.close(); }) 下面例子使用 PHP，搜索 _id 字段匹配 USA 的记录：<?PHP // Connection parameters $user = 'root'; $passwd = 'S3cret#'; $host = 'localhost'; $port = '33060'; $connection_uri = 'mysqlx://'.$user.':'.$passwd.'@'.$host.':'.$port; echo $connection_uri . "\n"; // Connect as a Node Session $nodeSession = mysql_xdevapi\getNodeSession($connection_uri); // "USE world_x" schema $schema = $nodeSession->getSchema("world_x"); // Specify collection to use $collection = $schema->getCollection("countryinfo"); // SELECT * FROM world_x WHERE _id = "USA" $result = $collection->find('_id = "USA"')->execute(); // Fetch/Display data $data = $result->fetchAll(); var_dump($data); ?> 可以看出，在上面两个使用不同编程语言的例子中，find 操作符的用法基本一致。这种一致性对跨语言编程的开发者有很大帮助，对试图降低新语言学习成本的开发者也不无裨益。支持的语言还包括 C、Java、Python 和 JavaScript 等，未来还会有更多支持的语言。从两种方式受益我会告诉你使用 NoSQL 方式录入的数据也可以用 SQL 方式使用？换句话说，我会告诉你新引入的 NoSQL 方式可以访问旧式关系型表中的数据？现在使用 MySQL 服务器有多种方式，作为 SQL 服务器，作为 NoSQL 服务器或者同时作为两者。via: https://opensource.com/article/18/6/mysql-document-store作者：Dave Stokes 选题：lujun9972 译者：pinewall 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出