025、SQL语句之建库和字符集

数据库

创建 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;
      这是⼀个⽆法撤消的操作

字符集和排序规则

  • 字符集 (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,即按照⼤⼩写来保存表名,按照⼩写来⽐较(不区分⼤⼩写)。

猜你喜欢

转载自blog.csdn.net/wangzhicheng987/article/details/130760378
今日推荐