跳到主要内容
版本:Next

兼容的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

注:创建数据库时候指定其他字符集,以GB18030为例
CREATE DATABASE test_gb18030 ENCODING GB18030 LOCALE 'C' TEMPLATE template0;

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)

查询:

mysq > select * from test_year;

+------+

| a |

+------+

| 2018 |

| 2022 |

+------+

2 rows in set (0.01 sec)