I don't think that `StringMatchQ["x", Except[{"*"}]]` works as expected as well as `StringMatchQ["x", Except["*"]]`:

    StringMatchQ["x", Except[{"*"}]]
    StringMatchQ["x", Except["*"]]
    
>     True
    
>     True

The string pattern `"*"` is an *abbreviated string pattern* consisted from the only metacharacter `*` which corresponds to **zero or more characters** according to the first point under the "Details and Options" section of [`StringMatchQ`][1]. So by the definition the pattern `Except["*"]` shouldn't give a match at all because it means negation of literally everything. Also for matching verbatim `"*"` one must escape this metacharacter with double backslash `"\\*"` (the reference is the same). So current behavior is a bug.

Note also that escaping with single backslash is meant for *Mathematica*'s internal metacharacters like `<` and `>` (and obviously for `n`, `t` and `r` etc. but with another counting) as described in [this][2] answer by John Fultz:

> The modern Mathematica notebook format (introduced in 1996) was always
> made to be interpreted properly as a Mathematica expression should you
> call `Get[]` on it from the kernel.  So this syntax was standardized,
> and is still used today. Now, the kernel simply ignores the `\<` `\>`
> delimiters as you can see below:
> 
>     In[1]:== StringLength["\<x\>"]
> 
> >     Out[1]== 1


----------


The following is a set of examples of the expected behavior (observed with version 10.4.1):

    StringMatchQ["", "*"]
    StringMatchQ["", Except["*"]]
    
>     True
>
>     False

    StringMatchQ["xy", {"*"}]
    StringMatchQ["xy", "*"]
    
>     True
    
>     True


    StringMatchQ["*", Except[{"*"}]]
    StringMatchQ["*", Except["*"]]
    StringMatchQ["xy", Except["*"]]
    
>     False
    
>     False

>     False

    StringMatchQ["x", "@"]
    
>     True

    StringMatchQ["x", {"\\*"}]
    StringMatchQ["x", "\\*"]    
    StringMatchQ["*", "\\*"]

>     False
>     
>     False
>
>     True

The following is a set of examples of wrong behavior of `Except` with metacharacters:

    StringMatchQ["x", Except[{"\\*"}]] (* metacharacter is correctly escaped *)
    StringMatchQ["x", Except["\\*"]] (* metacharacter is correctly escaped *)

> StringExpression::invld: Element Except[{\\*}] is not a valid string or
> pattern element in Except[{\\*}]. >>
> 
>     StringMatchQ["x", Except[{"\\*"}]]
> 
> StringExpression::invld: Element Except[\\*] is not a valid string or
> pattern element in Except[\\*]. >>
> 
>     StringMatchQ["x", Except["\\*"]]

    StringMatchQ["x", Except["\*"]] (* metacharacter is wrongly escaped *)
    StringMatchQ["*", Except["\*"]] (* metacharacter is wrongly escaped *)
    
>     True

>     True

    StringMatchQ["x", Except["@"]]

> StringExpression::invld: Element Except[@] is not a valid string or
> pattern element in Except[@]. >>
> 
>     StringMatchQ["x", Except["@"]]

And here is an example of wrong (but consistent) behavior of `StringMatchQ` both with `Except` and without it:

    StringMatchQ["\*", Except["\*"]] (* metacharacter is wrongly escaped *)
    StringMatchQ["\*", "\*"] (* metacharacter is wrongly escaped *)
    
>     False
    
>     True

In addition:

    StringMatchQ["*", Except["\*"]]
    
>     True


  [1]: http://reference.wolfram.com/language/ref/StringMatchQ.html
  [2]: http://forums.wolfram.com/mathgroup/archive/2010/Dec/msg00462.html