在postgres select查询中插入ascii十进制字符是否可以?

时间:2014-07-10 05:05:37

标签: sql postgresql

我需要以这种方式使用o / p的select语句。

您被分配到以下项目:

  • A
  • C

有一些空格,特殊字符&新线。为此,我使用了ascii charaters chr(10),chr(32),chr(8226)。 它工作正常,但查询看起来并不好看。我不确定这样做是否是一个好方法。 查询看起来像这样

SELECT 
'You are assigned to following projects:' || chr(10) || chr(32) || chr(8226) || chr(32) ||
string_agg(e.projects, chr(10) || chr(32) || chr(8226) || chr(32))

这也适用于所有OS&在每个环境中?

2 个答案:

答案 0 :(得分:3)

您有几个选择:

  • 按字面插入字符。通常是最好的选择。想要一个 ”•”?使用类似'this is a •'的字符串。无需更多内容如果您的client_encoding是正确的,并且您使用的编码包含您想要的字符(例如)。这是SQL标准。换行符可以包含在文字中:

    SELECT '
    ' AS "this_is_a_newline";
    

    此方法可能不适用于某些不可打印的字符,具体取决于数据库实现。对于PostgreSQL,它除了\x00之外的所有内容都很好,这是零字节,PostgreSQL根本不支持text / varchar等,仅在bytea

    注意确保您的文本编辑器/ SQL编辑器的文本编码与您的连接告诉PostgreSQL client_encoding的匹配,否则您将遇到错误的字符串或奇怪的错误。类似unix的终端的用户还需要确保终端编码与client_encoding匹配,以避免出现奇怪的输出错误。如今,Windows是唯一一个通常存在问题的平台。

  • E''转义字符串中以十六进制或unicode文字插入字符,例如E'this is a \u2022'。请注意,\u转义符为十六进制 - 0x2022为十进制8226. E''语法是PostgreSQL扩展名。

  • 对于定义了速记转义符的字符,请在转义字符串中使用缩写转义符,例如E'\n'。这是PostgreSQL扩展。

  • 如您所述使用chr(8226),但请注意chr根据您的server_encoding(数据库的文本编码)解释代码。所以我鼓励它。对于多字节字符,您只会收到类似ERROR: requested character too large for encoding: 8226的错误:

      regress=> CREATE DATABASE latin ENCODING 'latin-1' LC_CTYPE 'C' LC_COLLATE 'C' TEMPLATE template0;
      CREATE DATABASE
      regress=> \c latin
      You are now connected to database "latin" as user "craig".
      latin=> SHOW server_encoding;
       server_encoding 
      -----------------
       LATIN1
      (1 row)
    
      latin=> SHOW client_encoding;
       client_encoding 
      -----------------
       UTF8
      (1 row)
      latin=> select chr(8226);
      ERROR:  requested character too large for encoding: 8226
    

    但对于序数在1字节范围内的字符,您可以获得意外字符。取ü,其中utf-8和latin-1(iso-8859-1)为0xfc(十进制252),但在iso-8859-5中为ќ。所以:

     regress=> SHOW server_encoding;
     server_encoding 
     -----------------
     UTF8
    
     regress=> SELECT chr(252);
     chr 
     -----
      ü
    
     regress=> CREATE DATABASE iso5 ENCODING 'iso-8859-5' LC_CTYPE 'C' LC_COLLATE 'C' TEMPLATE template0;
    
     regress=> \c iso5
    
     iso5=> SELECT chr(252);
     chr 
    -----
     ќ
    

所以我的建议是:尽可能使用文字。在必须使用转义符的地方,使用带有unicode转义符的E''字符串,以防止基于当前服务器编码的代码点含义含糊不清。避免\x转义和chr

对于您编写的具体示例,您应该使用:

SELECT 'You are assigned to following projects:

    • A
    • B
    • C';

对于非常旧的PostgreSQL版本的读者的注意事项:极其旧的PostgreSQL版本不支持E''字符串并将所有字符串视为转义字符串。所以'\n'意味着“换行”,现代PostgreSQL遵循SQL标准,其中'\n'只是字符串“\ n”。只有略有史前版本的版本仍然会这样做,但会对此发出警告并让您通过设置standard_conforming_strings = on来请求标准行为。这是相当长一段时间的默认值。

答案 1 :(得分:1)

而不是

chr(10) || chr(32) || chr(8226) || chr(32)

只需使用

\n • 

在这种情况下没有理由使用chr()

enter image description here