向表中插入数据

    服务端与客户端使用不同的字符集时,两者字符集中单个字符的长度也会不同,客户端输入的字符串会以服务端字符集的格式进行处理,所以产生的最终结果可能会与预期不一致。

    表 1 客户端和服务端设置字符集的输出结果对比

    上述字符串函数操作和自动截断产生的效果会有叠加效果,例如:在客户端与服务端字符集不一致的场景下,如果既有字符串操作,又有字符串截断,在字符串被处理完以后的情况下继续截断,这样也会产生非预期的效果。详细的示例请参见。

    执行如下命令建立示例中需要使用的表table1、table2。

    表 2 示例

    服务端字符集

    客户端字符集

    是否启用自动截断

    示例

    结果

    说明

    1

    SQL_ASCII

    UTF8

    1. id |a|b|c
    2. ——+———+———+———
    3. 1 | 87| 87| 87

    字符串在服务端翻转后,并进行截断,由于服务端和客户端的字符集不一致,字符A在客户端由多个字节表示,结果产生异常。

    2

    SQL_ASCII

    UTF8

    1. openGauss=# INSERT INTO table1 VALUES(2,reverse(‘12378’),reverse(‘12378’),reverse(‘12378’));
    1. id |a|b|c
    2. ——+———+———+———
    3. 2 | 873| 873| 873

    字符串翻转后,又进行了自动截断,所以产生了非预期的效果。

    3

    SQL_ASCII

    UTF8

    1. id | a | b | c
    2. ——+———-+———-+———-
    3. 3 | 871 | 871 | 871

    字符串类型的字段长度是客户端字符编码长度的整数倍,所以截断后产生结果正常。

    4

    SQL_ASCII

    UTF8

    1. id |a|b|c
    2. ——+—————————-+————+————
    3. 1 | 87 321| 87 321 | 87 321
    4. 2 | 87321| 87321| 87321

    与示例1类似,多字节字符翻转之后不再表示原来的字符。

    操作步骤

    向表中插入数据前,意味着表已创建成功。创建表的步骤请参考。

    • 向表customer_t1中插入一行:

      数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。

      1. openGauss=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');

      如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。

      如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:

      1. openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace');
      2. openGauss=# INSERT INTO customer_t1 VALUES (3769, 'hello');

      用户也可以对独立的字段或者整个行明确缺省值:

      1. openGauss=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', DEFAULT);
      2. openGauss=# INSERT INTO customer_t1 DEFAULT VALUES;
    • 如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。

      1. openGauss=# CREATE TABLE customer_t2
      2. (
      3. c_customer_sk integer,
      4. c_customer_id char(5),
      5. c_first_name char(6),
      6. c_last_name char(8)
      7. );
    • 删除备份表。