数据库
创建 Schema/Database
CREATE DATABASE 用于创建数据库,并可以指定数据库的默认属性(如数据库默认字符集、排序规则)。
CREATE SCHEMA 和 CREATE DATABASE 操作效果一样。
- create database 语法
CREATE {
DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_specification] ...
create_specification:
[DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name
o CREATE DATABSAE [IF NOT EXISTS] database_name [options];
o CREATE SCHEMA [IF NOT EXISTS] schema_name [options];
- 使用mysql 创建
mysql
-u root \
-h {
host} \
-P {
port} \
-p {
password} \
-e "CREATE DATABASE IF NOT EXISTS bookshop;"
- 数据库里的对象命名只能使用英文字母、数字和下划线
o 名称不能超过 64 个字符
o 不能使用某些字符,包括 ASCII(0), ASCII(255), /, \, .
o 您可以使用保留字和特殊字符,但前提是使用反引号将其包围
- 删除数据库:
DROP DATABASE [IF EXISTS] database_name;
查看数据库
要查看集群中的数据库,可在命令⾏执⾏⼀条 SHOW DATABASES 语句:
mysql
-u root \
-h {
host} \
-P {
port} \
-p {
password} \
-e "SHOW DATABASES;"
运⾏结果为:
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| bookshop |
| mysql |
| test |
+--------------------+
数据库创建时应遵守的规则
- 遵循数据库命名规范,给你的数据库起⼀个有意义的名字。
- test 数据库是 TiDB 提供的⼀个默认数据库。如果没有必要,尽量不要在⽣产环境使⽤它。你可以⾃⾏使⽤ CREATE DATABASE 语句来创建数据库,并且在SQL 会话中使⽤ USE {databasename}; 语句来更改当前数据库。
- 使⽤ root ⽤户创建数据库、⻆⾊、⽤户等,并只赋予必要的权限。
- 作为通⽤的规则,不推荐使⽤ Driver、ORM 进⾏数据库模式的定义与更改。相反,请使⽤ MySQL 命令⾏客户端或其他你喜欢的 MySQL GUI 客户端来进⾏操作。
创建 Schema/Database
-
语法:
- CREATE DATABSAE [IF NOT EXISTS] database_name [options];
- CREATE SCHEMA [IF NOT EXISTS] schema_name [options];
-
数据库⾥的对象命名只能使⽤英⽂字⺟、数字和下划线
- 名称不能超过 64 个字符
- 不能使⽤某些字符,包括 ASCII(0), ASCII(255), /, , .
- 您可以使⽤保留字和特殊字符,但前提是使⽤反引号将其包围
- 数据库名建议按照业务、产品线或者其它指标进⾏区分,⼀般不要超过 20 个字符。
-
删除数据库:
- DROP DATABASE [IF EXISTS] database_name;
这是⼀个⽆法撤消的操作
- DROP DATABASE [IF EXISTS] database_name;
字符集和排序规则
- 字符集 (character set) 是符号与编码的集合。TiDB 中的默认字符集是 utf8mb4,与MySQL 8.0 及更⾼版本中的默认字符集匹配。排序规则 (collation) 是在字符集中比较字符以及字符排序顺序的规则。
• SHOW CHARACTER SET: 列出支持的字符集
• SHOW COLLATION: 列出支持的排序规则
- 默认排序规则
o CREATE DATABASE universe DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
tidb> SHOW COLLATION; #对应字符集的默认排序规则
+--------------------+---------+------+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+------+---------+----------+---------+
| ascii_bin | ascii | 65 | Yes | Yes | 1 |
| binary | binary | 63 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | | Yes | 1 |
| gbk_chinese_ci | gbk | 28 | Yes | Yes | 1 |
| latin1_bin | latin1 | 47 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | Yes | Yes | 1 |
| utf8_general_ci | utf8 | 33 | | Yes | 1 |
| utf8_unicode_ci | utf8 | 192 | | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 1 |
+--------------------+---------+------+---------+----------+---------+
11 rows in set (0.00 sec)
排序规则示例
- 排序规则 (collation) 是在字符集中⽐较字符以及字符排序顺序的规则。
tidb> select * from test.c1 order by name;
+------+
| name |
+------+
| A |
| B |
| C |
| a |
| b |
| c |
+------+
6 rows in set (0.00 sec)
tidb> select * from test.c1 order by name collate utf8mb4_unicode_ci;
+------+
| name |
+------+
| A |
| a |
| B |
| b |
| C |
| c |
+------+
6 rows in set (0.01 sec)
观察在排序规则为 utf8mb4_bin 和 utf8mb4_general_ci 情况下两个不同的结果:
tidb> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
Query OK, 0 rows affected (0.00 sec)
tidb> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
tidb> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 0 rows affected (0.00 sec)
tidb> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
| 1 |
+-----------+
1 row in set (0.01 sec)
是否区分大小写
- TiDB 以区分大小写的方式存储对象名,但以不区分大小写的方式进行比较
tidb> show variables like 'lower_case_%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | 1 |
| lower_case_table_names | 2 |
+------------------------+-------+
- TiDB 以区分⼤⼩写的⽅式存储对象名,但以不区分⼤⼩写的⽅式进⾏⽐较
tidb> show variables like 'lower_case_%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | 1 |
| lower_case_table_names | 2 |
+------------------------+-------+
- 示例
mysql> use test;
Database changed
mysql> create table t1(id int);
Query OK, 0 rows affected (0.62 sec)
mysql> create table T1(id int);
ERROR 1050 (42S01): Table 'test.T1' already exists
mysql> select count(*) from INFORMATION_SCHEMA.tables where table_name='t1';
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.02 sec)
mysql> select count(*) from INFORMATION_SCHEMA.tables where table_name='T1';
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
实际上T1 这张表不存在,但进行比较的时候由于不区分大小写,所以T1在比较的时候是认为存在的。
⽬前 TiDB 只⽀持将 lower-case-table-names 值设为 2,即按照⼤⼩写来保存表名,按照⼩写来⽐较(不区分⼤⼩写)。