Почему был изобретен wchar_t?

Мой единственный опыт в запросах связан с MySQL, но, надеюсь, он достаточно схож.

Ваш запрос выглядит странным для меня, потому что ваш подзапрос находится в предложении SELECT. Я никогда не видел этого раньше ... но, видимо, он поддерживается в MySQL. Обычно подзапрос приходит после FROM или LEFT JOIN или JOIN.

Ваш пример достаточно прост, чтобы вы могли реализовать его с помощью LEFT JOIN:

SELECT C.guid, ..., COUNT(distinct D.id) as numprogs
FROM Computers AS C
LEFT JOIN ComputerData as D ON D.computer_id = C.id

В этом случае , LEFT JOIN - это правильный тип соединения, потому что, даже если в таблице D нет соответствующей записи для конкретной записи C, ваш результирующий набор все равно будет содержать, что запись C и numprogs будут равны нулю, как и следовало ожидать.

Если вы действительно хотите использовать подзапрос, попробуйте это:

SELECT C.guid, ..., S.numprogs
FROM Computers AS C
LEFT JOIN
(SELECT computer_id, COUNT(*) as numprogs
 FROM ComputerData GROUP BY computer_id) AS S
ON C.id=S.computer_id

Я предлагаю упростить ваш запрос, чтобы получить его как самый простой возможный запрос, который должен работать, т работы. Затем сообщите нам конкретное сообщение об ошибке, возвращаемое движком вашей базы данных.

Редактирование: я прочитал главу MySQL о подзапросах и вам кажется, что вы должны попробовать удалить «как numprograms» "после вашего подзапроса ... возможно, у вас нет выбора в отношении имени столбца, который выходит из подзапроса после того, как вы уже создали подзапрос.

23
задан CannibalSmith 23 October 2009 в 13:44
поделиться

9 ответов

Зачем нужен wchar_t? Чем он превосходит short (или __int16 или что-то еще)?

В мире C ++ wchar_t является отдельным типом (я думаю, что это typedef в C), поэтому вы может перегружать функции на основе этого. Например, это позволяет выводить широкие символы, а не выводить их числовое значение. В VC6, где wchar_t было просто typedef для unsigned short , этот код

wchar_t wch = L'A'
std::wcout << wch;

выводит 65 , потому что

std::ostream<wchar_t>::operator<<(unsigned short)

был вызван. В более новых версиях VC wchar_t является отдельным типом, поэтому вызывается

std::ostream<wchar_t>::operator<<(wchar_t)

и выводит A .

17
ответ дан 29 November 2019 в 00:53
поделиться

См. Википедия .

По сути, это портативный введите "текст" в текущем языковом стандарте (с умляутами). Он предшествует Unicode и не решает многих проблем, поэтому сегодня он в основном существует для обратной совместимости. Не используйте его, если в этом нет необходимости.

17
ответ дан 29 November 2019 в 00:53
поделиться

Причина, по которой существует wchar_t , почти такая же причина, по которой существует size_t или time_t - это абстракция, которая указывает, что тип предназначен для представления, и позволяет реализациям выбирать базовый тип, который может правильно представлять тип на конкретной платформе.

Обратите внимание, что wchar_t не обязательно должен быть 16-битным типом - есть платформы, где это 32-битный тип.

10
ответ дан 29 November 2019 в 00:53
поделиться

Обычно считается хорошим давать такие вещи, как типы данных осмысленные имена .

Что лучше, char или ] int8 ? Я думаю, что это:

char name[] = "Bob";

намного легче понять, чем это:

int8 name[] = "Bob";

То же самое с wchar_t и int16 .

8
ответ дан 29 November 2019 в 00:53
поделиться

Когда я читал соответствующие стандарты, мне показалось, что Microsoft испортила этот плохо .

Моя справочная страница для POSIX :

  • wchar_t : Целочисленный тип, диапазон значений которого может представляют собой отчетливый широкий характер коды для всех членов самого большого набора символов, указанного среди локали, поддерживаемые средой компиляции: нуль символ имеет кодовое значение 0 и каждый член переносимого набора символов имеет кодовое значение, равное его значение при использовании в качестве одиночного символа в целочисленном символе константа.

Итак, 16 бит wchar_t недостаточно, если ваша платформа поддерживает Unicode. Каждый wchar_t должен быть отдельным значением для символа. Следовательно, wchar_t из удобного способа работы на уровне символов текстов (конечно, после декодирования из многобайтовой локали) становится совершенно бесполезным на платформах Windows.

6
ответ дан 29 November 2019 в 00:53
поделиться

wchar_t - это примитив для хранения и обработки символов Юникода платформы. Его размер не всегда составляет 16 бит. В системах unix wchar_t 32-битный (возможно, пользователи unix с большей вероятностью будут использовать клингонские символы, для которых используются дополнительные биты: -).

Это может создать проблемы при переносе проектов, особенно если вы меняете местами wchar_t и короткий, или если вы поменяете местами wchar_t и xerces ' XMLCh .

Следовательно, имея wchar_t в качестве другого типа, чтобы сократить очень важен для написания кроссплатформенного кода. Очистка этого была одной из самых сложных частей при переносе нашего приложения на unix, а затем с VC6 на VC2005.

6
ответ дан 29 November 2019 в 00:53
поделиться

Чтобы добавить на комментарий Аарона - в C ++ 0x мы, наконец, получаем настоящие типы символов Unicode: char16_t и char32_t, а также строковые литералы Unicode.

4
ответ дан 29 November 2019 в 00:53
поделиться

Он «превосходит» в том смысле, что позволяет разделять контексты: вы используете wchar_t в контекстах символов (например, строки), и вы используете short в числовом контексте (числа). Теперь компилятор может выполнять проверку типов, чтобы помочь вам отловить ситуации, когда вы ошибочно смешиваете одно с другим, например, передать абстрактный нестроковый массив short s в функцию обработки строк.

В качестве побочного узла. (поскольку это был вопрос C), в C ++ wchar_t позволяет вам перегружать функции независимо от short , то есть снова предоставлять независимые перегрузки, которые работают со строками и числами (например).

2
ответ дан 29 November 2019 в 00:53
поделиться

wchar_t - это немного пережиток времени до стандартизации Unicode. К сожалению, это не очень полезно, потому что кодировка зависит от платформы (а в Solaris - от языкового стандарта!), А ширина не указана. Кроме того, нет никаких гарантий, что будут доступны фасеты кодека UTF-8/16/32, или действительно, как вы получите к ним доступ. В общем, это немного кошмар для портативного использования.

Очевидно c ++ 0x будет поддерживать Unicode, но при нынешних темпах прогресса этого может никогда не случиться ...

2
ответ дан 29 November 2019 в 00:53
поделиться
Другие вопросы по тегам:

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