Oracle兼容-函数-RPAD()函数


1. 语法

  1. RPAD(str,len)
  2. RPAD(str,len,padstr)

2. 定义和用法

因为GreatSQL已原生支持 RPAD() 函数,因此想要在GreatSQL中使用扩展后的 RPAD() 函数时,需要先执行 SET sql_mode = ORACLE; 激活Oracle兼容模式。

在GreatSQL中,原生的 RPAD() 函数作用是对字符串 str 在其右边补齐字符串 padstr,使其满足总长度为 len 个字符(注意,是字符长度,不是字节长度)。当 str 的长度已经超过 len 值时,则会被截取一部分长度。例如:

  1. greatsql> SET sql_mode = DEFAULT;
  2. greatsql> SELECT RPAD("a", 3, "b");
  3. +-------------------+
  4. | RPAD("a", 3, "b") |
  5. +-------------------+
  6. | abb |
  7. +-------------------+
  8. greatsql> SELECT RPAD("aaaa", 3, "b");
  9. +----------------------+
  10. | RPAD("aaaa", 3, "b") |
  11. +----------------------+
  12. | aaa |
  13. +----------------------+
  14. greatsql> SELECT RPAD("GreatSQL", 9, "数据库");
  15. +----------------------------------+
  16. | RPAD("GreatSQL", 9, "数据库") |
  17. +----------------------------------+
  18. | GreatSQL |
  19. +----------------------------------+

而在Oracle模式中,函数 RPAD() 最少可以只有2个参数,则其行为是在字符串 str 的左边加上空格补齐,使得字符串最后的总长度为 len 值指定的长度。当参数为3个时,在字符串 str 的左边加上指定字符串 padstr,使最后长度为 len 值指定的长度。

参数 len 值所指的是屏幕的显示长度,而不是字符串的总字符数或者字节数,其中中文字符视为2个字符长度,英文和半角符号视为1个字符长度。

如果要补充的只有一个字符长度,而需要补充的目标字符串为中文,则只会在左边补一个空格。

如果 len 值小于字符串 str 的长度,那么就删除字符串 str 右边的字符。当 str 字符串的长度剩余1个字符并且当前字符为中文的时候,左边补一个空格。如果 len 值为0,那么最后显示NULL。

3. Oracle兼容说明

当GreatSQL的字符集为utf8(utf8mb4/utf8mb3)时,多字节字符显示固定长度为2位,单字节固定显示为1位。此行为大部分结果和Oracle相同,只有少部分多字节字符或半角字符行为和Oracle不一致。

4. 示例

  1. -- 先测试原生的RPAD()函数
  2. greatsql> SET sql_mode = DEFAULT;
  3. greatsql> SELECT RPAD('a', 3, 'b');
  4. greatsql> SELECT RPAD('a', 3, 'b');
  5. +-------------------+
  6. | RPAD('a', 3, 'b') |
  7. +-------------------+
  8. | abb |
  9. +-------------------+
  10. greatsql> SELECT RPAD('aaaa', 3, 'b');
  11. +----------------------+
  12. | RPAD('aaaa', 3, 'b') |
  13. +----------------------+
  14. | aaa |
  15. +----------------------+
  16. -- DEFAULT模式下,每个中文字符长度视为1
  17. greatsql> SELECT RPAD("GreatSQL", 9, "数据库");
  18. +----------------------------------+
  19. | RPAD("GreatSQL", 9, "数据库") |
  20. +----------------------------------+
  21. | GreatSQL |
  22. +----------------------------------+
  23. -- DEFAULT模式下,LENGTH()函数计算每个中文长度为3字节
  24. greatsql> SELECT RPAD('据b', 6, '数a'), length(RPAD('据b', 6, '数a'));
  25. +-------------------------+---------------------------------+
  26. | RPAD('据b', 6, '数a') | length(RPAD('据b', 6, '数a')) |
  27. +-------------------------+---------------------------------+
  28. | baa | 12 |
  29. +-------------------------+---------------------------------+
  30. -- 参数至少要求3
  31. greatsql> SELECT RPAD("数据库", 8);
  32. ERROR 1582 (42000): Incorrect parameter count in the call to native function 'rpad'
  33. -- 切换到Oracle模式
  34. greatsql> SET sql_mode = ORACLE;
  35. -- 每个中文字符长度视为2
  36. -- Oracle模式下,LENGTH()函数计算每个中文长度为1个字符
  37. greatsql> SELECT RPAD('据b', 6, '数a'), length(RPAD('据b', 6, '数a'));
  38. +-------------------------+---------------------------------+
  39. | RPAD('据b', 6, '数a') | length(RPAD('据b', 6, '数a')) |
  40. +-------------------------+---------------------------------+
  41. | ba | 4 |
  42. +-------------------------+---------------------------------+
  43. -- 要左侧补齐的字符串长度只有1,且为中文,最后只补齐一个空格
  44. greatsql> SELECT RPAD('据b', 6, '数据'), length(RPAD('据b', 6, '数据'));
  45. +---------------------------+-----------------------------------+
  46. | RPAD('据b', 6, '数据') | length(RPAD('据b', 6, '数据')) |
  47. +---------------------------+-----------------------------------+
  48. | b | 4 |
  49. +---------------------------+-----------------------------------+
  50. -- 要左侧补齐的字符串长度只有1,且为中文,最后只补齐一个空格
  51. greatsql> SELECT RPAD('数据库', 1), length(RPAD('数据库', 1));
  52. +----------------------+------------------------------+
  53. | RPAD('数据库', 1) | length(RPAD('数据库', 1)) |
  54. +----------------------+------------------------------+
  55. | | 1 |
  56. +----------------------+------------------------------+
  57. -- len = 0,返回NULL
  58. greatsql> SELECT RPAD('数据库', 0);
  59. +----------------------+
  60. | RPAD('数据库', 0) |
  61. +----------------------+
  62. | NULL |
  63. +----------------------+

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx