2

からのlength結果mysqli_fetch_fields()は、私に不正確な結果を与えています。

MySQL >DESCRIBE Notices;

Field     Type               Null     Key     Default     Extra
Id        int(10) unsigned   NO       PRI     (NULL)      auto_increment
UserId    int(10) unsigned   NO       MUL     (NULL)
Title     char(255)          NO               (NULL)
Name      char(255)          NO               (NULL)
Summary   text               NO               (NULL)

でも、

class Db {
    public function exec($sql) {
        if (!$this->link) {
            $this->open();
        }
        if (($this->result = mysqli_query($this->link, $sql)) === false) {
            throw new Exception('<b>' . __METHOD__ . '</b>: ' . $sql . ': ' . mysqli_error($this->link));
        }
        return true;
    }
    public function field_info($table) {
        $sql = 'SELECT * FROM `' . $table . '` LIMIT 1';
        $this->exec($sql);
        return $this->field_info = $this->result->fetch_fields();
    }
}

$a  = $db->field_info('Notices');
print_r($a);

次の出力が生成されます。

// Note: "max_length" is the maximum existing length in the result set,
// while "length" is the set maximum length in the table definition.

Array
(
    [0] => stdClass Object
        (
            [name] => Id
            [orgname] => Id
            [table] => Notices
            [orgtable] => Notices
            [def] =>
            [max_length] => 1
            [length] => 10
            [charsetnr] => 63
            [flags] => 49699
            [type] => 3
            [decimals] => 0
        )

    [1] => stdClass Object
        (
            [name] => UserId
            [orgname] => UserId
            [table] => Notices
            [orgtable] => Notices
            [def] =>
            [max_length] => 1
            [length] => 10
            [charsetnr] => 63
            [flags] => 53289
            [type] => 3
            [decimals] => 0
        )

    [2] => stdClass Object
        (
            [name] => Title
            [orgname] => Title
            [table] => Notices
            [orgtable] => Notices
            [def] =>
            [max_length] => 27
            [length] => 765
            [charsetnr] => 33
            [flags] => 4097
            [type] => 254
            [decimals] => 0
        )

    [3] => stdClass Object
        (
            [name] => Name
            [orgname] => Name
            [table] => Notices
            [orgtable] => Notices
            [def] =>
            [max_length] => 25
            [length] => 765
            [charsetnr] => 33
            [flags] => 4097
            [type] => 254
            [decimals] => 0
        )

    [4] => stdClass Object
        (
            [name] => Summary
            [orgname] => Summary
            [table] => Notices
            [orgtable] => Notices
            [def] =>
            [max_length] => 26
            [length] => 196605
            [charsetnr] => 33
            [flags] => 4113
            [type] => 252
            [decimals] => 0
        )
)

見ると、報告されたCHARフィールドの長さが一致していないことがわかります。DESCRIBEが私255に与えている間、私にfetch_fields()与えています765。なんで?

(ご参考までに、このアイデアは、タグのmaxlength属性を生成することです。)<input>

4

4 に答える 4

1

フィールドの長さは 255文字ですが、レポートされる長さはバイト単位です。

MySQL はUTF-8 照合に1 文字あたり 3 バイトを使用しているため、結果として255*3 = が得765られます。

于 2012-05-03T11:39:59.047 に答える
1

/出力の値lengthと同様に、クライアントによって定義されたデフォルトの文字セットに明らかに依存します。charsetnrmysqli_result::fetch_fields()mysqli_fetch_fields()

たとえば、charsetnrof33は UTF-8 を表します。正確には、文字セット「utf8」の照合「utf8_general_ci」を表します。この情報は、次のクエリを実行することで取得できます。

SELECT * FROM information_schema.collations;

使用可能な文字セットとその文字長のリストは、次のクエリで取得できます。

SELECT * FROM information_schema.character_sets;

デフォルトのクライアント文字セットは、PHP でmysqli::set_charset()/を呼び出すことで変更できますmysqli_set_charset()

例:

$dbHandle->set_charset('latin1');

の PHP ドキュメントにはmysqli_fetch_fields()現在その情報が含まれていないため、バグ 68573で追加するようにリクエストしました。

デフォルトの文字セットは、別のスレッドで説明されているように、サーバー構成内で定義することもできます。

のこの動作fetch_fields()は非常に紛らわしいため、バグ 68574で変更を依頼しました。

于 2014-12-09T10:57:47.200 に答える
-1

私は同じ問題を抱えていて、使用する必要があることがわかりました: $val->length;

max_length ではありません。max_length は、テーブル定義ではなく、その特定の列の値の最大長です。

テーブル定義が必要な場合は、「長さ」を使用してください。

$q = $mysqli->query("select * from table");

$finfo = $q->fetch_fields();

foreach ($finfo as $val) {

    echo $val->length;

}

参照: http://php.undmedlibrary.org/manual/de/function.mysqli-fetch-fields.php

于 2013-04-16T22:10:31.630 に答える