Ah, no wonder.
"TEXT" in MySQL is basically equivalent to Access's "Memo", and you definitely don't want a Memo as a key!
Since you want to use your own format, integer isn't appropriate, so you need to use a smaller character data type. If your format is always same length, use CHAR(8) (assuming that 8 is the length of your format, "XX-XXXXX". If your format can vary, then it's more complicated. If it's only one or two characters, I'd stick with CHAR(X) with x being your biggest size, but if it can vary considerably (e.g., one can be "XXX-XXX" and other can be "XXXX-XXXX-XXXX", then use VARCHAR(X), with X again being your biggest size you ever need.
CHAR() means a fixed length string, so it always consume same amount of space, regardless of what is actually in it (all strings get padded with spaces to right), while VARCHAR() is variable-length string and only use as much space as needed to store the given string, plus a extra byte to give the size.
A even better solution is to add a new field and use it as key. That's named surrogate key because it's only for internal use, has no meaning, and will be much compact than a piece of string and can be functionally dependent on the current project ID. Call it "ProjectID" while the original ProjectiD would be probably something like "ProjectCode" because it's meaningful but not used as a key.
Regarding the question of storings ID as a number and display it at runtime: That is doable and with MySQL's extension for Zerofill, it's even possible with numeric fields which isn't possible in Access (e.g. you want leading zeroes; 000-0001... That can be done in MySQL by specifying ZEROFILL attribute.
The only consequence of doing this is that it coverts the integer to an unsigned integer, something that Access does not support. Assuming we're using INT here, we can certainly use 0 to 2 billion-something with no problem, but as we pass that mark, Access will not like it and the results may be undefined.
HTH.