Ответ 1
Вероятно, потому, что Windows CE полностью основана на Unicode, и все эти строки хранятся таким образом.
Я создал таблицу в SQL Server CE и понял, что она не поддерживает varchar.
Посмотрев на это, я обнаружил, что "текстовые столбцы не-Unicode (varchar, char, text) и smallmoney не поддерживаются, хотя nvarchar, nchar, ntext и money поддерживаются" как указанный в MSDN.
Это правда? Почему именно это? Казалось бы, компактная база данных будет поддерживать типы данных, которые занимают меньше байтов для хранения... Я предполагаю, что для сохранения символов Unicode требуется больше места.
Каковы причины этого?
Вероятно, потому, что Windows CE полностью основана на Unicode, и все эти строки хранятся таким образом.
Я думаю, что они пытались уменьшить площадь развертывания и упростить интерфейс. Это и, вероятно, пытается избежать необходимости развертывать больше версий DLL (unicode vs non-unicode версии).
И да, верно, что они поддерживают только Unicode.
Но это автоматически не означает, что для хранения требуется 2 байта. Вы можете кодировать это на уровне базы данных, чтобы в основном сбрасывать первый байт, когда он не нужен. Многие механизмы баз данных делают это как средство сжатия в Юникоде.
Это просто означает, что любые записи, которые используют два байтовых набора, имеют небольшие накладные расходы дополнительного маркера, указывающего движку, что последовательность использует два байта. В противном случае один байт может быть сохранен на диске и расширен как часть чтения RowData.
Большинство компактных баз данных всегда используют форму сжатия runlength, когда они фактически помещают байты на диск, чтобы сэкономить место. Формат, с которым вы его видите, когда он выходит из двигателя, редко совпадает с тем, что на самом деле хранится на диске.