mysqli_result::fetch_field()
为每一列返回一个type
属性,该属性是整数值。
对于VARCHAR 和 VARBINARY(0xFD
)列以及CHAR 和 BINARY({ {1}})列。可以使用0xFE
和MYSQLI_TYPE_STRING
常量检测这些列类型。
要知道字符串列是否为BINARY(它们的归类名为MYSQLI_TYPE_VAR_STRING
),或者要知道列是否需要转换为另一个字符集,则确实需要字符集名称。
但是... binary
具有mysqli_result::fetch_field()
属性,该属性再次为字符集返回整数。只是这一次似乎无法知道字符集名称,更不用说排序规则了。
那么如何从charsetnr
获取字符集名称?
答案 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 charsetnr
是SHOW 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'
将在特定数据库(模式)中找到与特定表关联的排序规则。