Я только что обнаружил, что все, кроме VAR
типы данных не меняются LENGTH
s. Это кажется мне крайне неэффективным, так как может быть INT
поля как autoincrement
PRIMARY
что никогда не изменится, где 1
в BIGINT
столбец займет все 8 байтов.
У меня есть много столбцов, которые не будут меняться, как только они будут вставлены, но потенциально могут быть большими. Вместо того, чтобы использовать все BIGINT
столбцы, я хотел бы использовать VARBINARY
вместо.
Я хочу манипулировать данными как int
в с ++ пока сохраните как VARBINARY
в mysql.
Как эти преобразования могут быть сделаны в C ++?
я мог бы высоко рекомендую против этого.
Если вы посмотрите на документацию MySQL для VARCHAR
, вы увидите, что
VARCHAR
значения сохраняются в виде 1-байтового или 2-байтового префикса длины плюс данные. Префикс длины указывает количество байтов в значении.
Давайте возьмем 64-битное значение, например 0xDEADBEEF2B84F00D. Если вы храните это в BIGINT
поле, занимает 8 байт (хранится в виде двоичного значения.)
Если вы храните это как VARCHAR
, даже если вы предполагаете, что числа всегда шестнадцатеричные, мы говорим 1 или 2 байта для поля длины, а затем еще 16 байтов для шестнадцатеричных символов! 18 байт, и производительность теряется при преобразовании в / из ASCII, это ужасный компромисс!
Давайте посмотрим на противоположный случай, 0x01. Хранится в BIGINT
поле, это все еще 8 байтов. Используя то же соглашение, что и раньше, в вашей базе данных, вероятно, будет 3 байта. Даже близко не стоит того, на мой взгляд. Особенно, если учесть, насколько плохо работает база данных с кучей данных ASCII.
Просто не делай этого. Используйте базу данных так, как она была спроектирована.
Я думаю, что это проигрышное предложение. Если вы не можете показать, что ваши данные просто не поместятся в вашей системе, не прибегая к кладбищам, я думаю, вам лучше придерживаться целочисленных типов для целочисленных значений. В противном случае, что может помешать кому-либо вставить «привет» в столбец с числовым идентификатором, и насколько вы будете счастливы, если будете запрашивать числа, которые не похожи на числа? Это, вероятно, будет в целом медленнее.