暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Halo数据库之MySQL兼容性(3)--兼容的MySQL数据类型

原创 贾桂军 2023-11-24
15242

4.兼容的MySQL数据类型

SET类型

SET表示一个字符串对象,可以包含0个或多个成员,但成员个数的上限为64。设置字段值时,可以取取值范围内的 0 个或多个值。SET类型在存储数据时成员个数越多,其占用的存储空间越大。

目前在建表之前需要另行自定义“set”类型,并且将“set”类型定义为varchar,同时,自定义的“set”类型名称一定要以“set_”开头。

 

示例:

创建:

test=# CREATE DOMAIN set_test AS varchar;

CREATE DOMAIN

 

test=# CREATE TABLE set_1 (

test(#     id SERIAL PRIMARY KEY,

test(#     name VARCHAR(64) NOT NULL,

test(#     col3 set_test NOT NULL

test(# );

CREATE TABLE

 

插入数据:

mysql> INSERT INTO set_1(id, name, col3) VALUES(1, 'zhangsan1', 'A1,A2');

Query OK, 1 row affected (0.00 sec)

 

mysql> INSERT INTO set_1(id, name, col3) VALUES(2, 'zhangsan2', 'A1,B1');

Query OK, 1 row affected (0.00 sec)

 

查询结果:

mysql> SELECT * FROM set_1 where col3 = 'A1,A2' order by id;

+----+-----------+-------+

| id | name      | col3  |

+----+-----------+-------+

|  1 | zhangsan1 | A1,A2 |

+----+-----------+-------+

1 row in set (0.00 sec)

 

枚举类型

枚举类型规范数据本身,限定只能插入规定的数据项,直接转化成数字存储而不是字符串,节省存储空间,并且在表的.frm文件中存储“数字-字符串”之间的对应关系

在建表之前需要另行自定义枚举类型,同时,自定义的枚举类型名称一定要以“enum_”开头。

示例:

新建:

test=# CREATE TABLE enum_2 (

    id SERIAL PRIMARY KEY,

    name VARCHAR(64) NOT NULL,

    sex enum_sex NOT NULL

);

CREATE TABLE

 

新增数据:

mysql> INSERT INTO enum_2(id, name, sex) VALUES(1, 'zhangsan1', 'M');

Query OK, 1 row affected (0.00 sec)

 

查询:

mysql> select * from enum_2;

+----+-----------+-----+

| id | name      | sex |

+----+-----------+-----+

|  1 | zhangsan1 | M   |

+----+-----------+-----+

1 row in set (0.00 sec)

 

修改性别:

mysql> update enum_2 set sex = 'F' where id = 1;

Query OK, 1 row affected (0.00 sec)

 

查看:

mysql> SELECT * FROM enum_2;

+----+-----------+-----+

| id | name      | sex |

+----+-----------+-----+

|  1 | zhangsan1 | F   |

+----+-----------+-----+

1 row in set (0.00 sec)

 

跨库查询、db_name.table_name(指定库的指定表)

支持跨库查询,不过需要满足如下条件:

有存量业务数据,并且存在跨库查询时,将存量业务数据导入到Halo-MySQL的时候,需要在Halo-MySQL下:

1)先创建一个database,

2)然后为原来存量业务数据在MySQL下的每个database,在Halo-psql上新创建的database下,创建一个同名scheme,

3)再然后,依次为原MySQL各个database下的表,在Halo-MySQL上刚创建的同名scheme下创建表(例如:create table sheme_name.table_name……)。

示例:

进入psql

[halo@localhost halo]$ psql

psql (14.5 (221108))

输入 "help" 来获取帮助信息.

 

切换数据库到test

\c test

 

创建数据库(test1、test2)、授权、例句、表格(test1.t1、test1.t2)

test=# create database test1;

CREATE DATABASE

 

test=# create schema test1;

CREATE SCHEMA

 

test=# grant all privileges on schema test1 to halo1;

GRANT

 

test=# create table test1.t1 (id int);

CREATE TABLE

 

test=# create database test2;

CREATE DATABASE

 

test=# create schema test2;

CREATE SCHEMA

 

test=# grant all privileges on schema test2 to halo1;

GRANT

 

test=# create table test2.t1 (id int);

CREATE TABLE

   

   退出psql

\q

 

