Look at most libraries that talk between application programming languages and relational databases, and you'll notice that they map the string type in the database (char or varchar) to a string type in the programming language. Simple, obvious, but perhaps it's wrong.
The reason I question this is that SQL varchars are fixed length, while most application language strings handle any length. This causes lots of potential problems on database updates as you always have the risk of updating the database with a string that's too large.
One way of dealing with this is to create a fixed length string type, where instances know both the length and their value. That way whenever you assign a string value to them, they can check it against their length. Such an object can then throw an exception or truncate, or execute some other behavior. Indeed the behavior of too long an input string can be added to the instance data.
Using such a type can make the UI better since UI field widgets can interrogate the fixed length string for its size and make a widget that only takes that size of input. That's by far the nicest way of dealing with over-long input strings, but it's only possible if the information is brought forward from the database. Usually such information gets lost.
This notion is a specific example of more general design issues.
- Insulating the data store, is good, but you still have to live by the constraints it imposes on you.
- People are often reluctant to create simple value types when they can often make things much easier (see When To Make a Type for more)
- Putting simple validations in the UI results in a nicer interface. The trick is to find ways of doing that without duplicating the validation logic.
An object that holds and validates a string can do more than just length check. You can include such things as checking against a regular expression. But length checks are a simple example that makes dealing with databases easier.