【问题标题】:How to get the character set from a resultset?如何从结果集中获取字符集?
【发布时间】:2018-08-03 14:54:53
【问题描述】:

mysqli_result::fetch_field()为每一列返回一个type属性,这是一个整数值。

整数值对于 VARCHAR VARBINARY (0xFD) 列以及对于 CHAR BINARY (0xFE ) 列。可以使用MYSQLI_TYPE_STRINGMYSQLI_TYPE_VAR_STRING 常量检测这些列类型。

要知道字符串列是否为 BINARY(它们有一个名为 binary 的排序规则),或者要知道列是否需要转换为另一个字符集,确实需要字符集名称。

但是...mysqli_result::fetch_field() 有一个charsetnr 属性,它再次为字符集返回一个整数。只是这次好像没有办法知道字符集名称,更别说排序规则了?

那么如何从mysqli_result 获取字符集名称呢?

【问题讨论】:

    标签: php mysql mysqli mariadb


    【解决方案1】:

    你不需要知道字符集来查看字段是否是二进制的。

    考虑这个例子:

       if ($result = $mysqli->query($query)) {
    
            /* Get field information for all columns */
            $finfo = $result->fetch_fields();
    
            foreach ($finfo as $val) {
                printf("Name:      %s\n",   $val->name);
                printf("Table:     %s\n",   $val->table);
                printf("Max. Len:  %d\n",   $val->max_length);
                printf("Length:    %d\n",   $val->length);
                printf("charsetnr: %d\n",   $val->charsetnr);
                printf("Flags:     %d\n",   $val->flags);
                printf("Type:      %d\n\n", $val->type);
            }
            $result->free();
        }
    

    你有 $field->flags 属性。检查它的位 128 (0x80)。如果设置了该位,则该字段是二进制(BINARY,VARBINARY)并且具有“二进制”排序规则。

    我不确定您是否可以在非二进制字段上设置“二进制”排序规则。

    【讨论】:

    • 谢谢,我正在查看标志并使用 MYSQLI_BLOB_FLAG,但 MYSQLI_BINARY_FLAG (0x80) 可以解决问题。
    【解决方案2】:

    TL;DR charsetnrSHOW COLLATION 列出的排序规则的 ID。

    我不禁注意到,即使是数字列 charsetnr 也被设置为 63。这将我引向了manual,上面写着:

    要区分字符串数据类型的二进制和非二进制数据,检查charsetnr值是否为63。如果是,则字符集为二进制,表示二进制而不是非二进制数据。这使您能够区分 BINARY 与 CHAR、VARBINARY 与 VARCHAR 以及 BLOB 类型与 TEXT 类型。

    通过以下方式检索有关排序规则和字符集的更多信息:

    SELECT `COLLATION_NAME`
         , `CHARACTER_SET_NAME`
         , `IS_DEFAULT`
         , `IS_COMPILED`
         , `SORTLEN`
    FROM `INFORMATION_SCHEMA`.`COLLATIONS`
    WHERE `ID` = ?;
    

    【讨论】:

      【解决方案3】:
      SELECT  IFNULL(COLLATION_NAME, 'binary')
          FROM  `COLUMNS`
          WHERE  table_schema = 'biglim'
            AND  table_name = 'article'
      

      将在特定数据库(模式)中找到与特定表关联的排序规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-20
        • 1970-01-01
        • 2017-04-22
        • 2020-07-11
        • 2017-11-05
        • 2018-10-30
        • 1970-01-01
        相关资源
        最近更新 更多