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

9o685dep  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(611)

mysqli_result::fetch_field() 返回一个 type 属性,它是一个整数值。
varchar和varbinary的整数值相同( 0xFD )列,也用于char和binary( 0xFE )列。这些列类型可以通过 MYSQLI_TYPE_STRING 以及 MYSQLI_TYPE_VAR_STRING 常量。
要知道字符串列是否是二进制的(它们有一个名为 binary ),或者要知道列是否需要转换为另一个字符集,确实需要字符集名称。
但是。。。 mysqli_result::fetch_field() 有一个 charsetnr 属性,该属性再次返回字符集的整数。只是这一次似乎没有办法知道字符集的名称,更不用说排序了?
那么如何才能从 mysqli_result ?

lvmkulzt

lvmkulzt1#

您不需要知道字符集就可以查看字段是否是二进制的。
考虑这个例子:

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)并具有“binary”排序规则。
我不确定您是否可以在非二进制字段上设置“二进制”排序规则。

oxosxuxt

oxosxuxt2#

热释光;博士 charsetnr 所列排序规则的id SHOW COLLATION .
我忍不住注意到,即使是数字列 charsetnr 已设置为 63 . 这把我引向手册,上面写着:
要区分字符串数据类型的二进制和非二进制数据,请检查charsetnr值是否为63。如果是这样,字符集是二进制的,表示二进制数据而不是非二进制数据。这使您能够区分binary和char、varbinary和varchar,以及blob类型和文本类型。
通过以下方式检索有关排序规则和字符集的详细信息:

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

k4emjkb13#

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

将在特定数据库(架构)中查找与特定表关联的排序规则。

相关问题