在创建一个表后,表中并没有数据,在使用这个表之前,需要向表中插入数据。本小节介绍如何使用INSERT命令插入一行或多行数据,及从指定表插入数据。如果有大量数据需要批量导入表中请联系管理员处理。
背景信息
服务端与客户端使用不同的字符集时,两者字符集中单个字符的长度也会不同,客户端输入的字符串会以服务端字符集的格式进行处理,所以产生的最终结果可能会与预期不一致。
表1 客户端和服务端设置字符集的输出结果对比
操作过程
服务端和客户端编码一致
服务端和客户端编码不一致
存入和取出过程中没有对字符串进行操作
输出预期结果
输出预期结果(客户端编码保持不变)。
存入取出过程对字符串有做一定的操作(如字符串函数操作)
输出预期结果
根据对字符串具体操作可能产生非预期结果。
存入过程中对超长字符串有截断处理
输出预期结果
字符集中字符编码长度是否一致,如果不一致可能会产生非预期的结果。
上述字符串函数操作和自动截断产生的效果会有叠加效果,例如:在客户端与服务端字符集不一致的场景下,如果既有字符串操作,又有字符串截断,在字符串被处理完以后的情况下继续截断,这样也会产生非预期的效果。详细的示例请参见表2。
说明:
数据库DBCOMPATIBILITY设为兼容TD(Teradata)模式,且GUC参数td_compatible_truncation设置为on的情况下,才会对超长字符串进行截断。
执行如下命令建立示例中需要使用的表table1、table2。
gaussdb=# CREATE TABLE table1(id int, a char(6), b varchar(6),c varchar(6));
gaussdb=# CREATE TABLE table2(id int, a char(20), b varchar(20),c varchar(20));
表2 示例
编号
服务端字符集
客户端字符集
是否启用自动截断
示例
结果
说明
1
SQL_ASCII
UTF8
是
gaussdb=# INSERT INTO table1 VALUES(1,reverse('123AAA78'),reverse('123AA78'),reverse('123AA78'));
id |a|b|c
----+------+------+------
1 | 87| 87| 87
字符串在服务端翻转后,并进行截断,由于服务端和客户端的字符集不一致,字符A在客户端由多个字节表示,结果产生异常。
2
SQL_ASCII
UTF8
是
gaussdb=# INSERT INTO table1 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78'));
id |a|b|c
----+------+------+------
2 | 873| 873| 873
字符串翻转后,又进行了自动截断,所以产生了非预期的效果。
3
SQL_ASCII
UTF8
是
gaussdb=# INSERT INTO table1 VALUES(3,'87A123','87A123','87A123');
id | a | b | c
----+-------+-------+-------
3 | 87A1 | 87A1 | 87A1
由于字符串类型字段的长度是客户端字符编码长度的整数倍,所以截断后产生结果正常。
4
SQL_ASCII
UTF8
否
gaussdb=# INSERT INTO table2 VALUES(1,reverse('123AA78'),reverse('123AA78'),reverse('123AA78'));
gaussdb=# INSERT INTO table2 VALUES(2,reverse('123A78'),reverse('123A78'),reverse('123A78'));
id |a|b|c
----+-------------------+--------+--------
1 | 87 321| 87 321 | 87 321
2 | 87321| 87321| 87321
与示例1类似,多字节字符翻转之后不再表示原来的字符。
更多详情请参考GaussDB 文档中心:doc.hcs.huawei.com/db/zh-cn/ga…