0

選択した結果の種類に基づいて、他のデータベースにテーブルを作成する必要があります。クエリ結果は、テーブル内の実際の列にマップすることも、 fe にマップすることもできませんSelect 1, c from char_length_test

mysql C apiを使用してselect文の後に実際の列サイズを取得するには?

私はそのようなテーブルを作成しました:

CREATE TABLE char_length_test (c char(22))

そして、mysql_real_queryこのクエリを実行するために使用します

SELECT c from char_length_test

その直後にmysql_fetch_fields、フィールドの長さを取得するために実行しc、create table ステートメントのように 22 になることを期待します。残念ながら、長さには 66 の値が含まれています (予想の 3 倍)。さまざまなサイズを試してみましたが、結果は同じで、長さは常に 3 倍です。

また、gdb を使用して、期待値を含む他のデータ フィールドがあるかどうかを確認します。

{
name             = "c",
org_name         = "c",
table            = "char_length_test",
org_table        = "char_length_test",
db               = "database",
catalog          = "def",
def              = 0x0,
length           = 66,
max_length       = 0,
name_length      = 1,
org_name_length  = 1,
table_length     = 16,
org_table_length = 16,
db_length        = 6,
catalog_length   = 3,
def_length       = 0,
flags            = 0,
decimals         = 0,
charsetnr        = 33,
type             = MYSQL_TYPE_STRING,
extension        = 0x0
}
4

1 に答える 1

1

mysql_fetch_fields() および mysql_field_len() は、文字数ではなく、VARCHAR 値を格納するために必要なバイト数を返します。UTF-8 列の場合、ドキュメントには別の記載がありますが、これは実際の列サイズの 3 倍を返します。これは、C コードが割り当てるメモリの量を認識できるようにするためです。MySQL 接続 (テーブル構造ではありません!) を別の文字セットに設定すると、別の結果が得られます。

編集:

mysql_set_character_set()を呼び出して、MySQL 接続の文字セットを変更できます。8 ビット文字セットを使用する場合、データベース列の幅に一致するバイト数を取得する必要があります。たとえば、次のようになります。

mysql_set_character_set(&mysql,'latin1');
于 2013-04-02T14:36:36.000 に答える