进入Halo-MySQL(用户8.2章有详细描述)

mysql -h 127.0.0.1 -P 3307 -u halo1 -D test -

 

在Halo-MySQL中对psql表格test1.t1、test1.t2进行新增数据

mysql> insert into test1.t1 value(1);

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into test2.t1 value(2);

Query OK, 1 row affected (0.00 sec)

 

查询:

mysql> select * from test1.t1,test2.t1;

+----+----+

| id | id |

+----+----+

|  1 |  2 |

+----+----+

1 row in set (0.00 sec)

 

时间类型

DATETIME类型

DATETIME 用于存储日期和时间的值。默认情况下,DATETIME 值的范围从 1000-01-01 00:00:00 到 9999-12-31 23:59:59。它使用 5 个字节进行存储。

DATETIME 格式的语法:YYYY-MM-DD HH:MM:SS

示例:

mysql> select * from t_time;

+----+----------------------------+

| id | create_time                |

+----+----------------------------+

|  1 | 2022-11-29 17:31:15.696716 |

|  2 | 2022-11-29 17:31:15.696716 |

+----+----------------------------+

2 rows in set (0.00 sec)

 

Timestamp类型

时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、完整的、可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据,签名的对象包括了原始文件信息、签名参数、签名时间等信息。

timestamp占用4个字节,允许为空值,但是不可以自定义值,所以为空值时没有任何意义。timestamp值不能早于1970或晚于2037。这说明一个日期,例如’1968-01-01’,虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。

timestamp值以UTC格式保存( it stores the number of milliseconds);

可以进行时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。

timestamp默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。

数据库会自动修改其值,所以在插入记录时不需要指定timestamp字段的名称和timestamp字段的值,你只需要在设计表的时候添加一个timestamp字段即可,插入后该字段的值会自动变为当前系统时间。

默认情况下以后任何时间修改表中的记录时,对应记录的timestamp值会自动被更新为当前的系统时间。

如果需要可以设置timestamp不自动更新。通过设置DEFAULT CURRENT_TIMESTAMP 可以实现。

示例:

插入数据:

mysql> INSERT INTO timestamp_demo (ts, tstz)

    -> VALUES

    ->  (

    ->  '2016-06-22 19:10:25-07',

    ->  '2016-06-22 19:10:25-07'

    ->  );

Query OK, 1 row affected (0.01 sec)

 

查看:

mysql> select * from timestamp_demo;

+---------------------+------------------------+

| ts                  | tstz                   |

+---------------------+------------------------+

| 2016-06-22 19:10:25 | 2016-06-23 10:10:25+08 |

+---------------------+------------------------+

1 row in set (0.00 sec)

 

“year”类型

YEAR类型是1字节类型,用于表示年份值。可以声明为 YEAR隐式显示宽度为4个字符,或者等效为YEAR(4)显式显示宽度。

YEAR以YYYY格式显示值, 范围 1901为2155,和 0000。

YEAR 接受多种格式的输入值:

为范围'1901'为到的 4位数字字符串'2155'。

在到的范围内1901为 4位数字2155。

为1或2位数的字符串,范围'0' 为'99'。MySQL的转换在范围内的值'0'来'69'和 '70'到'99'到 YEAR的范围内的值 2000来2069和 1970到1999。

为1或2位数字,范围0 为99。MySQL的转换在范围内的值1来69和 70到99到 YEAR的范围内的值 2001来2069和 1970到1999。

插入数字的结果0显示值为,0000内部值为0000。要插入零并将其解释为2000,请将其指定为字符串'0'或'00'。

作为函数的结果,这些函数返回YEAR上下文中 可接受的值NOW()。

注意:在建表之前需要自定义“year”枚举类型,同时,自定义的“year”类型名称一定要以“year_”开头。

 

示例:

创建:

test=# create domain year as varchar;

CREATE DOMAIN

 

test=# create table test_year (a year);

CREATE TABLE

 

新增数据:

mysql> insert into test_year (a) values(2018);

Query OK, 1 row affected (0.00 sec)

 

mysql> insert into test_year (a) values(2022);

Query OK, 1 row affected (0.00 sec)

 

查询:

mysql> select * from test_year;

+------+

| a    |

+------+

| 2018 |

| 2022 |

+------+

2 rows in set (0.01 sec)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论