Отключить GCC «может использоваться без инициализации» для конкретной переменной

Макс. длина varchar подвергается макс. размеру строки в MySQL, который составляет 64 КБ (не считающий БЛОБЫ):

VARCHAR(65535)

Однако примечание, что предел ниже при использовании многобайтового набора символов:

VARCHAR(21844) CHARACTER SET utf8
<час>

Вот некоторые примеры:

максимальный размер строки 65535, но varchar также включает байт или два для кодирования длины данной строки. Таким образом, Вы на самом деле не можете объявить varchar максимального размера строки, даже если это - единственный столбец в таблице.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

, Но если мы пытаемся уменьшить длины, мы находим самую большую длину, которая работает:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Теперь, если мы пытаемся использовать многобайтовый набор символов на уровне таблицы, мы находим, что он считает каждый символ как несколько байтов. Строки UTF8 не делают обязательно использование, несколько байтов на строку, но MySQL не могут предположить ограничение всего будущего, вставляет в однобайтовые символы.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Несмотря на то, что последняя ошибка сказала нам, InnoDB все еще не нравится длина 21 845.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Это имеет идеальный смысл, если Вы вычисляете, что 21845*3 = 65535, который не работал бы так или иначе. Принимая во внимание, что 21844*3 = 65532, который действительно работает.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)
30
задан edA-qa mort-ora-y 23 February 2011 в 09:09
поделиться

3 ответа

Попробуйте сделать это:

 #pragma GCC diagnostic ignored "-Wuninitialized"
        foo(b);         /* no diagnostic for this one */

Эта прагма имеет три интересных и полезных аромата: warning, error, ignored. См. 6.56.10 Диагностические Прагмы для их использования. Ссылка гласит:

GCC позволяет пользователю выборочно включать или отключать определенные виды диагностики и изменять вид диагностики. Например, политика проекта может требовать, чтобы все источники компилировались с -Werror, но в некоторых файлах могут быть исключения, допускающие определенные типы предупреждений. Или проект может выборочно включать диагностику и рассматривать ее как ошибки в зависимости от того, какие макросы препроцессора определены.

33
ответ дан 28 November 2019 в 00:09
поделиться

GCC различает неинициализированный и самоинициализированный, например, компиляция:

int main() {
   int i = i;
   return i;
}

с gcc -Wall -Wextra не выдает предупреждений, если только вы не добавили явно -Winit-self, но это все же полностью оптимизировано моим быстрым тестированием.

4
ответ дан 28 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: