如何从结果集中获取字符集?

时间:2018-08-03 14:54:54

标签: php mysql mysqli mariadb

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

对于VARCHAR VARBINARY(0xFD)列以及CHAR BINARY({ {1}})列。可以使用0xFEMYSQLI_TYPE_STRING常量检测这些列类型。

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

但是... binary具有mysqli_result::fetch_field()属性,该属性再次为字符集返回整数。只是这一次似乎无法知道字符集名称,更不用说排序规则了。

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

3 个答案:

答案 0 :(得分: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)。如果该位置1,则该字段为二进制(BINARY,VARBINARY),并且具有“二进制”排序规则。

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

答案 1 :(得分:0)

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

我不禁注意到,即使将数字列charsetnr设置为63。这将我引向manual说:

  

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

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

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

答案 2 :(得分:0)

SELECT  IFNULL(COLLATION_NAME, 'binary')
    FROM  `COLUMNS`
    WHERE  table_schema = 'biglim'
      AND  table_name = 'article'

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