The Server SQL Mode
In MySQL 4.0, a server SQL mode system variable named
sql_mode
was introduced to allow configuring certain aspects of how the server executes SQL statements. Initially, this variable could be set only by means of the
--sql-mode
startup option. As MySQL 4.1.1, the SQL mode also can be changed at runtime and individual clients can change the mode to affect their own connection. This means that any client can change how the server behaves in relation to itself without impact on other
The SQL mode affects behaviors such as identifier quoting and handling of invalid values during data entry. The following list describes a few of the possible mode values:
When you set the SQL mode, specify a value consisting of one or more mode values separated by commas, or an empty string to clear the value. Mode values are not case sensitive. To set the SQL mode when you start the server, use the --sql-mode option on the command line or in an option file: --sql-mode="ANSI" --sql-mode="ANSI_QUOTES,PIPES_AS_CONCAT" To change the SQL mode at runtime, set the sql_mode system variable with a SET statement:
To determine the current value of the session or global SQL mode, use these statements: SELECT @@SESSION.sql_mode; SELECT @@GLOBAL.sql_mode;
The value returned consists of a comma-separated list of enabled modes, or an empty value if no modes are enabled. The full set of mode values is given in the description of the
sql_mode
variable in Appendix D, "System, Status, and User Variable Reference." For discussion of SQL mode values that affect handling of erroneous or missing values during data entry, see "How MySQL Handles Invalid Data Values," in Chapter 3. General background on system
|
Character Set Support
Prior to MySQL 4.1, the server operates using a single character set at a time. As of MySQL 4.1, the server can support multiple character sets
This section provides general background on using MySQL's character set support. Chapter 3 provides more specific discussion of character sets, collations, binary versus non-binary strings, and how to define character-based table columns and work with them. Chapter 11 discusses how to configure which character sets the server makes available. That chapter also includes notes on what to do when upgrading older tables to MySQL 4.1 so that you can use the new features. Character Set Support Before MySQL 4.1
Prior to MySQL 4.1, string values in MySQL have no explicit character set. Instead, string constants and column values always are interpreted with respect to the server's character set. By default, this is the character set selected when the server was built (usually
latin1
), but the built-in value may be overridden at runtime with the
--default-
The
The solution to this problem is to rebuild the indexes for each existing table that has character-based indexes to use the collating order of the new character set. A table can be converted in various ways:
Despite the
When you upgrade an older server to MySQL 4.1 or
Character Set Support in MySQL 4.1 and UpIn MySQL 4.1, character set support was revised considerably to provide the following features:
You cannot mix character sets within a string, or use different character sets for different rows of a given column. However, by using a Unicode character set (which represents the encodings for many languages within a single character set), you may be able to implement
Specifying Character SetsCharacter set and collation assignments can be made at several levels, from the default used by the server to the character set used for individual strings.
The server's default character set and collation are built in at compile time. You can override them at server startup time by using the
--character-set-server
and
--collation-server
options. If you specify only the character set, its default collation becomes the server's default collation. If you specify a collation, it must be compatible with the character set. (A collation is compatible with a character set if its name begins with the character set
In SQL statements that create databases and tables, two clauses are used for specifying database, table, and column character set and collation values: CHARACTER SET charset COLLATE collation charset is the name of a character set supported by the server, and collation is the name of one of the character set's collations. These clauses can be specified together or separately. If both are given, the collation name must be compatible with the character set. If only CHARACTER SET is given, its default collation is used. If only COLLATE is given, the character set is implicit in the first part of the character set name.
It's also possible to sort string values using a specific collation by using the COLLATE operator. For example, if c is a latin1 column that has the default collation of latin1_swedish_ci , but you want to order it using Spanish sorting rules, do this: SELECT c FROM t ORDER BY c COLLATE latin1_spanish_ci; Determining Character Set Availability and Current SettingsTo find out which character sets and collations are available, use these statements: SHOW CHARACTER SET; SHOW COLLATION;
Each of them supports a
LIKE
clause that narrows the results to those character set or collation
mysql>
SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
Charset Description Default collation Maxlen
+---------+-----------------------------+-------------------+--------+
latin1 ISO 8859-1 West European latin1_swedish_ci 1
latin2 ISO 8859-2 Central European latin2_general_ci 1
latin5 ISO 8859-9 Turkish latin5_turkish_ci 1
latin7 ISO 8859-13 Baltic latin7_general_ci 1
+---------+-----------------------------+-------------------+--------+
This statement lists the collations available for the utf8 character set:
mysql>
SHOW COLLATION LIKE 'utf8%';
+--------------------+---------+-----+---------+----------+---------+
Collation Charset Id Default Compiled Sortlen
+--------------------+---------+-----+---------+----------+---------+
utf8_general_ci utf8 33 Yes Yes 1
utf8_bin utf8 83 Yes 1
utf8_unicode_ci utf8 192 Yes 8
utf8_icelandic_ci utf8 193 Yes 8
utf8_latvian_ci utf8 194 Yes 8
utf8_romanian_ci utf8 195 Yes 8
utf8_slovenian_ci utf8 196 Yes 8
utf8_polish_ci utf8 197 Yes 8
utf8_estonian_ci utf8 198 Yes 8
utf8_spanish_ci utf8 199 Yes 8
utf8_swedish_ci utf8 200 Yes 8
utf8_turkish_ci utf8 201 Yes 8
utf8_czech_ci utf8 202 Yes 8
utf8_danish_ci utf8 203 Yes 8
utf8_lithuanian_ci utf8 204 Yes 8
utf8_slovak_ci utf8 205 Yes 8
utf8_spanish2_ci utf8 206 Yes 8
+--------------------+---------+-----+---------+----------+---------+
As can be seen in the output from these statements, each character set has at least one collation and one of them is its default collation. To display the server's current character set and collation settings, use SHOW VARIABLES : mysql> SHOW VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ Variable_name Value +--------------------------+--------+ character_set_client latin1 character_set_connection latin1 character_set_database latin1 character_set_results latin1 character_set_server latin1 character_set_system utf8 +--------------------------+--------+ mysql> SHOW VARIABLES LIKE 'collation\_%'; +----------------------+-------------------+ Variable_name Value +----------------------+-------------------+ collation_connection latin1_swedish_ci collation_database latin1_swedish_ci collation_server latin1_swedish_ci +----------------------+-------------------+ Unicode Support
One of the reasons there are so many character sets is that different encodings have been developed for different languages. This
The goal of Unicode is to provide a unified character-encoding system within which character sets for all languages can be represented in a consistent manner. In MySQL, Unicode support is provided through two character sets:
|