mysql — конвертирует c ++ int в VARBINARY и обратно

Я только что обнаружил, что все, кроме VAR типы данных не меняются LENGTHs. Это кажется мне крайне неэффективным, так как может быть INT поля как autoincrement PRIMARY что никогда не изменится, где 1 в BIGINT столбец займет все 8 байтов.

У меня есть много столбцов, которые не будут меняться, как только они будут вставлены, но потенциально могут быть большими. Вместо того, чтобы использовать все BIGINT столбцы, я хотел бы использовать VARBINARY вместо.

Я хочу манипулировать данными как int в с ++ пока сохраните как VARBINARY в mysql.

Как эти преобразования могут быть сделаны в C ++?

0

Решение

я мог бы высоко рекомендую против этого.

Если вы посмотрите на документацию MySQL для VARCHAR, вы увидите, что

VARCHAR значения сохраняются в виде 1-байтового или 2-байтового префикса длины плюс данные. Префикс длины указывает количество байтов в значении.

Давайте возьмем 64-битное значение, например 0xDEADBEEF2B84F00D. Если вы храните это в BIGINT поле, занимает 8 байт (хранится в виде двоичного значения.)

Если вы храните это как VARCHAR, даже если вы предполагаете, что числа всегда шестнадцатеричные, мы говорим 1 или 2 байта для поля длины, а затем еще 16 байтов для шестнадцатеричных символов! 18 байт, и производительность теряется при преобразовании в / из ASCII, это ужасный компромисс!

Давайте посмотрим на противоположный случай, 0x01. Хранится в BIGINT поле, это все еще 8 байтов. Используя то же соглашение, что и раньше, в вашей базе данных, вероятно, будет 3 байта. Даже близко не стоит того, на мой взгляд. Особенно, если учесть, насколько плохо работает база данных с кучей данных ASCII.

Просто не делай этого. Используйте базу данных так, как она была спроектирована.

3

Другие решения

Я думаю, что это проигрышное предложение. Если вы не можете показать, что ваши данные просто не поместятся в вашей системе, не прибегая к кладбищам, я думаю, вам лучше придерживаться целочисленных типов для целочисленных значений. В противном случае, что может помешать кому-либо вставить «привет» в столбец с числовым идентификатором, и насколько вы будете счастливы, если будете запрашивать числа, которые не похожи на числа? Это, вероятно, будет в целом медленнее.

1

По вопросам рекламы [email protected]