标签 MySQL 下的文章

随着数据的飞速增长,数据的组织变得至关重要。本文将简要介绍当今软件开发中最流行的数据库。

在软件系统中,数据被格式化地组织和存储,通过数据库可以以电子方式访问它们。因为数据已经成为一种非常重要的资产,对我们来说,掌握当今使用的各种数据库的基本知识是非常重要的。

我们要看的第一个数据库是 MySQL。

MySQL

MySQL 官网

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

MariaDB

MariaDB 官网

MariaDB 是一款由 MySQL 的开发人员开发的开源关系型数据库,因其优秀的性能和与 MySQL 良好的兼容性而广受欢迎。它是当今大多数主要云产品的一部分,对其稳定性和性能起到重要作用。最近通过使用 Galera Cluster 技术,MariaDB 新增了集群功能。另外 MariaDB 还与 Oracle 数据库有(一定的)兼容性。

优点

  • 安装方便
  • 支持大数据操作
  • 高可扩展性
  • 易于导入数据

要在基于 Ubuntu 的计算机上安装并使用 MariaDB,请使用以下命令:

$sudo apt update
$sudo apt install mariadb-server
$sudo systemctl start mariadb.service

RethinkDB

RethinkDB 官网

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

OrientDB

OrientDB 官网

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

CouchDB

CouchDB 官网

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

Firebird

Firebird 官网

Firebird 是一个开源关系型数据库。它兼容所有操作系统,如 Linux、Windows 和 MacOS。它最初是从开源数据库 Interbase 派生而来的。

优点

  • 数据库功能不受限制
  • 非常稳定,功能强大
  • 配置和使用简单

以下命令可以帮助你在 Ubuntu 机器上使用 Firebird:

$sudo apt-get update
$sudo apt-get install firebird2.5-superclassic

Cassandra

Cassandra 官网

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

PostgreSQL

PostgreSQL 官网

如今,PostgreSQL 是最流行的开源关系数据库管理系统之一。它易于扩展,同时还与 SQL 兼容。这个数据库管理系统经过了 30 多年的积极开发。

优点

  • 与 MySQL 相比,Postgres 可以存储更多种类的数据
  • 支持几乎所有的 SQL 特性
  • 高度可扩展

下面的命令可以帮助你在 Ubuntu 机器上使用 PostgreSQL:

$sudo apt-get update
$sudo apt-get install postgresql postgresql-contrib

CockroachDB

CockroachDB 官网

CockroachDB 是一个为可靠性而生的数据库。它可以像 蟑螂 cockroach 一样在灾难性的情况下顽强生存、蓬勃发展。它可以处理大量的数据。还可以构建多集群数据库。

优点

  • 很容易部署
  • 高一致性
  • 分布式事务
  • 高可用性
  • 兼容 SQL

Redis

Redis 官网

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 中新建表时,选择合适的数据类型(INTFLOATCHAR 等)高效地保存插入到表中的数据。MySQL 为时间值提供了五种数据类型。它们是 DATETIMEDATETIMETIMESTAMPYEAR

MySQL 使用 ISO 8601 格式来存储以下格式的值(LCTT 译注:国际标准 ISO 8601,是国际标准化组织的日期和时间的表示方法,全称为《数据存储和交换形式·信息交换·日期和时间的表示方法》):

  • DATEYYYY-MM-DD
  • TIMEHH:MM:SS
  • TIMESTAMPYYYY-MM-DD HH:MM:SS
  • YEARYYYY

DATETIME 与 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_TIMESTAMPON 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。

另一件需要记住的重要事情是,尽管通常情况下,除非你声明一个默认值,否则 DATETIMETIMESTAMP 列都没有一个默认值,但这个规则有一个例外。如果没有指定 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 这两个子句,并且禁用 explicit_defaults_for_timestamp 这个变量,那么你表中的第一个 TIMESTAMP 列将被隐式创建。

要检查这个变量的状态,请运行:

mysql> show variables like 'explicit_default%';

如果你想打开或关闭它,运行这段代码(用 0 表示关闭,用 1 表示打开):

mysql> set explicit_defaults_for_timestamp = 0;

TIME

MySQL 的 时间 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 值(以及 DATETIMETIMESTAMP 字段的时间部分)从 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_ciai 表示该排序对音调不敏感( á = 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     |
+-----------+

如果你想知道一个字符串使用哪种字符集和排序,你可以使用被恰当命名的 charsetcollation 函数。运行 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)将 chll 视为两个不同的字符,并将它们排序。但在西班牙语中,chll 是单独的字母,所以如果你想让它们按正确的顺序排序(分别排在 cl 之后),你需要使用不同的排序。一个选择是使用 utf8mb4_spanish2_ci 排序方式:

SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish2_ci';

储存字符串

MySQL 允许你为你的字符串值选择不同的数据类型。(甚至比其他流行的数据库,如 PostgreSQL 和 MongoDB 更多。)

下面是 MySQL 的二进制字符串数据类型的列表、它们的非二进制对应物,以及它们的最大长度:

  • binarychar(255)
  • varbinaryvarchar(65,535)
  • tinyblobtinytext(255)
  • blobtext(65,535)
  • mediumblobmediumtext(16,777,215)
  • longbloblongtext(4,294,967,295)

要记住的一件重要事情是,与被存储在可变长度的字段中的 varbinaryvarchartextblob 类型不同(也就是说,只使用需要的空间),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中国 荣誉推出

智能手机将在三年内扼杀单反相机

索尼半导体解决方案 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_schemamysqlperformance_schematest。你必须指定 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)

连接 osid 字段。

在图形化的应用中,你可以想象 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 数据库吧。

MariaDBMySQL 都是使用 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中国 荣誉推出