I only use PostgreSQL's TEXT data type (although it's non-standard) unless the string is
actually length limited. Some examples are the United State's Post Office's 2-letter state codes, or a social security number.
I'm not familiar enough with ASINs to make a recommendation one way or another, but you could easily enforce the requirement you've described as follows:
Code:
create table foo (
...
asin text not null check (asin ~ '^[A-Z0-9]{10}$')
);
If the requirement ever changes, you simply need to change the check constraint. Changing the data type could be more problematic, especially if it's part of a foreign key.