Why are some place holders '@' and others '%'? For example:

watchdog('alerts', 'Message for %user was sent.', array('%user' =&gt; $user));


and

drupal_set_message(t('options: @options', array('@options' =&gt; $form_state['values'])));


Is there any difference?
Have a look into the function definition of the format_string()
 function which is used by the t() function:

Each type of placeholder has a way in which this function intrepretes it:

@variable: Escaped to HTML using check_plain(). Use this as the default choice for anything displayed on a page on the site.
%variable: Escaped to HTML and formatted using drupal_placeholder(), which makes it display as &lt;em&gt;emphasized&lt;/em&gt; text.
!variable: Inserted as is, with no sanitization or formatting. Only use this for text that has already been prepared for HTML display (for example, user-supplied text that has already been run through check_plain() previously, or is expected to contain some limited HTML tags and has already been run through filter_xss() previously).