The MySQL Reference Manual advises:
Use a CREATE TABLE statement to specify the layout of your table:
mysql> CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
-> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
Several types of values can be chosen to represent sex in animal records, such as 'm' and 'f', or perhaps 'male' and 'female'. It is simplest to use the single characters 'm' and 'f'.
I will supplement that with this post about representing sex (gender) in people records. I have to consider the name, the possible values, the data type, and the constraints. It won't be simplest.
First consider Naming Conventions. The word 'sex' is not too long, its characters are all Latin, there is no need to "delimit", using lower case is okay, making it plural ('sexes') would be a mistake, and it's not a reserved word. So far so good.
Next consider the alternative term 'gender'. Some people make a distinction between gender and sex. In that case, 'sex' is better if only a physical characteristic matters, but 'gender' is better if you're also taking into account the behaviour, self-identification, and washroom preference. However, gender's primary dictionary meaning is as a grammatical category, and it is a far less popular word.
Conclusion: yes, the column name should be 'sex'.
Now consider interoperability. If there are application programs that use the database, what checkboxes are they likely to display? If the data must go to some other body (the government, say), do they tell you what the choices are? This is where standards come in. For pretty well anything that's commonly used to describe a person (age, occupation, income, and of course sex) there will be a standard code list.
The German Wikipedia article about "Data standards for description of sex" describes many of them. It's worth a look even if your German is weak, because most of the charts include English translations. I'll try to use primary sources and then generalize:
ISO 5218 is the international standard, and gets a recommendation in a chapter about sex in "Joe Celko's Data, Measurement and Standards in SQL". The problem is it only uses digits. This eliminates the worry that it will look biased towards West European languages, but then it looks biased towards males (because '1' comes before '2'), and on that basis has been called "offensive".
More seriously, a digit has no mnemonic value and that means inputters and readers would have to learn more, or developers would have to write more.
Let's look instead for something that the other "standards" can agree on.
They all say 'M' = male and 'F' = female, so that's indisputable.
Most of them say there's at least one other category, and although it is disputable it is prudent to add 'O' = other, forestalling complaints like the lack of 'fluidity' objection from the Gay, Lesbian, Bisexual, and Transgender Round Table of the American Library Association.
Most of them say there are codes for "unknown" and "not applicable", and this should be disputed. Such codes are necessary for simple lists, but for SQL databases they are unnecessary because NULLs exist. If we said that the 'sex' column has special values for "unknown" or "not applicable", but 'owner' and 'species' do not, we would need inconsistent rules. Therefore "unknown" and "not applicable" are to be handled with NULL.
They all say that 'M' and 'F' are upper case. Of course it might not matter in MySQL or MariaDB, where the default collation is case insensitive. But other DBMSs are stricter, and we're thinking about interoperability here, so lower case codes like 'm' and 'f' are not acceptable equivalents.
Conclusion: allow 'M', 'F', 'O', and NULL.
Now consider what best fits for the range of values, without totally forgetting efficient storage.
Conclusion: yes, the data type should be CHAR(1).
Since we won't use ENUM, and we can't use a CHECK clause, how can we stop people from putting in something other than 'M', 'F', 'O', or NULL?
With old versions we'd have to make views with CHECK OPTION clauses, or perhaps foreign-key references. Nowadays we can make triggers. For example:
DELIMITER // CREATE TRIGGER check_sex AFTER INSERT ON pet FOR EACH ROW BEGIN IF new.sex COLLATE latin1_bin NOT IN ('M','F','O') AND new.sex IS NOT NULL THEN SIGNAL SQLSTATE '22222' SET MESSAGE_TEXT='sex must be ''M'' or ''F'' or ''O'' or NULL'; END IF; END//
For historical reasons that's not a MySQLish practice, though. Ordinarily I'd expect that people will hope that application code will keep the input clean, and will do periodic cleanups when they find that application code does not keep the input clean.
The MySQL manual is correct about the way to design a "My Pets" database. But if a database description will consistently map to items in the real big wide world, there are going to be multiple things to consider.