Firebird Documentation Index → Firebird 2.1 Language Ref. Update → Notes → Character set NONE data accepted “as is” |
Firebird 1.5.1 has improved the way character set NONE data are moved to and from fields or variables with another character set, resulting in fewer transliteration errors.
In Firebird 1.5.0, from a client connected with character set NONE, you could read data in two incompatible character sets – such as SJIS (Japanese) and WIN1251 (Russian) – even though you could not read one of those character sets while connected from a client with the other character set. Data would be received “as is” and be stored without raising an exception.
However, from this character set NONE client connection, an attempt to update any Russian or Japanese data columns using either parameterized queries or literal strings without introducer syntax would fail with transliteration errors; and subsequent queries on the stored “NONE” data would similarly fail.
In Firebird 1.5.1, both problems have been circumvented. Data received from the client in character set NONE are still stored “as is” but what is stored is an exact, binary copy of the received string. In the reverse case, when stored data are read into this client from columns with specific character sets, there will be no transliteration error. When the connection character set is NONE, no attempt is made in either case to resolve the string to well-formed characters, so neither the write nor the read will throw a transliteration error.
This opens the possibility for working with data from multiple character sets in a single database, as long as the connection character set is NONE. The client has full responsibility for submitting strings in the appropriate character set and converting strings returned by the engine, as needed.
Abstraction layers that have to manage this can read the low byte of the
sqlsubtype
field in the XSQLVAR structure,
which contains the character set identifier.
While character set NONE literals are accepted and implicitly stored in the character set of their context, the use of introducer syntax to coerce the character sets of literals is highly recommended when the application is handling literals in a mixture of character sets. This should avoid the string's being misinterpreted when the application shifts the context for literal usage to a different character set.
Coercion of the character set, using the introducer syntax or casting, is still
required when handling heterogeneous character sets from a client context that is anything
other than NONE. Both methods are shown below, using character set
ISO8859_1 as an example target. Notice the
“_
” prefix in the introducer syntax.
_ISO8859_1
mystring
CAST (
mystring
AS
VARCHAR(n
) CHARACTER SET ISO8859_1)
Firebird Documentation Index → Firebird 2.1 Language Ref. Update → Notes → Character set NONE data accepted “as is” |