:meta-keywords: cubrid strings, charset, codeset, collation, cubrid locale :meta-description: Globalization includes internationalization and localization. Internationalization can be applied to various languages and regions. Localization fits the language and culture in a specific area as appending the language-specific components. CUBRID supports multilingual collations including Europe and Asia to facilitate the localization. .. _globalization-overview: An Overview of Globalization ============================ Character data -------------- Character data (strings) may be stored with VARCHAR(STRING), CHAR, ENUM, and they support charset and collation. Charset(character set, codeset) controls how characters are stored (on any type of storage) as bytes, or how a series of bytes forms a character. CUBRID supports ISO-88591-1, UTF-8 and EUC-KR charsets. For UTF-8, we support only the Unicode characters up to codepoint 10FFFF (encoded on up to four bytes). For instance, the character "?" is encoded in codeset ISO-8859-1 using a single byte (C7), in UTF-8 is encoded with 2 bytes (C3 88), while in EUC-KR this character is not available. Collation decides how strings compare. Most often, users require case insensitive and case sensitive comparisons. For instance, the strings "ABC" and "abc" are equal in a case insensitive collation, while in a case sensitive collation, they are not, and depending on other collation settings, the relationship can be "ABC" < "abc" , or "ABC" > "abc". Collation means more than comparing character casing. Collation decides the relationship between two strings (greater, lower, equal), is used in string matching (LIKE), or computing boundaries in index scan. In CUBRID, a collation implies a charset. For instance, collations "utf8_en_ci" and "iso88591_en_ci" perform case insensitive compare, but operate on different charsets. Although for ASCII range, in these particular cases the results are similar, the collation with "utf8_en_ci" is slower, since it needs to work on variable number of bytes (UTF-8 encoding). * "'a' COLLATE iso88591_en_ci" indicates "_iso88591'a' COLLATE iso88591_en_ci". * "'a' COLLATE utf8_en_ci" indicates "_utf8'a' COLLATE utf8_en_ci". All string data types support precision. Special care is required with fixed characters(CHAR). The values of this types are padded to fill up the precision. For instance, inserting "abc" into a CHAR(5) column, will result in storing "abc " (2 padding spaces are added). Space (ASCII 32 decimal, Unicode 0020) is the padding character for most charsets. But, for EUC-KR charset, the padding consists of one character which is stored with two bytes (A1 A1). Related Terms ------------- .. In the below, currency part is removed because MONETARY is deprecated. * **Character set**: A group of encoded symbols (giving a specific number to a certain symbol) * **Collation**: A set of rules for comparison of characters in the character set and for sorting data * **Locale**: A set of parameters that defines any special variant preferences such as number format, calendar format (month and day in characters), date/time format, and collation depending on the operator's language and country. Locale defines the linguistic localization. Character set of locale defines how the month in characters and other data are encoded. A locale identifier consists of at least a language identifier and a region identifier, and it is expressed as language[_territory][.codeset] (For example, Australian English using UTF-8 encoding is written as en_AU.UTF-8). * **Unicode normalization**: The specification by the Unicode character encoding standard where some sequences of code points represent essentially the same character. CUBRID uses Normalization Form C (NFC: codepoint is decomposed and then composed) for input and Normalization Form D (NFD: codepoint is composed and then decomposed) for output. However, CUBRID does not apply the canonical equivalence rule as an exception. For example, canonical equivalence is applied in general NFC rule so codepoint 212A (Kelvin K) is converted to codepoint 4B (ASCII code uppercase K). Since CUBRID does not perform the conversion by using the canonical equivalence rule to make normalization algorithm quicker and easier, it does not perform reverse-conversion, too. * **Canonical equivalence**: A basic equivalence between characters or sequences of characters, which cannot be visually distinguished when they are correctly rendered. For example, let's see '?' ('A' with an angstrom). '?' (Unicode U + 212B) and Latin 'A' (Unicode U + 00C5) have same A and different codepoints, however, the decomposed result is 'A' and U+030A, so it is canonical equivalence. * **Compatibility equivalence**: A weaker equivalence between characters or sequences of characters that represent the same abstract character. For example, let's see number '2' (Unicode U + 0032) and superscript '?'(Unicode U + 00B2). '?' is a different format of number '2', however, it is visually distinguished and has a different meaning, so it is not canonical equivalence. When normalizing '2?' with NFC, '2?' is maintained since it uses canonical equivalence. However, with NFKC, '?' is decomposed to '2' which is compatibility equivalence and then it can be recomposed to '22'. Unicode normalization of CUBRID does not apply the compatibility equivalence rule. For explanation on Unicode normalization, see :ref:`unicode-normalization`. For more details, see http://unicode.org/reports/tr15/. The default value of the system parameter related to Unicode normalization is unicode_input_normalization=no and unicode_output_normalization=no. For a more detailed description on parameters, see :ref:`stmt-type-parameters`. Locale Attributes ----------------- Locale is defined by following attributes. .. ", monetary currency" is removed from above: MONETARY is deprecated. * **Charset (codeset)**: How bytes are interpreted into single characters (Unicode codepoints) * **Collations**: Among all collations defined in locale of `LDML(UNICODE Locale Data Markup Language) `_ file, the last one is the default collation. Locale data may contain several collations. * **Alphabet (casing rules)**: One locale data may have up 2 alphabets, one for identifier and one for user data. One locale data can have two types of alphabets. * **Calendar**: Names of weekdays, months, day periods (AM/PM) * **Numbering settings**: Symbols for digit grouping * **Text conversion data**: For CSQL conversion. Option. * **Unicode normalization data**: Data converted by normalizing several characters with the same shape into one based on a specified rule. After normalization, characters with the same shape will have the same code value even though the locale is different. Each locale can activate/deactivate the normalization functionality. .. note:: Generally, locale supports a variety of character sets. However, CUBRID locale supports both ISO and UTF-8 character sets for English and Korean. The other operator-defined locales using the LDML file support the UTF-8 character set only. .. _collation-properties: Collation Properties -------------------- A collation is an assembly of information which defines an order for characters and strings. In CUBRID, collation has the following properties. * **Strength**: This is a measure of how "different" basic comparable items (characters) are. This affects selectivity. In LDML files, collation strength is configurable and has four levels. For example a Case insensitive collation should be set with level = "secondary" (2) or "primary" (1). * Whether it supports or not **expansions** and **contractions** Each column has a collation, so when applying :func:`LOWER`, :func:`UPPER` functions the casing rules of locale which defines the collation's default language is used. Depending on collation properties some CUBRID optimizations may be disabled for some collations: * **LIKE** rewrite: is disabled for collations which maps several different character to the same weight (case insensitive collations for example) and for collations with expansions. * Covering index scan: disabled for collations which maps several different character to the same weight (see :ref:`covering-index`). For more information, see :ref:`collation-setting-impacted-features` . .. _collation-naming-rules: Collation Naming Rules ---------------------- The collation name in CUBRID follows the conversion: :: ____... * : The full charset name as used by CUBRID. iso88591, utf8, euckr. * : a region/language specific. The language code is expected as two characters; en, de, es, fr, it, ja, km, ko, tr, vi, zh, ro. "gen" if it does not address a specific language, but a more general sorting rule. * __...: They have the following meaning. Most of them apply only to LDML collations. * ci: case insensitive In LDML, can be obtained using the settings: strength="secondary" caseLevel="off" caseFirst="off". * cs: case sensitive; By default all collations are case sensitive. In LDML, can be obtained using at least: strength="tertiary". * bin: it means that the sorting order under such collation is almost the same with the order of codepoints; If memory (byte) comparison is used, then almost the same result is obtained. Space character and EUC double-byte padding character are always sorted as zero in "bin" collation. No collations with such setting are currently configured in LDML (they are already available as built-in), but a similar one can be obtained using the maximum setting strength="quaternary" or strength="identical". * ai: accent insensitive; this means that '?' is sorted the same as 'A'. Due to particularities of the UCA based algorithms, an accent insensitive collation is also a case insensitive collation. In LDML, can be obtained using: strength="primary". * uca: this signals a UCA based collation; this is used only to differentiate such collations from similar built-in variants. All LDML collations are based on UCA, but in order to keep shorter names only two collations ( 'utf8_ko_cs_uca' , 'utf8_tr_cs_uca' ) have this description in their names, in order to differentiate them from 'utf8_ko_cs' and 'utf8_tr_cs' collations. * exp: this collations use a full-word matching/compare algorithm, contrary to the rest of collations which use character-by-character compare. This collation uses a more complex algorithm, with multiple passes which is much slower, but may prove useful for alphabetical sorts. In LDML, the :ref:`expansion` needs to be explicit by adding CUBRIDExpansions="use". * ab: accent backwards; it is particularity of French-Canadian sorting, where level 2 of UCA (used to store accents weights) is compared from end of string towards the beginning. This collation setting can be used only when :ref`expansion` setting is also activated. The "backwards" setting allows for the following sorting: * Normal Accent Ordering: cote < cot¨¦ < c?te < c?t¨¦ * Backward Accent Ordering: cote < c?te < cot¨¦ < c?t¨¦ * cbm: contraction boundary match; it is a particularity of collations with :ref:`expansion` and :ref:`contraction` and refers to how it behaves at string matching when a :ref:`contraction` is found. Suppose the collation has defined the :ref:`contraction` "ch"; then normally, the pattern "bac" will not match the string"bachxxx" But when the collation is configured to allow "matching the characters starting a contraction", the above matching will return a positive. Only one collation is configured in this manner - 'utf8_ja_exp_cbm' - Japanese sorting requires a lot of contractions. The collation names are not dynamically generated. They are user defined (configured in LDML), and should reflect the settings of the collation. The name of collation influences the internal numeric id of the collation. For instance, in CUBRID only 256 collations are allowed, and the numeric IDs are assigned as: * 0 -31: built-in collations (for these collations the name and id are hard-coded) * 32 - 46: LDML collations having "gen" as "language" part * 47 - 255: the rest of LDML collations If you want to include all locales into the database which CUBRID provide, first, copy cubrid_locales.all.txt of $CUBRID/conf directory into cubrid_locales.txt and next, run make_locale script(in extension, Linux is .sh, Windows is .bat). For more details on make_locale script, see :ref:`locale-compilation`. If you want to include the newly added locale information into the existing database, run "cubrid synccolldb ". For more information, see :ref:`synccolldb`. If you include all locales defined in LDML files, CUBRID has the following collations. .. _cubrid-all-collation: CUBRID Collation ^^^^^^^^^^^^^^^^ +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | Collation | Locale for casing | Character range | +===================+=======================================================================+===========================================+ | iso88591_bin | en_US - English | ASCII + ISO88591 (C0-FE, except D7, F7) | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | iso88591_en_cs | en_US - English | ASCII + ISO88591 (C0-FE, except D7, F7) | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | iso88591_en_ci | en_US - English | ASCII + ISO88591 (C0-FE, except D7, F7) | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_bin | en_US - English | ASCII | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | euckr_bin | ko_KR - Korean, same as en_US - English | ASCII | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_en_cs | en_US - English | ASCII | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_en_ci | en_US - English | ASCII | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_tr_cs | tr_TR - Turkish | Turkish alphabet | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_ko_cs | ko_KR - Korean, same as en_US - English | ASCII | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_gen | de_DE - German, generic Unicode casing customized with German rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_gen_ai_ci | de_DE - German, generic Unicode casing customized with German rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_gen_ci | de_DE - German, generic Unicode casing customized with German rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_de_exp_ai_ci | de_DE - German, generic Unicode casing customized with German rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_de_exp | de_DE - German, generic Unicode casing customized with German rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_ro_cs | ro_RO - Romanian, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_es_cs | es_ES - Spanish, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_fr_exp_ab | fr_FR - French, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_ja_exp | ja_JP - Japanese, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_ja_exp_cbm | ja_JP - Japanese, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_km_exp | km_KH - Cambodian, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_ko_cs_uca | ko_KR - Korean, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_tr_cs_uca | tr_TR - Turkish, generic Unicode casing customized with Turkish rules | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | utf8_vi_cs | vi_VN - Vietnamese, same as generic Unicode casing | All Unicode codepoints in range 0000-FFFF | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ | binary | none (invariant to casing operations) | any byte value (zero is nul-terminator) | +-------------------+-----------------------------------------------------------------------+-------------------------------------------+ The Turkish casing rules changes the casing for character i,I,?,?. The German casing rules changes the casing for ?. On the above collations, 9 collations like iso88591_bin, iso88591_en_cs, iso88591_en_ci, utf8_bin, euckr_bin, utf8_en_cs, utf8_en_ci, utf8_tr_cs and utf8_ko_cs, are built in the CUBRID before running make_locale script. If a collation is included in more than one locale (.ldml) file, the locale for casing (default locale of collation) is the locale in which it is first included. The order of loading is the locales order from $CUBRID/conf/cubrid_locales.txt. The above locale casing for collations utf8_gen, utf8_gen_ci, utf8_gen_ai_ci, assumes the default order (alphabetical) in cubrid_locales.txt, so the default locale for all generic LDML collations is de_DE (German). Files For Locale Setting ------------------------ CUBRID uses following directories and files to set the locales. * **$CUBRID/conf/cubrid_locales.txt** file: A configuration file containing the list of locales to be supported * **$CUBRID/conf/cubrid_locales.all.txt** file: A configuration file template with the same structure as **cubrid_locales.txt**. Contains the entire list of all the locales that the current version of CUBRID is capable of supporting without any efforts from the end user's side. * **$CUBRID/locales/data** directory: This contains files required to generate locale data. * **$CUBRID/locales/loclib** directory: contains a C header file, **locale_lib_common.h** and OS dependent makefile which are used in the process of creating / generating locales shared libraries. * **$CUBRID/locales/data/ducet.txt** file: Text file containing default universal collation information (codepoints, contractions and expansions, to be more specific) and their weights, as standardized by The Unicode Consortium, which is the starting point for the creation of collations. For more information, see http://unicode.org/reports/tr10/#Default_Unicode_Collation_Element_Table . * **$CUBRID/locales/data/unicodedata.txt** file: Text file containing information about each Unicode codepoint regarding casing, decomposition, normalization etc. CUBRID uses this to determine casing. For more information, see https://docs.python.org/3/library/unicodedata.html . * **$CUBRID/locales/data/ldml** directory: common_collations.xml and XML files, name with the convention cubrid_<*locale_name*>.xml. common_collations.xml file contains shared collation information in all locale files, and each cubrid_<*locale_name*>.xml file contains a locale information for the supported language. * **$CUBRID/locales/data/codepages** directory: contains codepage console conversion for single byte codepages(8859-1.txt , 8859-15.txt, 8859-9.txt) and codepage console conversion for double byte codepages(CP1258.txt , CP923.txt, CP936.txt , CP949.txt). * **$CUBRID/bin/make_locale.sh** file or **%CUBRID%\\bin\\make_locale.bat** file: A script file used to generate shared libraries for locale data * **$CUBRID/lib** directory: Shared libraries for generated locales will be stored here. .. _locale-setting: Locale Setting ============== When you want to use a charset and collation of a specific language, the charset should be identical with a database which will be created newly. Supported CUBRID charsets are ISO-8859-1, EUC-KR and UTF-8 and the charset to be used is specified when creating a database. For example, when you created a database with a locale ko_KR.utf8, you can use collations starting with "utf8\_" like utf8_ja_exp. However, if you set the locale as ko_KR.euckr, you cannot use all collations which are related with other charset(see :ref:`cubrid-all-collation`). The following is an example which used utf8_ja_exp after creating a database with en_US.utf8. #. cd $CUBRID/conf #. cp cubrid_locales.all.txt cubrid_locales.txt #. make_locale.sh -t64 # 64 bit locale library creation #. cubrid createdb testdb en_US.utf8 #. cubrid server start testdb #. csql -u dba testdb #. run below query on csql .. code-block:: sql SET NAMES utf8; CREATE TABLE t1 (i1 INT , s1 VARCHAR(20) COLLATE utf8_ja_exp, a INT, b VARCHAR(20) COLLATE utf8_ja_exp); INSERT INTO t1 VALUES (1, '¤¤¥¤»ù±P',1,'¤¤¥¤ ÀO'); For more details, see the following. .. _locale-selection: Step 1: Selecting a Locale -------------------------- Configure locales to use on **$CUBRID/conf/cubrid_locales.txt**. You can select all or some of locales which are supported. CUBRID supports locales as follows: en_US, de_DE, es_ES, fr_FR, it_IT, ja_JP, km_KH, ko_KR, tr_TR, vi_VN, zh_CN, ro_RO. The language and country for each locale are shown in the following table. +-----------------+------------------------+ | Locale Name | Language - Country | +-----------------+------------------------+ | en_US | English - U.S.A. | +-----------------+------------------------+ | de_DE | German - Germany | +-----------------+------------------------+ | es_ES | Spanish - Spain | +-----------------+------------------------+ | fr_FR | French - France | +-----------------+------------------------+ | it_IT | Italian - Italy | +-----------------+------------------------+ | ja_JP | Japanese - Japan | +-----------------+------------------------+ | km_KH | Khmer - Cambodia | +-----------------+------------------------+ | ko_KR | Korean - Korea | +-----------------+------------------------+ | tr_TR | Turkish - Turkey | +-----------------+------------------------+ | vi_VN | Vietnamese - Vietnam | +-----------------+------------------------+ | zh_CN | Chinese - China | +-----------------+------------------------+ | ro_RO | Romanian - Romania | +-----------------+------------------------+ .. note:: The LDML files for the supported locales are named cubrid_<*locale_name*>.xml and they can be found in the **$CUBRID/locales/data/ldml** directory. If only a subset of these locales are to be supported by CUBRID, one must make sure their corresponding LDML files are present in the **$CUBRID/locales/data/ldml** folder. A locale cannot be used by CUBRID, unless it has an entry in **cubrid_locales.txt file** and it has a corresponding cubrid_<*locale_name*>.xml. Locale libraries are generated according to the contents of **$CUBRID/conf/cubrid_locales.txt** configuration file. This file contains the language codes of the wanted locales (all user defined locales are generated with UTF-8 charset). Also, in this file can be configured the file paths for each locale LDML file and libraries can be optionally configured. :: ko_KR /home/CUBRID/locales/data/ldml/cubrid_ko_KR.xml /home/CUBRID/lib/libcubrid_ko_KR.so By default, the LDML files are found in **$CUBRID/locales/data/ldml** and the locale libraries in **$CUBRID/lib**; the filenames for LDML are formatted like: cubrid_<*lang_name*>.ldml. The filenames for libraries: libcubrid_<*lang_name*>.dll (.so for Linux). .. _locale-compilation: Step 2: Compiling Locale ------------------------ Once the requirements described above are met, the locales can be compiled. Regarding the embedded locales in CUBRID, they can be used without compiling user locale library, so they can be used by skipping the step 2. But there are differences between the embedded locale and the library locale. Regarding this, see :ref:`Built-in Locale and Library Locale `. To compile the locale libraries, one must use the **make_locale** (**.bat** for Windows and **.sh** for Linux) utility script from command console. The file is delivered in **$CUBRID/bin** folder so it should be resolved by **$PATH** environment variable. Here **$CUBRID, $PATH** are the environment variables of Linux, **%CUBRID%**, **%PATH%** are the environment variables of Windows. .. note:: To run a **make_locale** script in Windows, it requires Visual C++ 2005, 2008 or 2010. Usage can be displayed by running **make_locale.sh -h**. (**make_locale /h** in Windows.) :: make_locale.sh [options] [locale] options ::= [-t 32|64 ] [-m debug|release] locale ::= [de_DE|es_ES|fr_FR|it_IT|ja_JP|km_KH|ko_KR|tr_TR|vi_VN|zh_CN|ro_RO] * *options* * **-t**: Selects 32bit or 64bit (default value: **64**). * **-m**: Selects release or debug. In general, release is selected (default value: release). The debug mode is provided for developers who would like to write the locale library themselves. Selects release or debug. In general, release is selected (default value: release). The debug mode is provided for developers who would like to write the locale library themselves. * *locale*: The locale name of the library to build. If *locale* is not specified, the build includes data from all configured locales. In this case, library file is stored in **$CUBRID/lib** directory with the name of **libcubrid_all_locales.so** (**.dll** for Windows). To create user defined locale shared libraries, two choices are available: * Creating a single lib with all locales to be supported. :: make_locale.sh -t64 # Build and pack all locales (64/release) * Creating one lib for each locale to be supported. :: make_locale.sh -t 64 -m release ko_KR The first choice is recommended. In this scenario, some data may be shared among locales. If you choose the first one, a lib supporting all locales has less than 15 MB; in the second one, consider for each locale library from 1 MB to more than 5 MB. Also the first one is recommended because it has no runtime overhead during restarting the servers when you choose the second one. .. warning:: **Limitations and Rules** * Do not change the contents of **$CUBRID/conf/cubrid_locales.txt** after locales generation; once the locales libraries are generated, the contents of **$CUBRID/conf/cubrid_locales.txt** should not be changed (order of languages within the file must also be preserved). During locale compiling, the generic collation uses the first one as default locale; changing the order may cause different results with casing for such collation (utf8_gen_*). * Do not change the contents for **$CUBRID/locales/data/*.txt** files. .. note:: **Procedure of Executing make_locale.sh(.bat) Script** The processing in **make_locale.sh(.bat)** script #. Reads the **.ldml** file corresponding to a language, along with some other installed common data files like **$CUBRID/locales/data/ducet.txt**, **$CUBRID/locales/data/unicodedata.txt**, and **$CUBRID/locales/data/codepages/*.txt** #. After processing of raw data, it writes in a temporary **$CUBRID/locales/loclib/locale.c** file C constants values and arrays consisting of locales data. #. The temporary file **locale.c** is passed to the platform compiler to build a **.dll/.so** file. This step assumes that the machines has an installed C/C++ compiler and linker. Currently, only the MS Visual Studio for Windows and gcc for Linux compilers are supported. #. Temporary files are removed. Step 3: Setting CUBRID to Use a Specific Locale ----------------------------------------------- Only one locale can be selected as the default locale when you create DB. In addition to the possibility of specifying a default locale, one can override the default calendar settings with the calendar settings from another locale, using the **intl_date_lang** system parameter. * The locale will be in the format: <*locale_name*>.[**utf8** | **iso**] (e.g. tr_TR.utf8, en_EN.ISO, ko_KR.utf8) * **intl_date_lang**: <*locale_name*>. The possible values for <*locale_name*> are listed on :ref:`locale-selection`. .. note:: **Setting the Month/Day in Characters, AM/PM, and Number Format** For the function that inputs and outputs the day/time, you can set the month/day in characters, AM/PM, and number format by the locale in the **intl_date_lang** system parameter. Also for the function that converts a string to numbers or the numbers to a string, you can set the string format by the locale in **intl_number_lang** system parameter. .. _built-in-locale-limit: Built-in Locale and Library Locale ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Regarding the embedded locales in CUBRID, they can be used without compiling user locale library, so they can be used by skipping the step 2. But there are two differences between the embedded locale and the library locale. * Embedded(built-in) locale(and collation) are not aware of Unicode data For instance, casing (lower, upper) of (?, ¨¢) is not available in embedded locales. The LDML locales provide data for Unicode codepoints up to 65535. * Also, the embedded collations deals only with ASCII range, or in case of 'utf8_tr_cs' - only ASCII and letters from Turkish alphabet. Embedded UTF-8 locales are not Unicode compatible, while compiled (LDML) locales are. Currently, the built-in locales which can be set during creating DB are as follows: * en_US.iso88591 * en_US.utf8 * ko_KR.utf8 * ko_KR.euckr * ko_KR.iso88591: Will have Romanized Korean names for month, day names. * tr_TR.utf8 * tr_TR.iso88591: Will have Romanized Turkish names for month, day names. The order stated above is important; if no charset is defined while creating DB, the charset is the charset of the locale shown first. For example, if the locale is set as ko_KR(e.g. cubrid createdb testdb ko_KR), the charset is specified as ko_KR.utf8, the first locale among the ko_KR in the above list. Locales of the other languages except the built-in locales should end with **.utf8**. For example, specify the locale as de_DE.utf8 for German. The names of month and day for ko_KR.iso88591 and tr_TR.iso88591 should be Romanized. For example, "???" for Korean (Sunday in English) is Romanized to "Iryoil". Providing ISO-8859-1 characters only is required. For more information, see :ref:`romanized-names`. .. _romanized-names: The Month/Day in Korean and Turkish Characters for ISO-8859-1 Charset ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In Korean or Turkish which have charset UTF-8 or in Korean which have charset EUC-KR, the month/day in characters and AM/PM are encoded according to the country. However, for ISO-8859-1 charset, if the month/day in characters and AM/PM in Korean or Turkish is used as its original encoding, an unexpected behavior may occur in the server process because of its complex expression. Therefore, the name should be Romanized. The default charset of CUBRID is ISO-8859-1 and the charset can be used for Korean and Turkish. The Romanized output format is as follows: **Day in Characters** +---------------------------------------+----------------------------------+----------------------------------+ | Day in Characters Long/Short Format | Long/Short Romanized Korean | Long/Short Romanized Turkish | +=======================================+==================================+==================================+ | Sunday / Sun | Iryoil / Il | Pazar / Pz | +---------------------------------------+----------------------------------+----------------------------------+ | Monday / Mon | Woryoil / Wol | Pazartesi / Pt | +---------------------------------------+----------------------------------+----------------------------------+ | Tuesday / Tue | Hwayoil / Hwa | Sali / Sa | +---------------------------------------+----------------------------------+----------------------------------+ | Wednesday / Wed | Suyoil / Su | Carsamba / Ca | +---------------------------------------+----------------------------------+----------------------------------+ | Thursday / Thu | Mogyoil / Mok | Persembe / Pe | +---------------------------------------+----------------------------------+----------------------------------+ | Friday / Fri | Geumyoil / Geum | Cuma / Cu | +---------------------------------------+----------------------------------+----------------------------------+ | Saturday / Sat | Toyoil / To | Cumartesi / Ct | +---------------------------------------+----------------------------------+----------------------------------+ **Month in Characters** +---------------------------------------+----------------------------------+----------------------------------+ | Month in Characters Long/Short Format | Long/Short Romanized Korean | Long/Short Romanized Turkish | | | (Not Classified) | | +=======================================+==================================+==================================+ | January / Jan | 1wol | Ocak / Ock | +---------------------------------------+----------------------------------+----------------------------------+ | February / Feb | 2wol | Subat / Sbt | +---------------------------------------+----------------------------------+----------------------------------+ | March / Mar | 3wol | Mart / Mrt | +---------------------------------------+----------------------------------+----------------------------------+ | April / Apr | 4wol | Nisan / Nsn | +---------------------------------------+----------------------------------+----------------------------------+ | May / May | 5wol | Mayis / Mys | +---------------------------------------+----------------------------------+----------------------------------+ | June / Jun | 6wol | Haziran / Hzr | +---------------------------------------+----------------------------------+----------------------------------+ | July / Jul | 7wol | Temmuz / Tmz | +---------------------------------------+----------------------------------+----------------------------------+ | August / Aug | 8wol | Agustos / Ags | +---------------------------------------+----------------------------------+----------------------------------+ | September / Sep | 9wol | Eylul / Eyl | +---------------------------------------+----------------------------------+----------------------------------+ | October / Oct | 10wol | Ekim / Ekm | +---------------------------------------+----------------------------------+----------------------------------+ | November / Nov | 11wol | Kasim / Ksm | +---------------------------------------+----------------------------------+----------------------------------+ | December / Dec | 12wol | Aralik / Arl | +---------------------------------------+----------------------------------+----------------------------------+ **AM/PM in Characters** +---------------------------------------+----------------------------------+----------------------------------+ | AM/PM in Characters Long/Short Format | Romanized in Korean | Romanized in Turkish | +=======================================+==================================+==================================+ | AM | ojeon | AM | +---------------------------------------+----------------------------------+----------------------------------+ | PM | ohu | PM | +---------------------------------------+----------------------------------+----------------------------------+ Step 4: Creating a Database with the Selected Locale Setting ------------------------------------------------------------ When issuing the command "**cubrid createdb** <*db_name*> <*locale_name.charset*>", a database will be created using the settings in the variables described above. Once the database is created a locale setting which was given to the database cannot be changed. The charset and locale name are stored in "**db_root**" system catalog table. .. _dumplocale: Step 5 (optional): Manually Verifying the Locale File ----------------------------------------------------- The contents of locales libraries may be displayed in human readable form using the **dumplocale** CUBRID utility. Execute **cubrid dumplocale -h** to output the usage. The used syntax is as follows. :: cubrid dumplocale [options] [language-string] options ::= -i|--input-file -d|--calendar -n|--numeric {-a |--alphabet=}{l|lower|u|upper|both} -c|--codepoint-order -w|--weight-order {-s|--start-value} {-e|--end-value} -k -z language-string ::= de_DE|es_ES|fr_FR|it_IT|ja_JP|km_KH|ko_KR|tr_TR|vi_VN|zh_CN|ro_RO * **dumplocale**: A command which dumps the contents of locale shared library previously generated using LDML input file. * *language-string*: One of de_DE, es_ES, fr_FR, it_IT, ja_JP, km_KH, ko_KR, tr_TR, vi_VN, zh_CN and ro_RO. Configures the locale language to dump the locale shared library. If it's not set, all languages which are configured on **cubrid_locales.txt** are given. The following are [options] for **cubrid dumplocale**. .. program:: dumplocale .. option:: -i, --input-file=FILE The name of the locale shared library file (< *shared_lib*>) created previously. It includes the directory path. .. option:: -d, --calendar Dumps the calendar and date/time data. Default value: No .. option:: -n, --numeric Dumps the number data. Default value: No .. option:: -a, --alphabet=l|lower|u|upper|both Dumps the alphabet and case data. Default value: No .. option:: --identifier-alphabet=l|lower|u|upper Dumps the alphabet and case data for the identifier. Default value: No .. option:: -c, --codepoint-order Dumps the collation data sorted by the codepoint value. Default value: No (displayed data: cp, char, weight, next-cp, char and weight) .. option:: -w, --weight-order Dumps the collation data sorted by the weight value. Default value: No (displayed data: weight, cp, char) .. option:: -s, --start-value=CODEPOINT Specifies the dump scope. Starting codepoint for **-a, --identifier-alphabet, -c, -w** options. Default value: 0 .. option:: -e, --end-value=CODEPOINT Specifies the dump scope. Ending codepoint for **-a, --identifier-alphabet, -c, -w** options. Default value: Max value read from the locale shared library. .. option:: -k, --console-conversion Dumps the data of console conversion. Default value: No .. option:: -z, --normalization Dumps the normalization data. Default value: No The following example shows how to dump the calendar, number formatting, alphabet and case data, alphabet and case data for the identifier, collation sorting based on the codepoint order, collation sorting based on the weight, and the data in ko_KR locale into ko_KR_dump.txt by normalizing: :: % cubrid dumplocale -d -n -a both -c -w -z ko_KR > ko_KR_dump.txt It is highly recommended to redirect the console output to a file, as it can be very big data, and seeking information could prove to be difficult. Step 6: Starting CUBRID-Related Processes ----------------------------------------- All CUBRID-related processes should be started in an identical environmental setting. The CUBRID server, the broker, CAS, and CSQL should use the locale binary file of an identical version. Also CUBRID HA should use the same setting. For example, in the CUBRID HA, master server, slave server and replica server should use the same environmental variable setting. There is no check on the compatibility of the locale used by server and CAS (client) process, so the user should make sure the LDML files used are the same. Locale library loading is one of the first steps in CUBRID start-up. Locale (collation) information is required for initializing databases structures (indexes depends on collation). This process is performed by each CUBRID process which requires locale information: server, CAS, CSQL, createdb, copydb, unload, load DB. The process of loading a locale library is as follows. * If no lib path is provided, CUBRID will try to load $CUBRID/lib/libcubrid_<*lang_name*>.so file; if this file is not found, then CUBRID assumes all locales are found in a single library: **$CUBRID/lib/libcubrid_all_locales.so**. * If suitable locale library cannot be found or any other error occurs during loading, the CUBRID process stops. * If collations between the database and the locale library are different, the CUBRID process cannot start. To include the newly changed collations of the locale library, firstly synchronize the database collation with the system collation by running **cubrid synccolldb** command. Next, update from the existing database to the wanted collations of schemas and data. For more details, see :ref:`synccolldb`. .. _synccolldb: Synchronization of Database Collations with System Collations ------------------------------------------------------------- CUBRID's normal operation requires that the system collation and the database collation must be the same. The system locale means that the locale which include built-in locales and library locales created through cubrid_locales.txt (see :ref:`locale-setting`), and it includes the system collation information. The database collation information is stored on the **_db_collation** system catalog table. **cubrid synccolldb** utility checks if the database collation is the same with the system collation, and synchronize into the system collation if they are different. However, note that this utility doesn't transform the data itself stored on the database. This utility can be used when the existing database collation should be changed after the system locale is changed. However, there are operations which the user have to do manually. The user should do this operations before the synchronization. These operations can be done by running CSQL with cubrid_synccolldb_<*database_name*>.sql file, which is created by **cubrid synccolldb -c**. * Change collation using ALTER TABLE .. MODIFY statement. * Remove any views, indexes, triggers or partitions containing the collation. Run synchronization with **cubrid synccolldb**. After then, do the following operations. * Recreate views, indexes, triggers, or partitions * Update application statements to use new collations This utility should work only in offline mode. **synccolldb** syntax is as follows. :: cubrid synccolldb [options] database_name * **cubrid**: An integrated utility for the CUBRID service and database management. * **synccolldb**: A command to synchronize collations of a database with collations from the system(according to contents of locales libraries and $CUBRID/conf/cubrid_locales.txt). * *database_name*: A database name to be synchronized with collations from the system. If [options] is omitted, **synccolldb** checks the collation differences between the system and the database, synchronize the database collation with the system collation, and create the cubrid_synccolldb_<*database_name*>.sql file including the queries of objects to be dropped before the synchronization. The following are [options] which are used on **cubrid synccolldb**. .. program:: synccolldb .. option:: -c, --check-only This option prints out the collation information which is different between the database collation and the system collation. .. option:: -f, --force-only This option doesn't ask when updating the database collation with the system collation. The following shows that how it works when the system collation and the database collation are different. Firstly, make locale library about ko_KR locale. :: $ echo ko_KR > $CUBRID/conf/cubrid_locales.txt $ make_locale.sh -t 64 Next, create the database. :: $ cubrid createdb --db-volume-size=20M --log-volume-size=20M xdb en_US Create a schema. At this time, specify the needed collation in each table. :: $ csql -S -u dba xdb -i in.sql .. code-block:: sql CREATE TABLE dept(depname STRING PRIMARY KEY) COLLATE utf8_ko_cs_uca; CREATE TABLE emp(eid INT PRIMARY KEY, depname STRING,address STRING) COLLATE utf8_ko_cs_uca; ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY (depname) REFERENCES dept(depname); Change the locale setting of the system. If you do not any values on **cubrid_locales.txt**, the database consider that only built-in locales exist :: $ echo "" > $CUBRID/conf/cubrid_locales.txt Check the difference between system and database by running **cubrid synccolldb -c** command. :: $ cubrid synccolldb -c xdb ---------------------------------------- ---------------------------------------- Collation 'utf8_ko_cs_uca' (Id: 133) not found in database or changed in new system configuration. ---------------------------------------- ---------------------------------------- Collation 'utf8_gen_ci' (Id: 44) not found in database or changed in new system configuration. ---------------------------------------- ---------------------------------------- Collation 'utf8_gen_ai_ci' (Id: 37) not found in database or changed in new system configuration. ---------------------------------------- ---------------------------------------- Collation 'utf8_gen' (Id: 32) not found in database or changed in new system configuration. ---------------------------------------- ---------------------------------------- There are 4 collations in database which are not configured or are changed compared to system collations. Synchronization of system collation into database is required. Run 'cubrid synccolldb -f xdb' If the indexes exist, firstly you should remove the indexes, and change the collation of each table, then recreate the indexes directly. The process to remove indexes and change the collation of tables can be executed by using cubrid_synccolldb_xdb.sql file which was created by **synccolldb** command. On the below example, a foreign key is the index which you should recreate. :: $ cat cubrid_synccolldb_xdb.sql ALTER TABLE [dept] COLLATE utf8_bin; ALTER TABLE [emp] COLLATE utf8_bin; ALTER TABLE [emp] DROP FOREIGN KEY [fk_emp_depname]; ALTER TABLE [dept] MODIFY [depname] VARCHAR(1073741823) COLLATE utf8_bin; ALTER TABLE [emp] MODIFY [address] VARCHAR(1073741823) COLLATE utf8_bin; ALTER TABLE [emp] MODIFY [depname] VARCHAR(1073741823) COLLATE utf8_bin; $ csql -S -u dba -i cubrid_synccolldb_xdb.sql xdb Removing the obsolete collations by executing the above cubrid_synccolldb_xdb.sql script file must be performed before forcing the synchronization of system collations into database. Run **cubrid synccolldb** command. If the option is omitted, the message is shown to ask to run this command or not; if the **-f** option is given, the synchronization is run without checking message. :: $ cubrid synccolldb xdb Updating system collations may cause corruption of database. Continue (y/n) ? Contents of '_db_collation' system table was updated with new system collations. Recreate the dropped foreign key. :: $ csql -S -u dba xdb ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY fk_emp_depname(depname) REFERENCES dept(depname); .. note:: In CUBRID, collations are identified by the ID number on the CUBRID server, and its range is from 0 to 255. LDML file is compiled with shared library, which offers the mapping information between the ID and the collation(name, attribute). * The system collation is the collation which is loaded from the locale library, by the CUBRID server and the CAS module. * The database collation is the collation which is stored into the **_db_collation** system table. .. _collation: Collation ========= A collation is an assembly of information which defines an order for characters and strings. One common type of collation is called alphabetization. If not explicitly set otherwise at column creation, the charset and collation of columns are charset and collation of table. The charset and collation are taken (in order in is found first) from the client. If the result of an expression is a character data type, gets the collation and charset by the collation inference with the operands of the expression. .. note:: \ In CUBRID, collations are supported for a number of languages, including European and Asian. In addition to the different alphabets, some of these languages may require the definition of expansions or contractions for some characters or character groups. Most of these aspects have been put together by the Unicode Consortium into The Unicode Standard (up to version 6.1.0 in 2012). Most of the information is stored in the DUCET file `http://www.unicode.org/Public/UCA/latest/allkeys.txt `_ which contains all characters required by most languages. Most of the codepoints represented in DUCET, are in range 0 - FFFF, but codepoints beyond this range are included. However, CUBRID will ignore the latest ones, and use only the codepoints in range 0 - FFFF (or a lower value, if configured). Each codepoint in DUCET has one or more 'collation elements' attached to it. A collation element is a set of four numeric values, representing weights for 4 levels of comparison. Weight values are in range 0 - FFFF. In DUCET, a character is represented on a single line, in the form: :: < codepoint_or_multiple_codepoints > ; [.W1.W2.W3.W4][....].... # < readable text explanation of the symbol/character > A Korean character kiyeok is represented as follows: :: 1100 ; [.313B.0020.0002.1100] # HANGUL CHOSEONG KIYEOK For example, 1100 is a codepoint, [.313B.0020.0002.1100] is one collation element, 313B is the weight of Level 1, 0020 is the weight of Level 2, 0002 is the weight of Level 3, and 1100 is the weight of Level 4. Expansion support, defined as a functional property, means supporting the interpretation of a composed character as a pair of the same characters which it's made of. A rather obvious example is interpreting the character ''?'' in the same way as the two character string ''ae''. This is an expansion. In DUCET, expansions are represented by using more than one collation element for a codepoint or contraction. By default, CUBRID has expansions disabled. Handling collations with expansions requires when comparing two strings several passes (up to the collation strength/level). .. _collation-charset-column: Charset and Collation of Column ------------------------------- Charset and Collation apply to string data types: **VARCHAR** (**STRING**), **CHAR** and **ENUM**. By default, all string data types inherit the default database collation and character set, but CUBRID supports two modifiers which affect collation and character set. Charset ^^^^^^^ Character set may be specified as character string literal or as non-quoted identifier. Supported character sets: * ISO-8859-1 * UTF-8 (with maximum 4 bytes per characters, which means it supports codepoints from 0 to 0x10FFFF) * EUC-KR (the support for this character set is only for backward compatibility reasons, its usage is not recommended) .. note:: Previous versions of CUBRID 9.0 supported EUC-KR characters when ISO-8859-1 charset (the single one available) was set. From CUBRID 9.0 Beta, this is no longer available. EUC-KR characters should be used only with EUC-KR charset. String Check ^^^^^^^^^^^^ By default, all input data is assumed to be in the server character specified when creating DB. This may be overridden by **SET NAMES** or charset introducer (or **COLLATE** string literal modifier) (For more information, see :ref:`collation-charset-string`. Invalid data may lead to undefined behavior or even crashes if string checking is disabled (by default is disabled). This can be enabled by **intl_check_input_string** system parameter. However, if you are sure that only valid data is input, you can obtain better performance by disabling string check. Only UTF-8 and EUC-KR text data is checked for valid encodings. Since ISO-8859-1 is single byte encoding and all byte values are valid, there is no checking on this charset. Charset Conversion ^^^^^^^^^^^^^^^^^^ When **collation** / **charset** modifiers or normal collation inference requires it, character conversion may occur. Conversions are not reversible. Generally, charset conversion is character transcoding (the bytes representing a character in one charset are replaced with other bytes representing the same character but in the destination charset). With any conversion, losses may occur. If a character from source charset cannot be encoded in destination charset, it is replaced with a '?' character. This also applies to conversions from binary charset to any other charset. The widest character support is with UTF-8 charset, and since it encodes Unicode, one expects that all character can be encoded. However, during conversion from ISO-8859-1 to UTF-8 some "losses" occur: bytes range 80-A0 are not valid ISO-8859-1 characters but may appear in strings. After conversion to UTF-8 these characters are replaced with '?'. Rules for conversion of values from one charset to another: +------------------------+-----------------------------------+-----------------------------------+-------------------------------+-------------------------------+ | Source \\ Destination | Binary | ISO-8859-1 | UTF-8 | EUC-KR | +========================+===================================+===================================+===============================+===============================+ | **Binary** | No change | No change | No change. | No change. | | | | The byte size unchanged. | Validation per character. | Validation per character. | | | | Character length unchanged. | Invalid char replace with '?' | Invalid char replace with '?' | +------------------------+-----------------------------------+-----------------------------------+-------------------------------+-------------------------------+ | **ISO-8859-1** | No change | No change | Byte conversion. | Byte conversion. | | | | | The byte size increases. | Byte size increase. | | | | | No loss of useful characters. | No loss of useful characters. | +------------------------+-----------------------------------+-----------------------------------+-------------------------------+-------------------------------+ | **UTF-8** | No change. | Byte conversion. | No change | Byte conversion. | | | The byte size unchanged. | Byte size may decrease. | | Byte size may decrease. | | | Character length increases. | Expect loss of characters. | | Expect loss of characters. | +------------------------+-----------------------------------+-----------------------------------+-------------------------------+-------------------------------+ | **EUC-KR** | No change. | Byte conversion. | Byte conversion. | No change | | | The byte size unchanged. | Byte size may decrease. | Byte size may increase. | | | | Character length increases | Expect loss of characters | No loss of useful characters. | | +------------------------+-----------------------------------+-----------------------------------+-------------------------------+-------------------------------+ .. note:: Previous versions of CUBRID 9.x didn't supported binary charset. The ISO-8859-1 charset had the role of existing binary charset. Conversions from UTF-8 and EUC-KR charsets to ISO-8859-1 were performed by reinterpreting the byte content of source, not by character translation. .. _collation-setting: Collation ^^^^^^^^^ Collation may be specified as character string literal or as non-quoted identifier. The following is a query(SELECT * FROM db_collation WHERE is_builtin='Yes') on the **db_collation** system table. :: coll_id coll_name charset_name is_builtin has_expansions contractions uca_strength ================================================================================================ 0 'iso88591_bin' 'iso88591' 'Yes' 'No' 0 'Not applicable' 1 'utf8_bin' 'utf8' 'Yes' 'No' 0 'Not applicable' 2 'iso88591_en_cs' 'iso88591' 'Yes' 'No' 0 'Not applicable' 3 'iso88591_en_ci' 'iso88591' 'Yes' 'No' 0 'Not applicable' 4 'utf8_en_cs' 'utf8' 'Yes' 'No' 0 'Not applicable' 5 'utf8_en_ci' 'utf8' 'Yes' 'No' 0 'Not applicable' 6 'utf8_tr_cs' 'utf8' 'Yes' 'No' 0 'Not applicable' 7 'utf8_ko_cs' 'utf8' 'Yes' 'No' 0 'Not applicable' 8 'euckr_bin' 'euckr' 'Yes' 'No' 0 'Not applicable' 9 'binary' 'binary' 'Yes' 'No' 0 'Not applicable' Built-in collations are available without requiring additional user locale libraries. Each **collation** has an associated **charset**. For this reason, it is not allowed to set incompatible pair to **character** set and **collation**. When **COLLATE** modifier is specified without **CHARSET** modifier, then the default charset of collation is set. When **CHARSET** modifier is specified without **COLLATE** modifier, then the default collation is set. The default collation for character sets are the bin collation: * ISO-8859-1: iso88591_bin * UTF-8: utf8_bin * EUC-KR: euckr_bin * Binary: binary Binary is the name of both the collation and its associated charset. For more information on how to determine the collation among the expression parameters (operands) with different collations (and charsets), see :ref:`determine-collation-columns`. .. _charset-collate-modifier: CHARSET and COLLATE modifier ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CUBRID supports two modifiers which affect collation and character set without following the default database collation and character set. * **CHARACTER_SET** (alias **CHARSET**) changes the columns character set * **COLLATE** changes the collation :: ::= [] [] ::= {CHARACTER_SET | CHARSET} { | } ::= {COLLATE } { | } The following example shows how to set the charset of the **VARCHAR** type column to UTF-8 .. code-block:: sql CREATE TABLE t1 (s1 VARCHAR (100) CHARSET utf8); The following example shows how to change the name of column s1 to c1 and the type to CHAR(10) with the collation of utf8_en_cs (the charset is the default charset of the collation, UTF-8). .. code-block:: sql ALTER TABLE t1 CHANGE s1 c1 CHAR(10) COLLATE utf8_en_cs; The value of the c1 column is changed to the VARCHAR(5) type whose collation is iso88591_en_ci. It is performed by using the collation iso88591_en_ci for the type of column selected first or by using sorting. .. code-block:: sql SELECT CAST (c1 as VARCHAR(5) COLLATE 'iso88591_en_ci') FROM t1 ORDER BY 1; The following query (same sorting) is similar to the above but the output column result is the original value. .. code-block:: sql SELECT c1 FROM t1 ORDER BY CAST (c1 as VARCHAR(5) COLLATE iso88591_en_ci); .. _determine-collation-columns: How to Determine Collation among Columns with Different Collation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE utf8_tr_cs ); -- insert values into both columns SELECT s1, s2 FROM t WHERE s1 > s2; :: ERROR: '>' requires arguments with compatible collations. In the above example, column *s1* and column *s2* have different collations. Comparing *s1* with *s2* means comparing the strings to determine which column value is "larger" among the records on the table t. In this case, an error will occur because the comparison between the collation utf8_en_cs and the collation utf8_tr_cs cannot be done. The rules to determine the types of arguments for an expression are also applied to the rules to determine the collations. #. A common collation and a characterset are determined by considering all arguments of an expression. #. If an argument has a different collation(and a characterset) with a common collation(and a characterset) decided in No. 1., it is changed into the common collation(and a characterset). #. To change the collation, :func:`CAST` operator can be used. Collation coercibility is used to determine the result collation of comparison expression. It expresses how easily the collation can be converted to the collation of the opposite argument. High collation coercibility when comparing two operands of an expression means that the collation can be easily converted to the collation of the opposite argument. That is, an argument with high collation coercibility can be changed to the collation of an argument with lower collation coercibility. When an expression has various arguments with different collation, a common collation is computed based on each arguments collation and coercibility. The rules for collation inference are: #. Arguments with higher coercibility are coerced (or casted) to collation of arguments with lower coercibility. #. When arguments have different collation but same coercibility, the expression's collation cannot be resolved and an error is returned. However, when comparing two operands of which collation coercibility level is 11(session variable, host variable) and charset is the same, one of their collation is changed as non-bin collation if one of them is bin collation(utf8_bin, iso88591_bin, euckr_bin). See :ref:`Converting Collation of Session Variable and/or Host Variable `. Below table shows the collation coercibility about arguments of the expression .. _collation-coercibility: +------------------------+------------------------------------------------------------------------------------------------------+ | Collation Coercibility | Arguments of the Expression(Operands) | +========================+======================================================================================================+ | -1 | As an expression which has arguments with only host variables, this coercibility cannot be | | | determined before the execution step. | +------------------------+------------------------------------------------------------------------------------------------------+ | 0 | Operand having **COLLATE** modifier | +------------------------+------------------------------------------------------------------------------------------------------+ | 1 | **Columns** with non-binary and non-bin collation | +------------------------+------------------------------------------------------------------------------------------------------+ | 2 | **Columns** with binary collation and binary charset | +------------------------+------------------------------------------------------------------------------------------------------+ | 3 | **Columns** with bin collation (iso88591_bin, utf8_bin, euckr_bin) | +------------------------+------------------------------------------------------------------------------------------------------+ | 4 | **SELECT values**, **Expression** With non-binary and non-bin collation | +------------------------+------------------------------------------------------------------------------------------------------+ | 5 | **SELECT values**, **Expression** With binary collation and binary charset | +------------------------+------------------------------------------------------------------------------------------------------+ | 6 | **SELECT values**, **Expression** With bin collation (iso88591_bin, utf8_bin, euckr_bin) | +------------------------+------------------------------------------------------------------------------------------------------+ | 7 | **Special functions** (:func:`SYSTEM_USER`, :func:`DATABASE`, :func:`SCHEMA`, :func:`VERSION`) | +------------------------+------------------------------------------------------------------------------------------------------+ | 8 | **Constants(string literals)** With non-binary and non-bin collation | +------------------------+------------------------------------------------------------------------------------------------------+ | 9 | **Constants(string literals)** With binary collation and binary charset | +------------------------+------------------------------------------------------------------------------------------------------+ | 10 | **Constants(string literals)** With bin collation (iso88591_bin, utf8_bin, euckr_bin) | +------------------------+------------------------------------------------------------------------------------------------------+ | 11 | host variables, session variables | +------------------------+------------------------------------------------------------------------------------------------------+ .. note:: In 9.x versions, the binary collation was not available. The iso85891_bin collation had the role of existing binary collation. Since version 10.0, the coercibility of columns with iso88591_bin was demoted from 2 to 3, that of expressions with iso88591_bin from 5 to 6, and of constants with iso88591_bin from 9 to 10. Regarding an expression which has arguments with only host variables, (e.g. UPPER(?) as the below) this coercibility can be determined on the execution step. That is, the coercibility like this expression cannot be determined on the parsing step; therefore, COERCIBILITY function returns -1. .. code-block:: sql SET NAMES utf8 PREPARE st FROM 'SELECT COLLATION(UPPER(?)) col1, COERCIBILITY(UPPER(?)) col2'; EXECUTE st USING 'a', 'a'; :: col1 col2 =================================== 'utf8_bin' -1 For expressions having all arguments with coercibility 11 and with different collations, the common collation is resolved at run-time (this is an exception from the coercibility value-based rule for inference which would require to raise an error). .. code-block:: sql PREPARE st1 FROM 'SELECT INSERT(?,2,2,?)'; EXECUTE st1 USING _utf8'abcd', _binary'ef'; :: insert( ?:0 , 2, 2, ?:1 ) ====================== 'aefd' The following shows converting two parameters with different collation to one collation. * **Converting into the Wanted Collation** The **SELECT** statement, failing to execute in the above example, is successfully executed by specifying a collation on one column by using the **CAST** operator as shown in the following query; then the two operands have the same collation. .. code-block:: sql SELECT s1, s2 FROM t WHERE s1 > CAST (s2 AS STRING COLLATE utf8_en_cs); Also, by **CAST** s2 to bin collation, the collation coercibility of CAST (6) is higher then coercibility of s1 (1). .. code-block:: sql SELECT s1, s2 FROM t WHERE s1 > CAST (s2 AS STRING COLLATE utf8_bin); In the following query, the second operand "CAST (s2 AS STRING COLLATE utf8_tr_cs)" is a sub-expression. The sub-expression has higher coercibility than the column (s1) so "CAST (s2 AS STRING COLLATE utf8_tr_cs)" is converted to the collation of s1. .. code-block:: sql SELECT s1, s2 FROM t WHERE s1 > CAST (s2 AS STRING COLLATE utf8_tr_cs); Any expression has higher coercibility than any column. So "CONCAT (s2,'')" is converted to the collation of s1 in the following query and the query is successfully performed. .. code-block:: sql SELECT s1, s2 FROM t WHERE s1 > CONCAT (s2,''); * **Converting Collation of Constant and Column** In the following case, comparison is made by using the collation of s1. .. code-block:: sql SELECT s1, s2 FROM t WHERE s1 > 'abc'; * **When a Column is Created with Bin Collation** .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE utf8_bin ); SELECT s1, s2 FROM t WHERE s1 > s2; In this case, s2 column's coercibility is 6(bin collation) and s2 can be "fully convertible" to the collation of s1. utf8_en_cs is used. .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE iso88591_bin ); SELECT s1, s2 FROM t WHERE s1 > s2; In this case, utf8_en_cs is used as collation, too. However, some overhead occurs to convert the charset to UTF-8 since s2 is the ISO charset. In the following query, the charset is not converted (UTF-8 byte data in s2 is easily reinterpreted to the ISO-8859-1 charset) but character comparison is made by using the iso88591_en_cs collation. .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE iso88591_en_cs, s2 STRING COLLATE utf8_bin ); SELECT s1, s2 FROM t WHERE s1 > s2; * **Converting Collation of Sub-Expression and Column** .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE utf8_tr_cs ); SELECT s1, s2 FROM t WHERE s1 > s2 + 'abc'; In this case, the second operand is the expression, so the collation of s1 is used. In the following example, an error occurs. An error occurs because '+' operation is tried for s2 and s3 where the collation is different. .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE utf8_tr_cs, s3 STRING COLLATE utf8_en_ci ); SELECT s1, s2 FROM t WHERE s1 > s2 + s3; :: ERROR: '+' requires arguments with compatible collations. In the following example, the collation of s2 and s3 is utf8_tr_cs. Therefore, the collation of '+' expression is utf8_tr_cs, too. Expressions have higher coercibility than columns. Therefore, comparison operation is made by using the utf8_en_cs collation. .. code-block:: sql CREATE TABLE t ( s1 STRING COLLATE utf8_en_cs, s2 STRING COLLATE utf8_tr_cs, s3 STRING COLLATE utf8_tr_cs ); SELECT s1, s2 FROM t WHERE s1 > s2 + s3; * **Converting Collation of Number, Date** Number or date constant which is convertible into string during operation always coercible into the other string's collation. .. _comparison-between-session-and-or-host-variables: * **Converting Collation of Session Variable and/or Host Variable** When comparing the two operands of which collation coercibility level is 11(session variable, host variable) and charset is the same, one of their collation is changed as non-bin collation. .. code-block:: sql SET NAMES utf8; SET @v1='a'; PREPARE stmt FROM 'SELECT COERCIBILITY(?), COERCIBILITY(@v1), COLLATION(?), COLLATION(@v1), ? = @v1'; SET NAMES utf8 COLLATE utf8_en_ci; EXECUTE stmt USING 'A', 'A', 'A'; When comparing @v1 and 'A', @v1's collation will be changed as utf8_en_ci, non-bin collation; therefore, @v1's value and 'A' will be the same and the result of "? = @v1" will be 1 as below. :: coercibility( ?:0 ) coercibility(@v1) collation( ?:1 ) collation(@v1) ?:2 =@v1 =================================================================================================== 11 11 'utf8_en_ci' 'utf8_bin' 1 .. code-block:: sql SET NAMES utf8 COLLATE utf8_en_cs; EXECUTE stmt USING 'A', 'A', 'A'; When comparing @v1 and 'A', @v1's collation will be changed as utf8_en_cs, non-bin collation; therefore, @v1's value and 'A' will be different and "? = @v1"'s result will be 0 as below. :: coercibility( ?:0 ) coercibility(@v1) collation( ?:1 ) collation(@v1) ?:2 =@v1 =================================================================================================== 11 11 'utf8_en_cs' 'utf8_bin' 0 However, if collations of @v1 and 'A' are different as below and the two collations are different, an error occurs. .. code-block:: sql DEALLOCATE PREPARE stmt; SET NAMES utf8 COLLATE utf8_en_ci; SET @v1='a'; PREPARE stmt FROM 'SELECT COERCIBILITY(?), COERCIBILITY(@v1), COLLATION(?), COLLATION(@v1), ? = @v1'; SET NAMES utf8 COLLATE utf8_en_cs; EXECUTE stmt USING 'A', 'A', 'A'; :: ERROR: Context requires compatible collations. Charset and Collation of an ENUM type column ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Charset and Collation of an ENUM type column follow the locale specified when creating DB. For example, create the below table after creating DB with en_US.iso88591. .. code-block:: sql CREATE TABLE tbl (e ENUM (_utf8'a', _utf8'b')); a column 'e' of the above table has ISO88591 charset and iso88591_bin collation even if the charset of the element is defined as UTF8. If the user want to apply the other charset or collation, it should be specified to the column of the table. Below is an example to specify the collation about the column of the table. .. code-block:: sql CREATE TABLE t (e ENUM (_utf8'a', _utf8'b') COLLATE utf8_bin); CREATE TABLE t (e ENUM (_utf8'a', _utf8'b')) COLLATE utf8_bin; .. _collation-charset-table: Charset and Collation of Tables ------------------------------- The charset and the collation can be specified after the table creation syntax. :: CREATE TABLE table_name () [CHARSET charset_name] [COLLATE collation_name] If the charset and the collation of a column are omitted, the charset and the collation of a table is used. If the charset and the collation of a table are omitted, the charset and the collation of a system is used. The following shows how to specify the collation on the table. .. code-block:: sql CREATE TABLE tbl( i1 INTEGER, s STRING ) CHARSET utf8 COLLATE utf8_en_cs; If the charset of a column is specified and the collation of a table is specified, the collation of this column is specified as the default collation(_bin) about this column's charset. .. code-block:: sql CREATE TABLE tbl (col STRING CHARSET utf8) COLLATE utf8_en_ci; On the above query, the collation of the column col becomes utf8_bin, the default collation about this column. :: csql> ;sc tbl tbl COLLATE utf8_en_ci col CHARACTER VARYING(1073741823) COLLATE utf8_bin .. _collation-charset-string: Charset and Collation of String Literals ---------------------------------------- The charset and the collation of a string literal are determined based on the following priority. #. :ref:`charset-introducer` introducer or :ref:`COLLATE modifier ` of string literal #. The charset and the collation defined by the :ref:`set-names-stmt` #. System charset and collation(Default collation by the locale specified when creating DB) .. _set-names-stmt: SET NAMES Statement ^^^^^^^^^^^^^^^^^^^ The **SET NAMES** statement changes the default client charset and the collation. Therefore, all sentences in the client which has executed the statement have the specified charset and collation. The syntax is as follows. :: SET NAMES [ charset_name ] [ COLLATE collation_name] * *charset_name*: Valid charset name is iso88591, utf8, euckr and binary. * *collation_name*: Collation setting can be omitted and all available collations can be set. The collation should be compatible with the charset; otherwise, an error occurs. To find the available collation names, look up the **db_collation** catalog VIEW (see :ref:`collation-charset-column`). Specifying a collation with **SET NAMES** statement is the same as specifying a system parameter **intl_collation**. Therefore, the following two statements are the same behavior. .. code-block:: sql SET NAMES utf8; SET SYSTEM PARAMETERS 'intl_collation=utf8_bin'; The following example shows how to create the string literal with the default charset and collation. .. code-block:: sql SELECT 'a'; The following example shows how to create the string literal with the utf8 charset and utf8_bin collation(the default collation is the bin collation of the charset) .. code-block:: sql SET NAMES utf8; SELECT 'a'; .. _charset-introducer: Charset Introducer ^^^^^^^^^^^^^^^^^^ In front of the constant string, the charset introducer and the **COLLATE** modifier can be positioned. The charset introducer is the charset name starting with a underscore (_), coming before the constant string. The syntax to specify the **CHARSET** introducer and the **COLLATE** modifier for a string is as follows. :: [charset_introducer]'constant-string' [ COLLATE collation_name ] * *charset_introducer*: a charset name starting with an underscore (_), can be omitted. One of _utf8, _iso88591, _euckr and _binary can be entered. * *constant-string*: a constant string value. * *collation_name*: the name of a collation, which can be used in the system, can be omitted. The default charset and collation of the constant string is determined based on the current database connected (the **SET NAMES** statement executed last or the default value). * When the string charset introducer is specified and the **COLLATE** modifier is omitted, the collation is: * if the charset introducer is the same as client charset (from a previous SET NAMES), then the client collation is applied. * if the charset introducer does not match the client charset, then the bin collation(one of euckr_bin, iso88591_bin and utf8_bin) corresponding to charset introducer is applied. * When the charset introducer is omitted and the **COLLATE** modifier is specified, the character is determined based on collation. The following example shows how to specify the charset introducer and the **COLLATE** modifier. .. code-block:: sql SELECT 'cubrid'; SELECT _utf8'cubrid'; SELECT _utf8'cubrid' COLLATE utf8_en_cs; The following example shows how to create the string literal with utf8 charset and utf8_en_cs collation. The **COLLATE** modifier of **SELECT** statement overrides the collation specified by **SET NAMES** syntax. .. code-block:: sql SET NAMES utf8 COLLATE utf8_en_ci; SELECT 'a' COLLATE utf8_en_cs; Charset and Collation of Expressions ------------------------------------ The charset and collation of expression's result are inferred from charset and collation of arguments in the expression. Collation inference in CUBRID is based on coercibility. For more information, see :ref:`determine-collation-columns`. All string matching function(LIKE, REPLACE, INSTR, POSITION, LOCATE, SUBSTRING_INDEX, FIND_IN_SET, etc) and comparison operators(<, >, =, etc) take collation into account. Charset and Collation of System Data ------------------------------------ The system charset is taken from the locale specified when creating DB. The system collation is always the bin collation (<*charset*>_bin) of system charset. CUBRID supports three charset(iso88591, euckr, utf8), and accordingly three system collations(iso88591_bin, euckr_bin, utf8_bin). Impact of Charset Specified When Creating DB -------------------------------------------- The locale specified when creating DB affects the following. * Character supported in identifiers and casing rules (called "alphabet") * Default locale for date - string conversion functions * Default locale for number - string conversion functions * Console conversion in CSQL .. _casing-and-identifiers: Casing and identifiers ^^^^^^^^^^^^^^^^^^^^^^ In CUBRID, identifiers are cases insensitive. Tables, columns, session variables, triggers, stored procedures are stored in lower case. Authentication identifiers (user and group names) are stored in upper case. The ISO-8859-1 charset contains only 255 characters, so the primitives are able to use built-in data. Also the EUC-KR charset, from which only the ASCII compatible characters are considered for casing (and are handled in the code), is built-in. The UTF-8 charset is a special case: There are built-in variants of UTF-8 locales (like en_US.utf8, tr_TR.utf8 and ko_KR.utf8) and LDML locales. The built-in variant implement only the characters specific to the locale (ASCII characters for en_US.utf8 and ko_KR.utf8, ASCII + Turkish glyphs [#f1]_ for tr_TR.utf8). This means that while all UTF-8 characters encoded on maximum 4 bytes are still supported and accepted as identifiers, most of them are not handled as letters, and treated as any normal Unicode character by casing primitives. For instance, character "?" (Unicode codepoint 00C8) is allowed, but an identifier containing it will not be normalized to "¨¨" (lower case). .. code-block:: sql CREATE TABLE ?ABC; Therefore, after running above query, it will have a table name with "?abc" into the system table, **_db_class**. Using a LDML locale (built-in variants can also be overridden with a LDML variant), extends the supported Unicode characters up to codepoint FFFF. For instance, if the locale is set by es_ES.utf8 when creating DB and the corresponding locale library is loaded, the previous statement will create a table with the name "¨¨abc". As previously mentioned, a set of casing rules and supported characters (letters) forms an "alphabet" in CUBRID (this is actually a tag in LDML). Some locales, like tr_TR and de_DE have specific casing rules: - in Turkish: lower('I')='?' (dot-less lower i); upper ('i') = '?' (capital I with dot). - in German: upper ('?')='SS' (two capital S letters). Because of this, such locales have two sets of alphabets: one which applies to system data (identifiers) and one which applies to user data. The alphabet applying to user data include the special rules, while the system (identifiers) alphabet do not, thus making the system alphabets compatible between locales. This is required to avoid issues with identifiers (like in Turkish, where casing of the group name "public" results in errors -> "PUBL?C" != "PUBLIC"). It also provides a compatibility between databases with different locales (should be able to export - import schema and data). String literal input and output ------------------------------- String literals data may be entered to CUBRID by various ways: * API interface (CCI) * language dependent interface - JDBC, Perl driver, etc. * CSQL - command line from console or input file When receiving character data through drivers, CUBRID cannot be aware of the charset of those strings. All text data contained between quotes (string literals) are handled by CUBRID as raw bytes; the charset meta-information must be provided by client. CUBRID provides a way for the client to instruct it about which type of encoding is using for its character data. This is done with the SET NAMES statement or with charset introducer. Text Conversion for CSQL ^^^^^^^^^^^^^^^^^^^^^^^^ Text console conversion works in CSQL console interface. Most locales have associated character set (or codepage in Windows) which make it easy to write non-ASCII characters from console. For example in LDML for tr_TR.utf8 locale, there is a line: :: If the user set its console in one of the above settings (chcp 28599 in Windows, or export LANG=tr_TR.iso88599 in Linux), CUBRID assumes all input is encoded in ISO-8859-9 charset, and converts all data to UTF-8. Also when printing results, CUBRID performs the reverse conversion (from UTF-8 to ISO-8859-9). In Linux, to prevent this transform, using UTF-8(ex: export LANG=tr_TR.utf8) directly is recommended. The setting is optional in the sense that the XML tag is not required in LDML locale file. For example, the locale km_KH.utf8 does not have an associated codepage. **Example for configuring French language and inputting French characters** Enable fr_FR in cubrid_locales.txt, compile the locales(see :ref:`locale-setting`) and set fr_FR.utf8 when you create DB. In Linux: * Set console to receive UTF-8; set LANG=fr_FR.utf8 or en_US.utf8 (any locale with UTF-8). This setting will allow to input any UTF-8 character (not only French specific) * or, set console to receive ISO-8859-15; set LANG=fr_FR.iso885915; in LDML tag, set linux_charset="iso885915". This will receive only ISO-8859-15 characters which will be converted by CSQL to UTF-8 encoding. In Windows: * Set windows codepage to 28605 (chcp 28605 in a command prompt); in LDML tag, set windows_codepage="28605". Codepage 28605 is the corresponding for ISO-8859-15 charset. **Example for configuring Romanian and inputting Romanian characters** Enable ro_RO in cubrid_locales.txt, compile the locales(see :ref:`locale-setting`) and set ro_RO.utf8 when you create DB. In Linux: * Set console to receive UTF-8; set LANG=ro_RO.utf8 or en_US.utf8 (any locale with UTF-8). This setting will allow to input any UTF-8 character (not only Romanian specific) * or, set console to receive ISO-8859-2; set LANG=ro_RO.iso88592; in LDML tag, set linux_charset="iso88592". This will receive only ISO-8859-15 characters which will be converted by CSQL to UTF-8 encoding. In Windows: * Set windows codepage to 1250 (chcp 1250 in a command prompt); in LDML tag, set windows_codepage="1250". Codepage 1250 is the corresponding for ISO-8859-2 charset. Codepage 1250 contains characters specific to some Central and Eastern European languages, including Romanian. Please note that characters outside codepage 1250 will not be properly displayed. To use special characters which exist on Romanian alphabet(e.g. "S" and "T" with cedilla bellow), the Romanian legacy keyboard setting of "Control Panel" on Windows is required. * ISO8859-2 contains some characters which codepage 1250 does not have, so you cannot input or output all characters of ISO8859-2 with CSQL. At input, the console conversion process takes all input (including statements) and performs the conversion (only if it is required - if it contains characters that needs conversion). At output (printing results, error messages), CSQL is more selective and does not convert all texts. For instance, printing of numeric values is not filtered through console conversion (since number text contains only ASCII characters). .. _unicode-normalization: Unicode Normalization ^^^^^^^^^^^^^^^^^^^^^ Glyphs [#f1]_ can be written in various forms using Unicode characters/codepoints. Most known are the decomposed and composed forms. For instance, the glyph '?' is written in composed form with a single codepoint: 00C4, in UTF-8 these has two bytes: C3 84. In (fully) decomposed form, it written with two codepoints: 0041 ('A') and 0308 (COMBINING DIAERESIS), and in UTF-8 is encode using 3 bytes: 41 CC 88. Most text editors are able to handle both forms, so both encodings will appear as the same glyph: '?'. Internally, CUBRID "knows" to work only with "fully composed" text. For clients working with "fully decomposed" text, CUBRID can be configured to convert such text to "fully composed" and serve them back as "fully decomposed". Normalization is not a locale specific feature, it does not depend on locale. **unicode_input_normalization** system parameter controls the composition at system level. For more details, see :ref:`unicode_input_normalization `. The main use case is with both enabled (**unicode_input_normalization**, **unicode_output_normalization**): this ensures that a string from a client knowing only decomposed Unicode is still properly handled by CUBRID. A second use case is with **unicode_input_normalization** = yes and **unicode_output_normalization** = no, for a client able to handle both types of Unicode writing. .. _collation-cont-exp: Contraction and Expansion of Collation -------------------------------------- CUBRID supports contraction and expansion for collation. Contraction and expansion are available for UTF-8 charset collation. You can see the contraction and expansion of collation in the collation setting in the LDML file. Using contraction and expansion affects the size of locale data (shared library) and server performance. .. _contraction: Contraction ^^^^^^^^^^^ A contraction is a sequence consisting of two or more codepoints, considered a single letter in sorting. For example, in the traditional Spanish sorting order, "ch" is considered a single letter. All words that begin with "ch" sort after all other words beginning with "c", but before words starting with "d". Other examples of contractions are "ch" in Czech, which sorts after "h", and "lj" and "nj" in Croatian and Latin Serbian, which sort after "l" and "n" respectively. See http://userguide.icu-project.org/collation/concepts for additional information. There are also some contractions defined in `http://www.unicode.org/Public/UCA/latest/allkeys.txt `_ DUCET. Contractions are supported in both collation variants: with expansions and without expansions. Contractions support requires changes in a significant number of key areas. It also involves storing a contraction table inside the collation data. The handling of contractions is controlled by LDML parameters **DUCETContractions="ignore/use"** **TailoringContractions="ignore/use"** in tag of collation definition. The first one controls if contractions in DUCET file are loaded into collation, the second one controls if contractions defined by rules in LDML are ignore or not (easier way then adding-deleting all rules introducing contractions). .. _expansion: Expansion ^^^^^^^^^ Expansions refer to codepoints which have more than one collation element. Enabling expansions in CUBRID radically changes the collation's behavior as described below. The CUBRIDExpansions="use" parameter controls the this behavior. **Collation without Expansion** In a collation without expansions, each codepoint is treated independently. Based on the strength of the collation, the alphabet may or may not be fully sorted. A collation algorithm will sort the codepoints by comparing the weights in a set of levels, and then will generate a single value, representing the weight of the codepoint. String comparison will be rather straight-forward. Comparing two strings in an expansion-free collation means comparing codepoint by codepoint using the computed weight values. **Collation with Expansion** In a collation with expansions, some composed characters (codepoints) are to be interpreted as an ordered list of other characters (codepoints). For example, '?' might require to be interpreted the same way as 'ae', or '?' as ''ae'' or ''aa''. In DUCET, the collation element list of '?' will be the concatenation of collation element lists of both 'a' and 'e', in this order. Deciding a particular order for the codepoints is no longer possible, and neither is computing new weight values for each character/codepoint. In a collation with expansions, string comparison is done by concatenating the collation elements for the codepoints/contractions in two lists (for the two strings) and then comparing the weights in those lists for each level. **Example 1** The purpose of these examples is to show that under different collation settings (with or without expansion support), string comparison might yield different results. Here there are the lines from DUCET which correspond to a subset of codepoints to be used for comparisons in the examples below. :: 0041 ; [.15A3.0020.0008.0041] # LATIN CAPITAL LETTER A 0052 ; [.1770.0020.0008.0052] # LATIN CAPITAL LETTER R 0061 ; [.15A3.0020.0002.0061] # LATIN SMALL LETTER A 0072 ; [.1770.0020.0002.0072] # LATIN SMALL LETTER R 00C4 ; [.15A3.0020.0008.0041][.0000.0047.0002.0308] # LATIN CAPITAL LETTER A WITH DIAERESIS; 00E4 ; [.15A3.0020.0002.0061][.0000.0047.0002.0308] # LATIN SMALL LETTER A WITH DIAERESIS; Three types of settings for the collation will be illustrated: * Primary strength, no casing (level 1 only) * Secondary strength, no casing (levels 1 and 2) * Tertiary strength, uppercase first (levels 1, 2 and 3) From now on, sorting of the strings "Ar" and "?r" will be attempted. **Collation without Expansions Support** When expansions are disabled, each codepoint is reassigning a new single valued weight. Based on the algorithms described above the weights for A, ?, R and their lowercase correspondents, the order of the codepoints for these characters, for each collation settings example above, will be as follows. * Primary strength: A = ? < R = r * Secondary strength: A < ? < R = r * Tertiary strength: A < ? < R < r The sort order for the chosen strings is easy to decide, since there are computed weights for each codepoint. * Primary strength: "Ar" = "?r" * Secondary strength: "Ar" < "?r" * Tertiary strength: "Ar" < "?r" **Collation with Expansions** The sorting order is changed for collation with expansion. Based on DUCET, the concatenated lists of collation elements for the strings from our samples are provided below: :: Ar [.15A3.0020.0008.0041][.1770.0020.0002.0072] ?r [.15A3.0020.0008.0041][.0000.0047.0002.0308][.1770.0020.0002.0072] It is rather obvious that on the first pass, for level 1 weights, 0x15A3 will be compared with 0x15A3. In the second iteration, the 0x0000 weight will be skipped, and 0x1770 will be compared with 0x1770. Since the strings are declared identical so far, the comparison will continue on the level 2 weights, first comparing 0x0020 with 0x0020, then 0x0020 with 0x0047, yielding "Ar" < "?r". The example above was meant to show how strings comparison is done when using a collation with expansion support. Let us change the collation settings, and show how one may obtain a different order for the same strings when using a collation for German, where "?" is supposed to be interpreted as the character group "AE". The codepoints and collation elements of the characters involved in this example are as follows. :: 0041 ; [.15A3.0020.0008.0041] # LATIN CAPITAL LETTER A 0045 ; [.15FF.0020.0008.0045] # LATIN CAPITAL LETTER E 0072 ; [.1770.0020.0002.0072] # LATIN SMALL LETTER R 00C4 ; [.15A3.0020.0008.0041][.15FF.0020.0008.0045] # LATIN CAPITAL LETTER A WITH DIAERESIS; EXPANSION When comparing the strings "?r" and "Ar", the algorithm for string comparison when using a collation with expansion support will involve comparing the simulated concatenation of collation element lists for the characters in the two strings. :: Ar [.15A3.0020.0008.0041][.1770.0020.0002.0072] ?r [.15A3.0020.0008.0041][.15FF.0020.0008.0045][.1770.0020.0002.0072] On the first pass, when comparing level 1 weights, 0x15A3 will be compared with 0x15A3, then 0x1770 with 0x15FF, where a difference is found. This comparison yields "Ar" > "?r", a result completely different than the one for the previous example. **Example 2** In Canadian French sorting by the collation with expansion, accent is compared from end of string towards the beginning. * Normal Accent Ordering: cote < cot¨¦ < c?te < c?t¨¦ * Backward Accent Ordering: cote < c?te < cot¨¦ < c?t¨¦ .. _operations-charset-collation: Operations Requiring Collation and Charset ------------------------------------------ Charset ^^^^^^^ Charset information is required for functions which use character primitives. There are exceptions: :func:`OCTET_LENGTH` and :func:`BIT_LENGTH` do not require charset internally to return the length in bytes and bits. However, for the same glyph (character symbol) stored in different charset, they return different values: .. code-block:: sql CREATE TABLE t (s_iso STRING CHARSET iso88591, s_utf8 STRING CHARSET utf8); SET NAMES iso88591; INSERT INTO t VALUES ('?','?'); -- the first returns 1, while the second does 2 SELECT OCTET_LENGTH(s_iso), OCTET_LENGTH(s_utf8) FROM t; The previous example should be run from console (or a client) with ISO-8859-1 charset. Collation ^^^^^^^^^ Collation is required in functions and operators which involves a comparison between two strings or matching two strings. These includes functions like: :func:`STRCMP`, :func:`POSITION`, LIKE condition, and operators (<,= , >=, etc.). Also clauses like ORDER BY, GROUP BY and aggregates(:func:`MIN`, :func:`MAX`, :func:`GROUP_CONCAT`) use collation. Also, collation is considered in :func:`UPPER` and :func:`LOWER` functions, in the following manner: * Each collation has a default (parent) locale. * UPPER and LOWER functions are performed using the user alphabet of the default locale of the collation. For most collations, the default locale is obvious (is embedded in the name): * utf8_tr_cs ¡ú tr_TR.utf8 * iso88591_en_ci ¡ú en_US (ISO-8859-1 charset) The bin collations have the following default locales: * iso88591_bin ¡ú en_US (ISO-8859-1 charset) * utf8_bin (en_US.utf8 - built-in locale - and handles ASCII characters only) * euckr_bin (ko_KR.euckr - built-in locale - and handles ASCII characters only) There are some generic collations available in LDML. These collations have as default locale, the locale in which they are first found. The order of loading is the locales order from **$CUBRID/conf/cubrid_locales.txt**. Assuming the default order (alphabetical), the default locale for all generic LDML collations is de_DE (German). Charset conversion ^^^^^^^^^^^^^^^^^^ For the three charsets supported by CUBRID the conversion rules are: * General rules is that character transcoding occurs (representation of bytes is changed to the destination charset) - precision is kept, while byte size may change (for variable character data). When changing charset of a column with fixed precision (ALTER..CHANGE), the size in bytes always changes (size = precision x charset multiplier). * Exceptions are: utf8 and euckr to iso88591 - the precision is kept and data can be truncated. The following is an example that you run queries by changing the charset as utf8 in the database that the locale specified when creating DB is en_US(.iso88591). .. code-block:: sql SET NAMES utf8; CREATE TABLE t1(col1 CHAR(1)); INSERT INTO t1 VALUES ('?'); When you run above queries, the data of col1 is truncated because '?' is two bytes character and col1's size is one byte. The charset of database is iso88591, and the charset of input data is utf8; it converts utf8 to iso88591. .. _collation-setting-impacted-features: Collation settings impacting CUBRID features -------------------------------------------- LIKE Conditional Optimization ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The **LIKE** conditional expression compares patterns between string data, and returns TRUE if a string whose pattern matches the search word is found. As already proven above, when using a "collation without expansion support", each codepoint will receive a single integer value, representing its weight in the comparison process. This weight value is computed based on collation settings (strength, casing etc.). Due to the fact that characters can always be regarded as single entities, trying to match a string with a pattern using the **LIKE** predicate is equivalent to checking if the string can be found in a certain range of strings. For example in order to process a predicate such as ''s LIKE 'abc%' '', CUBRID will first rewrite it as a range restriction for the string "s". "s LIKE 'abc%'" means that "s" must start with the string "abc". In terms of string comparison, this is equivalent, in expansion-free collations, with "s" being greater than "abc", but smaller than its successor (using the English alphabet, the successor of "abc" would be "abd"). :: s LIKE 'abc%' ¡ú s ¡Ý 'abc' AND s < 'abd' (if using strictly the English alphabet) This way, the actual interpretation of **LIKE** is replaced with simple comparisons, but "Collations with expansion support" behave differently. To compare strings when using such a collation means comparing the concatenated lists of collation elements for each codepoint or expansion, level by level. For more information about comparing strings on the collation with expansion, see :ref:`expansion`. If the **LIKE** predicate rewrite method is kept the same as in a collation with no expansion support as above example, the comparison result can be wrong. To ensure the right query result, the **LIKE** predicate rewrite method is ran differently as the below example. That is, the **LIKE** predicate is added as a filter to exclude the wrong data which can be added in a collation with expansion. :: s LIKE 'abc%' ¡ú s ¡Ý 'abc' AND s < 'abd' and s LIKE 'abc%' (if using strictly the English alphabet) Index Covering ^^^^^^^^^^^^^^ Covering index scan is query optimization, in which if all values in query can be computed using only the values found in the index, without requiring additional row lookup in heap file. For more information, see :ref:`covering-index`. In the collation without casing, for two strings values, 'abc' and 'ABC', only one value is stored in the index(this is either 'abc' or 'ABC' depending which one was inserted first). As a result, the incorrect result may happen when at least two different strings produce the same sort key in a given collation. For this reason, for all UTF-8 collations with strength level less than 4 (quaternary), the index covering query optimization is disabled. This is controlled by strength="tertiary/quaternary" in tag of collation definition in LDML. It should be considered to set this level as maximum strength, because the quaternary strength level requires not only more memory space and bigger size of the shared library file, but also string-comparison time. For more information about collations, see :ref:`collation`. Summary of CUBRID Features for Each Collation ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +---------------------+---------------------------------------------+------------------------+ | Collation | LIKE condition kept after rewrite to range | Allows index covering | +=====================+=============================================+========================+ | iso88591_bin | No | Yes | +---------------------+---------------------------------------------+------------------------+ | iso88591_en_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | iso88591_en_ci | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_bin | No | Yes | +---------------------+---------------------------------------------+------------------------+ | euckr_bin | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_en_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_en_ci | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_tr_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_ko_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_gen | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_gen_ai_ci | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_gen_ci | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_de_exp_ai_ci | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_de_exp | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_ro_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_es_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_fr_exp_ab | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_ja_exp | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_ja_exp_cbm | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_km_exp | Yes | No | +---------------------+---------------------------------------------+------------------------+ | utf8_ko_cs_uca | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_tr_cs_uca | No | Yes | +---------------------+---------------------------------------------+------------------------+ | utf8_vi_cs | No | Yes | +---------------------+---------------------------------------------+------------------------+ | binary | No | Yes | +---------------------+---------------------------------------------+------------------------+ Viewing Collation Information ----------------------------- To view the collation information, use :func:`CHARSET`, :func:`COLLATION` and :func:`COERCIBILITY` functions. The information of the database collation can be shown on db_collation system view or :ref:`show-collation-statement`. Using i18n characters with JDBC =============================== CUBRID JDBC stores string type values received from server using String and CUBRIDBinaryString objects. String objects uses UTF-16 internally to store each character. It should be used to store any string DB value except those having binary charset. CUBRIDBinaryString uses byte array and should be used to store database string values of binary charset. The data buffer of each string value received from server is accompanied by the charset of the value from server. The charset is either the charset of column or expression's result or system charset for any other string without correspondent in database. .. note:: In previous versions, the connection charset was used to instantiate JDBC String objects from database values. Create table with one column having UTF-8 charset and the other of binary charset: .. code-block:: sql CREATE TABLE t1(col1 VARCHAR(10) CHARSET utf8, col2 VARCHAR(10) CHARSET binary); Insert one row (the second column has random value bytes): .. code-block:: java Connection conn = getConn(null); PreparedStatement st = conn.prepareStatement("insert into t1 values( ?, ? )"); byte[] b = new byte[]{(byte)161, (byte)224}; CUBRIDBinaryString cbs = new CUBRIDBinaryString(b); String utf8_str = new String("abc"); st.setObject(1, utf8_str); st.setObject(2, cbs); st.executeUpdate(); Query the table and show contents (for binary string - we display a hex dump, for other charsets - the String value): .. code-block:: java ResultSet rs = null; Statement stmt = null; rs = stmt.executeQuery("select col1, col2 from t1;"); ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); int numberofColumn = rsmd.getColumnCount(); while (rs.next()) { for (int j = 1; j <= numberofColumn; j++) { String columnTypeName = rsmd.getColumnTypeName(j); int columnType = rsmd.getColumnType(j); if (((CUBRIDResultSetMetaData) rsmd).getColumnCharset(j).equals("BINARY")) { // database string with binary charset Object res; byte[] byte_array = ((CUBRIDBinaryString) res).getBytes(); res = rs.getObject(j); System.out.println(res.toString()); } else { // database string with any other charset String res; res = rs.getString(j); System.out.print(res); } } } Timezone Setting ================ Timezone can be set by system parameters; a **timezone** parameter which is set on a session, and a **server_timezone** parameter which is set on a database server. For details, see :ref:`timezone-parameters`. A **timezone** parameter is a parameter about a session. This setting value can be kept by session unit. :: SET SYSTEM PARAMETERS 'timezone=Asia/Seoul'; If this value is not set, it follows **server_timezone**\'s setting as default. A **server_timezone** parameter is a parameter about a database server. :: SET SYSTEM PARAMETERS 'server_timezone=Asia/Seoul'; If this value is not set, it follows OS's setting. To use timezone information, timezone type should be used. For details, see :ref:`timezone-type`. When timezone is set by a region name, it requires a separate timezone library, To use an updated library which has a changed timezone information, not an installed timezone information, timezone library should be compiled after timezone information is changed. The following is an example to compile a timezone library after updating a timezone information through IANA (http://www.iana.org/time-zones). For details, see the following description. .. _timezone-library: Compiling Timezone Library -------------------------- To use a timezone by specifying a timezone region name, timezone library is required. This is provided as default when CUBRID is installed. By the way, to update a timezone region information as a latest one, timezone library should be compiled after updating a recent code which can be downloaded in IANA (http://www.iana.org/time-zones). The following is a process to update timezone library as a recent one. At first, stop cubrid service and operate the following process. Windows ^^^^^^^ 1. Download the recent data from http://www.iana.org/time-zones . Download the linked file in "Latest version"'s "Time Zone Data". 2. Decompress the compressed file to **%CUBRID%/timezones/tzdata** directory. 3. Run **%CUBRID%/bin/make_tz.bat**. **libcubrid_timezones.dll** is created at the **%CUBRID%/lib** directory. :: make_tz.bat .. note:: To run **make_locale** script in Windows, one of Visual C++ 2005, 2008 or 2010 should be installed. Linux ^^^^^ 1. Download the recent data from http://www.iana.org/time-zones . Download the linked file in "Latest version"'s "Time Zone Data". 2. Decompress the compressed file to **$CUBRID/timezones/tzdata** directory. 3. Run **make_tz.sh**. **libcubrid_timezones.so** is created at the **$CUBRID/lib** directory. :: make_tz.sh Timezone library and database compatibility ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The timezone library built by CUBRID includes an MD5 checksum of the timezone data it contains. This hash is stored in all databases which are created with that library, into column **timezone_checksum** of **db_root** system table. If timezone library is changed (recompiled with newer timezone data) and the checksum changes, the CUBRID server, nor any other CUBRID tool cannot be started with existing databases. To avoid such incompatibility, one option is to use **extend** argument of the **make_tz** tool. When this option is provided, the **timezone_checksum** value of database is also changed with the new MD5 checksum of the new timezone library. The extend feature should be used when you decide to use a different version of timezone library from the IANA site. It does two things: - It generates a new library by merging the old timezone data with the new timezone data. After the merge, all the timezone regions that aren't present in the new timezone database are kept in order to ensure backward compatibility with the data in the database tables. - The second thing that it does is to update the timezone data in the tables in the situation when backward compatibility could not be ensured in the first phase when the new timezone library was generated. This situation can occur when an offset rule or a daylight saving rule changes. When you run **make_tz** with the extend option all the databases in your database directory file (**databases.txt**) are updated together with the MD5 checksum. There are some corner cases: - There is the situation when multiple users share the same **CUBRID** installation and an extend is done by one of them. If that user doesn't have access rights on the files that contain the databases of the other users, those databases will not be updated. After that, if a different user for whom the update wasn't made will try to do an extend on his or her databases, he or she will not be able to do this because the checksum of the library will be different from the one in his or her databases. - Also, if the **CUBRID_DATABASES** environment variable has a different value for some users, they will have different **databases.txt** files. In this situation, currently, the update of all the databases at once will not be possible. There would be two solutions for this with the current implementation: - Each user grants access to the folders that contain his or her databases and also the **CUBRID_DATABASES** variable must have the same value. - If this is is not possible, then we can do the following for each user except the last one: - Backup the current timezone library and the **databases.txt** file - Delete from the **databases.txt** file all the databases except for the ones of the current user - Run the extend - Restore the **databases.txt** file and the timezone library For the last user the single difference is that only the **databases.txt** file should be backed up and restored. In Linux: :: make_tz.sh -g extend In Windows: :: make_tz.bat /extend Usage of timezone data types with JDBC ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ JDBC CUBRID driver is completely dependent on CUBRID server for timezone information. Although, Java and CUBRID uses the same primary source of information for timezone (IANA), the names of regions and timezone information should be considered as incompatible. All CUBRID data types having timezone are mapped to **CUBRIDTimestamptz** Java objects. Using JDBC to insert value with timezone: .. code-block:: java String datetime = "2000-01-01 01:02:03.123"; String timezone = "Europe/Kiev"; CUBRIDTimestamptz dt_tz = CUBRIDTimestamptz.valueOf(datetime, false, timezone); PreparedStatement pstmt = conn.prepareStatement("insert into t values(?)"); pstmt.setObject(1, ts); pstmt.executeUpdate(); Using JDBC to retrieve value with timezone: .. code-block:: java String sql = "select * from tz"; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql); CUBRIDTimestamptz object1 = (CUBRIDTimestamptz) rs.getObject(1); System.out.println("object: " + object1.toString()); Internally, CUBRID JDBC stores the date/time parts of **CUBRIDTimestamptz** object into a 'long' value (inheritanted through Date object) which holds the number of milliseconds elapsed since 1st January 1970 (Unix epoch). The internal encoding is performed in UTC time reference, which is different from Timestamp objects which uses local timezone. For this reason, a **CUBRIDTimestamptz** object created with the same timezone as Java local timezone will not hold the same internal epoch value. In order to provide the Unix epoch, the **getUnixTime()** method may be used: .. code-block:: java String datetime = "2000-01-01 01:02:03.123"; String timezone = "Asia/Seoul"; CUBRIDTimestamptz dt_tz = CUBRIDTimestamptz.valueOf(datetime, false, timezone); System.out.println("dt_tz.getTime: " + dt_tz.getTime()); System.out.println("dt_tz.getUnixTime: " + dt_tz.getUnixTime ()); .. _char-data-conf-guide: Configuration Guide for Characters ================================== Database designers should take into account character data properties when designing the database structure. The following is the summarized guide when configuring aspects related to CUBRID character data. Locale ------ * By default, en_US gives best performance. If you have a plan to use only English, this is recommended. * Using UTF-8 locale will increase storage requirement of fixed char(CHAR) by 4 times; using EUC-KR increases storage 3 times. * If user string literals have different charset and collation from system, query strings will grow as the string literals are decorated with them. * If localized (non-ASCII) characters will be used for identifiers, then use an .utf8 locale * Once established the UTF-8 charset for DB, it is best to use a LDML locale (this ensures that identifier names containing most Unicode characters are correctly cased) than a system locale. * Setting a locale affects also conversion functions(intl_date_lang, intl_number_lang). * When you set the locale during creating DB, there should be no concern on charset and collation of string-literals or user tables columns; all of them can be changed at run-time (with :func:`CAST` in queries) or ALTER .. CHANGE for a permanent change. CHAR and VARCHAR ---------------- * Generally, use VARCHAR if there are large variations in actual number of characters in user data. * CHAR type is fixed length type. Therefore, Even if you store only English character in CHAR type, it requires 4 bytes storage in UTF-8 and 3 bytes in EUC-KR. * The precision of columns refers to the number of characters (glyphs). * After choosing precision, charset and collation should be set according to most used scenarios. Choosing Charset ---------------- * Even if your text contains non-ASCII character, use utf8 or euckr charsets only if application requires character counting, inserting, replacing. * For CHAR data, the main concern should be storage requirement (4x or utf8, 3x for euckr). * For both CHAR and VARCHAR data, there is some overhead when inserting/updating data: counting the precision (number of characters) of each instance is more consuming for non-ISO charsets. * In queries, charset of expressions may be converted using :func:`CAST` operator. Choosing Collation ------------------ * If no collation dependent operations are performed (string searching, sorting, comparisons, casing), than choose bin collation for that charset or binary collation * Collation may be easily overridden using :func:`CAST` operator, and :ref:`COLLATE modifier ` (in 9.1 version) if charset is unchanged between original charset of expression and the new collation. * Collation controls also the casing rules of strings * Collations with expansions are slower, but are more flexible and they perform whole-word sorting Normalization ------------- * If your client applications send text data to CUBRID in decomposed form, then configure **unicode_input_normalization** = yes, so that CUBRID re-composes it and handles it in composed form * If your client "knows" to handle data only in decomposed form, than set **unicode_output_normalization** = yes, so that CUBRID always sends in decomposed form. * If the client "knows" both forms, then leave **unicode_output_normalization** = no CAST vs COLLATE --------------- * When building statements, the :func:`CAST` operator is more costly than :ref:`COLLATE modifier ` (even more when charset conversion occurs). * :ref:`COLLATE modifier ` does not add an additional execution operator; using :ref:`COLLATE modifier ` should enhance execution speed over using :func:`CAST` operator. * :ref:`COLLATE modifier ` can be used only when charset is not changed Remark ====== * Query plans printing: collation is not displayed in plans for results with late binding. * Only the Unicode code-points in range 0000-FFFF (Basic Multilingual Plan) are normalized. * Some locales use space character as separator for digit grouping (thousands, millions, ..). Space is allowed but not working properly in some cases of localized conversion from string to number. .. note:: * In 9.2 or lower version, user defined variable cannot be changed into the different collation from the system collation. For example, "set @v1='a' collate utf8_en_cs;" syntax cannot be executed when the system collation is iso88591. * In 9.3 or higher version, the above constraint no more exists. Guide for Adding Locales and Collations ======================================= Most new locales and/or collations can be added by user simply by adding (or changing) a new (existing) LDML file. The LDML files format used by CUBRID are derived from generic Unicode Locale Data Markup Language (http://www.unicode.org/reports/tr35/). The tags and attributes which are specific only to CUBRID can be easily identified (they contain a "cubrid" into the naming). The best approach to add a new locale is to copy existing LDML file and tweak various setting until desired results are obtained. The filename must be formatted like cubrid_<*language*>.xml and be placed in the folder **$CUBRID/locales/data/ldml**. The <*language*> part should be a ASCII string (normally five characters) in IETF format (https://en.wikipedia.org/wiki/BCP_47). After creating the LDML file, the <*language*> part string must be added into CUBRID configuration file **$CUBRID/conf/cubrid_locales.txt**. Note that the order in this file is the order of generating (compiling) locale library and loading locales at start-up. The **make_locale** script must be used to compile the new added locale and add its data into the CUBRID locales library (locale in **$CUBRID/lib/**). The LDML file is expected in UTF-8 encoding, and it is not possible to add more than one locale into the same LDML file. Adding a new locale in LDML file requires: .. "and currency" is removed because MONETARY is deprecated. * to specify calendar information (CUBRID date formats, name of months and week days in various forms, names for AM/PM day periods). CUBRID supports only Gregorian calendar (generic LDML specifies other calendar types which are not supported by CUBRID). * to specify number settings (digit grouping symbols) * providing an alphabet (set of rules for how letters are upper-cased and lower-cased) * optionally, some collations can be added * also optionally, console conversion rules for Windows CSQL application can be defined LDML Calendar Information ------------------------- * The first part consists in providing default CUBRID formats for **DATE**, **DATETIME**, **TIME**, **TIMESTAMP**, **DATETIME WITH TIME ZONE** and **TIMESTAMP WITH TIME ZONE** data type conversion to/from string. This formats are used by functions :func:`TO_DATE`, :func:`TO_TIME`, :func:`TO_DATETIME`, :func:`TO_TIMESTAMP`, :func:`TO_CHAR`, :func:`TO_DATETIME_TZ`, :func:`TO_TIMESTAMP_TZ`. The formats elements allowed depend on data type and are the ones used for :func:`TO_CHAR` function (:ref:`Date/Time Format 1 `). Only ASCII characters are allowed in the format strings. The allowed size are 30 bytes (characters) for **DATE** and **TIME** formats, 48 characters for **DATETIME** and **TIMESTAMP** formats and 70 characters for **DATETIME WITH TIME ZONE** and **TIMESTAMP WITH TIME ZONE**. * The requires to specify the names for months in both long form and abbreviated form. The allowed size are 15 (or 60 bytes) for abbreviated form and 25 characters (or 100 bytes) for normal form. * The requires week day names in both long and abbreviated form. The allowed size are 10 characters (or 40 bytes) for abbreviated form and 15 characters (or 60 bytes) for full day name. * The sub-tree requires to define the string for AM/PM format variants (according to type attribute). The allowed size is 10 characters (or 40 bytes). The months and week-days names (in both long and abbreviated form) must be specified in Camel case format (first letter upper case, the rest in lower case). CUBRID checks only the maximum allowed size in bytes; the size in characters is computed only for full-width UTF-8 characters (4 bytes), so it would be possible to set a month name having 100 ASCII-only characters (the 25 characters limit is when each character from month name is encoded on 4 bytes in UTF-8). .. LDML Numbers and currency information .. currency part will not be used because it is used only in MONETARY, and MONETARY will be deprecated. .. keep the currency related info as comments for the future.(if currency part is revised, it's explanation can be used again.) LDML Numbers information ------------------------ * The tag defines the characters used as symbols for splitting decimal part from integer part in numbers and for grouping the digits. CUBRID expects only ASCII characters for these symbols. Empty of space character is not allowed. CUBRID performs grouping for 3 digits. .. below is commented out. .. * The tag defines the three letter ISO 4217 code (http://en.wikipedia.org/wiki/ISO_4217) for default currency of the locale. Only one currency for locale is allowed. Setting the currency, instructs CUBRID how to interpret conversions were MONETARY data type is implied (:func:`TO_NUMBER`). .. CUBRID supports a limited number of currencies. +------------------------+----------------------+ | Currency ISO symbol | Meaning | +========================+======================+ | USD | dollar sign | +------------------------+----------------------+ | JPY | japanese yen | +------------------------+----------------------+ | GBP | british pound | +------------------------+----------------------+ | KRW | Korean won | +------------------------+----------------------+ | TRY | turkish lira | +------------------------+----------------------+ | KHR | cambodian riel | +------------------------+----------------------+ | CNY | chinese renminbi | +------------------------+----------------------+ | INR | indian rupee | +------------------------+----------------------+ | RUB | russian ruble | +------------------------+----------------------+ | AUD | australian dollar| +------------------------+----------------------+ | CAD | canadian dollar | +------------------------+----------------------+ | BRL | brasilian real | +------------------------+----------------------+ | RON | romanian leu | +------------------------+----------------------+ | EUR | euro | +------------------------+----------------------+ | CHF | swiss franc | +------------------------+----------------------+ | DKK | danish krone | +------------------------+----------------------+ | NOK | norwegian krone | +------------------------+----------------------+ | BGN | bulgarian lev | +------------------------+----------------------+ | VND | vietnamese dong | +------------------------+----------------------+ | CZK | Czech koruna | +------------------------+----------------------+ | PLN | Polish zloty | +------------------------+----------------------+ | SEK | Swedish krona | +------------------------+----------------------+ | HRK | Croatian kuna | +------------------------+----------------------+ | RSD | serbian dinar | +------------------------+----------------------+ LDML Alphabet ------------- These allow to define casing rules for alphabet of the locale. The 'CUBRIDAlphabetMode' attribute defines the primary source of data for characters. Normally, this should be set to "UNICODEDATAFILE", values which instructs CUBRID to use the Unicode data file (**$CUBRID/locales/data/unicodedata.txt**). This file must not be modified, any customization on certain characters should be done in LDML file. If such value is configured, all Unicode characters up to codepoint 65535 are loaded with casing information. The other allowed value for `CUBRIDAlphabetMode` is "ASCII" which will lead to only ASCII character can be lower case, upper case or case-insensitive compare in matching functions. This does not affect CUBRID's ability to support all UTF-8 4 bytes encoded Unicode characters, it just limits the casing ability for characters not included. The casing rules are optional and apply on top of the primary source of character information (UNICODEDATAFILE or ASCII). CUBRID allows to define upper casing rules ( tag) and lower casing rules ( tag).Each of upper and lower casing rules set consists for pairs of source-destination ( = source, = destination). For instance, the following defines a rule that each character "A" is lower cased to "aa" (two character "a"). .. code-block:: xml A aa LDML Console Conversion ----------------------- In Windows, the console does not support UTF-8 encoding, so CUBRID allows to translate characters from their UTF-8 encoding to a desired encoding. After configuring console conversion for a locale, the user must set prior to starting CSQL application the codepage of the console using 'chcp' command (the codepage argument must match the 'windows_codepage' attribute in LDML). Conversion will work bidirectionally (input and output in CSQL), but is only limited to Unicode characters which can be converted in the configured codepage. The element is optional and allows to instruct CSQL how to print (in which character encoding) the text in interactive command. The 'type' attribute defines the conversion scheme. The allowed values are: * ISO: is a generic scheme in which the destination codepage is a single byte charset * ISO88591: is a predefined single byte scheme for ISO-8859-1 charset (the 'file' attribute is not required, is ignored) * ISO88599: is a predefined single byte scheme for ISO-8859-9 charset (also the 'file' attribute is not required) * DBCS: Double Byte Code-Set; it is a generic scheme in which the destination codepage is a double byte charset The 'windows_codepage' is the value for Windows codepage which CUBRID automatically activates console conversion. The 'linux_charset' is corresponding value for charset part in **LANG** environment variable from UNIX system. It is recommended to use native CUBRID charset in Linux console. The 'file' attribute is required only for "ISO" and "DBCS" values of 'type' attribute and is the file containing the translation information (**$CUBRID/locales/data/codepages/**). LDML Collation -------------- Configuring a collation is the most complex task for adding LDML locale in CUBRID. Only collation having UTF-8 codeset can be configured. CUBRID allows to configure most constructs specified by UCA - Unicode Collation Algorithm (http://www.unicode.org/reports/tr10/) including contractions and expansions, but the properties for the collation are mostly controlled via the 'settings' attribute. A LDML file can contain multiple collations. Collations can be included from external file using the 'include' tag. The 'validSubLocales' attribute of 'collations' tag is a filter allowing to control locale compilation when external collations (from external files) are included. Its values can be either a list of locales or "*" in which case the collations in sub-tree are added in all locales from which the file is included. One collation is defined using the 'collation' tag and its sub-tree. The 'type' attribute indicates the name for the collation as it will be added in CUBRID. The 'settings' tag defines the properties of the collation: * 'id' is the (internal) numeric identifier used by CUBRID. It is integer value in range (32 - 255) and is optional, but is strongly recommended that an explicit unassigned values is set. Please see :ref:`collation-naming-rules`. * 'strength' is a measure of how strings compare. See :ref:`collation-properties`. The allowed values are : * "quaternary": different graphic symbols of the same character compare differently, but different Unicode codepoints may compare equal. * "tertiary": graphic symbols of the same character are equal, case-sensitive collation. * "secondary": case insensitive collation, characters with accents compare different * "primary": accents are ignored, all characters compare as the base character. * 'caseLevel': special setting to enable case sensitive compare for collations having strength < tertiary. Valid values are "on" or "off". * 'caseFirst': order of casing. Valid values are "lower", "upper" and "off". The "upper" values means upper case letters are ordered before the corresponding lower case letter. * 'CUBRIDMaxWeights': it is the number of codepoints (or last codepoint + 1) which are customized in the collation. Maximum value is 65536. Increasing this value increases the size of collation data. * 'DUCETContractions': valid values are "use" or "ignore". When "use" - enable CUBRID to use in the collation the contractions defined by DUCET file ($CUBRID/locales/data/ducet.txt) or ignoring them. * 'TailoringContractions': same as previous but refers to the contractions defined or derived from explicit collation rules. Enabling contractions leads to a more complex collation (slower string compares). * 'CUBRIDExpansions': allowed values are "use" or "ignore" (default) and refers to usage of collation expansions from both the DUCET file and tailoring rules; This has the most influence on collation properties. Enabling it will result in a compare with multiple passes (up to collation strength) when comparing strings. Also it greatly increases collation data, with the benefit of obtaining a more "natural" sort order. See :ref:`expansion`. * 'backwards': "on" or "off": used to obtain "french" order by performing an end-to-start compare on secondary level (for accents). It has effect only when 'CUBRIDExpansions' are enabled. * 'MatchContractionBoundary': "true" or "false". This is used in collation having expansions and contractions to configure behavior at string matching when a contraction is found. The main data for a collation is loaded from the DUCET file. After this step, the collation may be customized using "tailoring rules". These are the "" (LDML) and "" (CUBRID specific). The 'cubridrules' tag is optional and can be used to explicitly set weight values for a codepoint or a range of codepoints. The cubridrules apply after loading the primary collation data from DUCET file and before applying the UCA rules (from '' tag). Each of these rule is enclosed in '' tag. If the rule refers to only one Unicode codepoint, then a '' tag is provided which contains the hexadecimal value of codepoint. All available CUBRID collations contain this cubrid-rule: .. code-block:: xml 20 [0.0.0.0] This rule says that weight values (UCA defines four weight values per collation element) of the codepoints starting with 20 (which is ASCII space character) are all set to zero. Since there is no '' tag, the only codepoint affected is 20. In CUBRID, space character compares as zero. The allowed tags inside of a '' rule are: * '': rule to set the weights for single codepoint. * '': rule to set the weights for single character. Similar to previous one, but instead of codepoint it expects a Unicode character (in UTF-8 encoding). * '': rule to set the weights for a range of codepoints. This is the starting codepoint. * '': rule to set the weights for a range of characters. This is the starting character. In this context, the order of characters is given by their Unicode codepoints. * '': end codepoint for a range rule. * '': end character for a range rule. * '': weight values to set (single value). The weight values are expected in hexadecimal. Each collation element has four values which are delimited by point and enclosed by square brackets([]). There can be up to 10 collation elements. * '': starting weight values to set for a range. Optionally, there is 'step' attribute of this tag, which sets the increasing step after each codepoint. By default the step is [0001.0000.0000.0000], which means that after setting the first weight values for the starting codepoint, one value is added to primary level weight and set to the next codepoint in range, and the process is repeated until end codepoint. Examples: .. code-block:: xml 0 20 [0.0.0.0] 30 39 [30.0.0.0][30.0.0.0] The Rule 1, sets for codepoints ranging from 0 to 20 (including) the weight values 0. The Rule 2, sets for codepoints ranging from 30 to 39 (which are the digits), a set of two collation elements with increasing weights; In this example, codepoint 39 (character "9") will have the weights with two collation elements [39.0.0.0][39.0.0.0]. The '' tag is also optional but is according to LDML and UCA specifications. The meanings of sub-ordinates tags are : * '': anchor collation element. It defines the reference to which subsequent rules (up to next ``) are tailored. It can be a single characters or multiple characters in which case is either a contraction or an expansion. By default, all the tailoring rules after the anchor are sort "after" (element from first rule is after the anchor, element from second rule sorts after element in first rule); if the optional attribute "before" is present, then only the first rule after the sorts before the anchor, while the second and the following rules resumes the normal "after" sort (element in second rule sorts after element in first rule). * '

': the character comes after (or before, if the anchor had the `before` attribute) the previously tailored one at primary level. * '': the character comes after (or before, if the anchor had the `before` attribute) the previously tailored one at secondary level. * '': the character comes after (or before, if the anchor had the `before` attribute) the previously tailored one at tertiary level. * '': the character sorts identically to previous one * '', '', '', '': same as '

', '', '', '' but applies to a range of characters * '': specifies the expansion character * '': specifies the second character of expansion. * '': specifies the context in which a rule applies. A variant to specify contractions and expansions. For more information on UCA tailoring with LDML rules see http://www.unicode.org/reports/tr35/tr35-collation.html. .. rubric:: Footnotes .. [#f1] glyph: an element for the shape of a character; a graphic symbol which indicates a shape or a form for a character. Because a glyph specifies the shape which is shown, several glyphs about one character can exist. "I can't think of it," replied Frank; "what is it?" Judy Abbott Still the tonga; uphill and down, over the hilly country, with a horizon of dull, low mountains, and the horses worse and worse, impossible to start but by a storm of blows. Towards evening a particularly vicious pair ended by overturning us into a ditch full of liquid mud. The sais alone was completely immersed, and appealed loudly to Rama with shrieks of terror. Abibulla on his part, after making sure that the sahibs and baggage were all safe and sound, took off his shoes, spread his dhoti on the ground, and made the introductory salaams of thanksgiving to the Prophet, while the coolie driver returned thanks to Rama. "Did the girl know her own story?" she asked. "Nonsense¡ªyou're coming wud me." "I'm afraid father forgets things. But come in, he's bound to be home to his dinner soon." HoMEÏã¸ÛÒ»¼¶¸ßÇåÂØÆ¬ ENTER NUMBET 0018www.b008.com.cn
s3nk6zcb.com.cn
www.seecr26w.com.cn
www.gearmachine.com.cn
www.7lll.net.cn
mmwx520.com.cn
yhsogou.com.cn
yfmoney.com.cn
www.qiushou.net.cn
gblg020.com.cn

黑人美女做爱下体艺术照片 搔妹妹黄站 大吊操丈母娘 安卓手机nomao软件下载 18yeseecom 韩国黄色片 欧美母子乱伦4 人体艺术网站张筱雨 av黄色性爱 圆圆的奶子影音先锋 社内情事巨乳olあずみ春 diy自动的性爱操逼器 神乐坂惠写真先锋 操逼电影直区 美女护士阴唇图片 WWW.KAN51.COM WWW.7SE7SE.COM WWW.AVVAV2016.COM WWW.FJDZH.COM WWW.76ZH.COM WWW.XXSPJC.COM WWW.66SDY.COM WWW.NNN89.COM WWW.BBB788.COM WWW.ZY-LED.COM WWW.97XFDY.COM WWW.JIYOUTV.COM WWW.KEAIMM.COM WWW.97JY.INFO WWW.77UJ.COM WWW.992AAA.COM WWW.SE105.COM WWW.999H.ME WWW.QFZQZ.COM WWW.46NK.COM WWW.168CAI.COM WWW.ZXW1.COM WWW.SX831.COM WWW.26ND.COM WWW.CCC800.COM WWW.CUPAPA.COM WWW.EE974.COM WWW.ANQU66.COM WWW.333XA.COM WWW.HXTLED.COM WWW.PUTCLUB.COM WWW.464U.COM WWW.MOKAOBA.COM WWW.QPFCH.COM WWW.DAEN88.COM WWW.ANQIMA.COM WWW.ISMDY.COM WWW.99FF5.COM WWW.AV5999.COM WWW.AILUDE.COM WWW.SOSO8383.COM WWW.WWW44HHH.COM WWW.282QQ.COM WWW.WQQKG.COM WWW.HAO5588.COM WWW.QDH100.COM WWW.HHH085.COM WWW.D442.COM WWW.AAA979.COM WWW.NIU21.COM WWW.FZXINQI.COM WWW.2732322.COM WWW.80WM.COM WWW.GGPAPA.COM WWW.998UIWD.COM WWW.20GG.COM WWW.TTKANTV.COM WWW.9GDY.COM WWW.XADDM.COM WWW.37XX8.COM WWW.CCC679.COM WWW.MAXCMS8.COM WWW.SSS03.COM KHALED.FARAH WWW.34EEE.CON WWW.777SU.COM WWW.HACKP.COM WWW.97PPP.COM 好色巨乳熟女人妻 啊啊插我自拍 GG004 亚洲av偷拍自拍 日本手机在线观看视频av 亚洲熟女人妻50路在线 www520520eme 三级片透视美女 www8aake 情欲艳谈百度云 狂抽插粉嫩美妇图片 黄色成人电影院 另类小说专区第1页 婷婷色丁香迅雷下载 少女手淫偷拍视频 风骚老板娘 激情影院床戏片 卡戴珊禁播图片图 欧美超碰先锋影院 性生活影片大厅免费 肉感系列 WW678图片 两性乱伦拳交 2B哥哥乱伦熟女 599AP 鲜嫩肉穴 狠狠爱夜夜橹在线hhh600com 奶大妞女 色狗成人小说 三个嫂嫂轮着玩一乱伦 巨乳妻子 www743333 sm调教美女妈妈 免费操逼啪啪啪免费视频 超碰依依 pp63 倩女销魂 三级片全部免费观看完整版 磁力链接捆绑女教师 6080三级片mp4 撸色撸 爽亚洲15p 干妹电影清晰度 奴志愿替夫还债 免费成人网那里 国产自拍极速在线 手机无码在线云播 天天啪久久wwwgeerlscom 淫妻绿帽另类图片 射她淫下载 免费黄片网站大全 成人直player成人直播 杏月美在线无播放器 女孩的阴蒂 免费成人电影网站排行榜 岛国色色在线视频 99热久久操干狠狠 wwwsaojjzzcom 在线撸图 丝袜护士成人 葵司三级片 日本女穴 内射色图 avav9898 欧美成人大鸡巴用力插 2017天天撸 狠狠的干2015 色驴影院AV 免费成人三级快播 迷奸第1页-插妹妹a片96网 撸儿所成人 凹凸在线破处门 爱微拍福利av 大奶奶日本系列 Av东方在线视频网站 射射撸av 成人动漫友人之母 色刚刚帝国 seqinyiji 欧洲一级性爱图片 曰麻比 哈尔滨狼友 木美子 丝袜亚洲av 武侠母女同 给个2017能看的网站 日本激情网 最大胆熟妇丁字裤艺术图片 lu198com 52bobo52 人与狗番号 丰满淫语啊妈视频 亚洲色图偷拍自拍乱伦小说 www77dsnettvb 西施三级在线 mmm9ckanzycom 873ee 口交av免费视频 WWW208UUCOM 人体艺术性爱照片 乱伦妈妈小说 青春草在线华人 yes44444 邪恶漫画之妈妈丝袜双飞 免费甜性色爱电影 人妻巨乳影院 AV成人播放器免费的 韩国r级限制电影手机在线观看 7f5gcomshipin33html 日本www网站下载 抽插淫荡少妇小清15p 2015超碰在线视频观看 51撸影院 chinesepornvideos--porn300 prouhubcom日本熟女 wwwhaoav 010性爱综合网 日本在线h小游戏 嫩妹妹av86cccccom ss成人 大帝Av视频在线免费观看 初中女生下面 丁香5月亚洲 色系x小说 嗨他网大色网聚色网 欢欢时空 丝袜足交熟女20p 花和尚综合 开心春色 韩国情侣做爱高清自拍看巨乳多多影音 自慰小说免费看 www725bb xxxx欧美制服 学生妹强奸网址日本 亚洲色图15pwwwjjjj14comcomwwwssss88com 好吊妞AV 小明看看99recOm 搜索姐姐妹妹看AV 6080激情影院 日本身内射精av atv444电影院 超碰在线看视频 a片人兽乱伦 美国美女大逼电影 亚洲熟妇色图 欧美性爱色域网 14伊人 古典武侠校园春色明星合成 娃 美女黄色一级片电影 性感小说姐姐梅 成人伊人开心网 自拍诱惑照 速看100影视 250色艺中心 被公公大夫插 xfplay丝袜制服 制度诱惑系列在线 爱裸睡的女儿丹丹 可以搜索演员的黄色网站 色欲淫香手机 狼人艹综合 uc成人浏览器 WWWavtb789com 亚洲日韩国产精品在线 1138x成人wang 7次郎在线视频 亚洲&apos;av 26uuu做爱 上海177姐妹花在线视频 女人淫荡的声音 h淫荡美熟母 强奸幼女av网站 乱伦o 嫖娼约炮色中色激情影院 扒开董卿湿漉 wwwpu690com 爷爷孙女爱爱 和阿姨疯狂啪啪3p 伦乱片236 wwwmumu98comwwwmumu98com 韩国mm影音 www_kuai97_com 美国豚鼠2在线观看 肉棍蜜汁p 亚洲肥奶奶性生活视频 哪里能看到免费的幼女 88街拍视频网 黄色网站最强 成年人电影色黄 强上老婆的妹妹小说 凌辱女友mcc色站 青青草AV在线视频观免wwwshe72com 邪恶漫画gaa 妻子成了公共汽车 性交实拍舔鸡巴1000部 国内最大成人在线免费视频 丁婷婷丁香五月 古典武侠迅雷专区 西瓜影音毛片网址 制服丝袜偷拍自拍在线视频 2365xxcom 制服丝袜m 成人瑜伽在线 草樱av免费视频l www523uuucom 欧美小女日 国产普通话叫床 女生在线自慰av91网 骚货偷拍 强奸乱伦先锋中文字幕 直播视频6页 黄色电影视频magnet 413121神马电影 给女护士爆菊的小说 黄色av做爱 566qq五月 大炕偷情自拍 国产大鸡巴操 冯仰妍16分钟在线视频 wwwav520compage1html 国产超级成人视频在线 被迫子宫内射 日本无码拳交番号汇总 nk290com 少妇被强上mp4 亚洲偷拍自拍www912yycom 宅男色影视色 乱伦熟女tu图片 日本熟妇色色视频 和老婆激情性爱记录 姐姐骚哥哥爱妹妹图片 刀剑三级毛片看一下www906yycom 小明看看首页最新通道 扒开小姨阴唇插进去 麻生希google 小优仓子云盘 母子qin 姐姐高潮出水10p 228df看不了 影音先锋成人动态图 5tav 穆桂英外传古典武侠 干哥哥插妹妹逼 淫人社区 淫香淫色色欲影视清纯唯美 男男性交mp4 久久爱视频在线观看视频ijijigecom nxhx人与动物 259LUXU139 小色狗成人娱乐网 类似巨乳淫奴的小说 山形健和早乙女 陈老师的肉色连连 夜涩猫6699 av天堂网先锋 大鸡巴插老婆magnet 欧美女人潮吹视频在线观看 日韩五月丁香 亚洲色欧美色在线 站着哕爽 亚洲视频老熟女 天海翼 亚洲 图片 丁香社区bt下载 重口味女人分娩图片 母乳幼交 xxx3333 偷拍 母子操逼怎样操的舒服 人妖打飞机翻译 鸡巴狂插少妇 国外幼少女电影 幼齿网址 有什么色电影不腾讯可看 刘亦菲阴道毛多吗 店长推荐成人动漫吉吉音影 国外人体意思 美女图片大奶逼 zooskool 人与动物huaididi 熟女bb无毛 兽皇女主角名字 微信毛片群 撸波波明星美图 影音先锋av在线视频 日女女逼 日本裸女人性交 幼女就爱被大人干快播 欧美奶奶图片 日本熟女av母亲型 社情导航 av movies 下载裸体美女图片 韩国女主播雪梨裸体 狗鸡巴插穴故事 掰开人体私处 花和尚播放器 日逼片百度影音 强奸系列小说下载 老农和几个大学色女生的淫荡生活 超大胆少女人体艺术 乱伦艳说 偷拍在拍在线论坛 户田惠梨香番号 淫贱女星卖逼图 日本毛a电影网站 44porn 韩国黄片影音先锋 激情性爱 乱伦 制服诱惑 快播电影 我的女友是黑木耳 小泽利哑裸照 弥生16岁 妈妈乱伦屄 思思色尼玛激情亚洲 欧美黄色网站视频第一页 色婷兽绝 快播春护士 儿子液侵母亲原照片 激情a毛色 影音先锋佐佐木希 av yeyewoyao 风骚熟妇合集 少女的屄阁 baidu美女人体 汤唯吃鸡巴艳照 人体掰b艺术图 11xingjiao 不需要下载播放器的裸体做爱 大胆巨乳美女一丝不挂图片 波多野结衣 黑丝快播 大肚少妇乱伦 meisedianyingxiazai 影音先锋 春宫心 人妻1953 女性生植噐照片 看看 人与曽肏屄播放 肏农村女人屄小说 影音先锋能用的码你懂的 先锋影音 伦理 肏小乔屄 阳痿狗鞭 阳痿的中药方子有吗 qiangjianluanlun s 张靓颖人体艺术视频 大奶奶人体 皇瑟片女搜搜能看视频 147人体艺术 羊羊 angl23com 鲁av影院 色女草榴区 ww我和老師做受jeiw020ccm网址 我老婆是骚逼 东北老女人性爱下载 you女孩太小插不进去 田中瞳梦工厂 港台本土影片 舔足h 最果神狐 梁婖婷被干 人兽坏弟弟 苍井空爱爱照 插入表姐身体 苍老师淫叫 欧美美鲍人体艺术网 实况足球8补丁 growing 无处安放 五十玫瑰在线观看 powdersnow nortondiskdoctor 重生之小保姆19楼 松原教育信息网 归化与异化 42楼的浪漫情事 最近黄金走势 杀美女吃人肉小说 欧洲亚美图色色小哥 李宗瑞电影在线试听 鸡巴插逼四脚兽 930影院手机版 我爱看片手机下载地址 免费品色堂论坛 尤女人大屄看看色色911 亚热之女先锋影音 男人做爱女人的小游戏 WWWSEXCCMILCOM 父亲操女儿台湾妹 最新人强奸与动物的案例 日50人体 高树玛丽亚bt种子下载 大胆性交视频 SE92KXZCOM 美国大胆女人人体艺术 女人色动态图 处女阴部裸体 WWWAVTTUUCOM 美丽女主播被强奸爆菊后擦电影 我和2个女同事做爱 成人激情黄色乱伦电影下载 少妇风流电影 xxx人兽性交视频 阴唇特写高清 操农村61岁老太太 快播免费成人禁片 粪礼迅雷下载 大色哥成人小说区 妹妹色色亚洲偷拍 9955d新地址 强奸艾儿 干干妈page 美女粉乳头10p jux381 激情少妇少女高潮 xb电影网奇米影视 黄色录像电影片段 李宗瑞torrnetthunder 欧美色图黄色的 淫妇av在线 小说日本换妻 男女性爱激情图 新女体洗澡 操你啦群p美女 哥哥干欧美人体 义母之吐息 幼女性照片作品 大屁股熟妇18p 偷拍自拍网友性爱视频 欧美专区在线 911ss主色911主站 漂亮面孔奶子圆高潮近叫不停 人体艺术747 性感男被搞射好几回精液 在线欧美激情电影 f05bbd3e00007510 撸色网百度 sese欧美成人 偷拍自拍12p 熟女视频自拍撸 WWW914XXCOM 华娱花花世界 关之林丝袜 欧美淫荡女人图片 自拍激情小说综合 日本黄色播放器下载 粉穴自拍偷拍 西西人体艺术张雨 俺去也伦理片免费 优艺裸体 肉铺团163wang xx社模特子顡 哪里有处女逼照 北原多香子艶尻ed2k 怡红院里什么名字好 女人做爱吧 巨乳人体艺术视频 606kxw色五 操嫩洋屄【0930】 WWWQINGYULEME 男同小说色图 妈妈大花屄 男人肏母兽完全手册 顶级黄色图片可看到阴道口 人妻熟女性交图片 东北火车道银镯子 快车成人电影网子 xingbiantaiwangzhan 张筱雨私穴 最激性亚洲顶级图片 极品性爱在线 体验区免费嘿嘿影院 处女色穴 大爷操影院可乐操 美国妹妹大咪咪 亚洲欧美图激情小说 WWWSESEOCOM 明星版h小说 五月色图】 voa在线视频 快播色青片大全电影网站 马六人体淫荡图片 音影先锋黄色网 苏格影院龙珠传奇 不用快播网页在线a片 操骚逼女老师 youjiaotongzhi1 俄罗斯妇女野外放尿 明星草 美熟女被按在床上操 女人被狗干是什么感觉 淫荡妇女优 国外人体私处局部摄影 欧美激情校园春色www34qfcom 萝莉爱色网c20sqwcom 非州兽皇 我们永久域名59cao放不了 在复仇者联盟里草女的黄色小说 都市校园淫妻 骚货寂寞自慰 操丰满大屁股人妻小说 菊花撸撸撸 美女被叉叉的免费网站 新亚洲第一页 为什么快播种子大全登不上 超碰带孩子自拍在 bta18con 尿尿大便操逼拳交视频 少妇与公驴交AV 菲菲综合 超碰勉费视 很去狠撸吧草吧 蕾丝袜美女嫩穴小说 男人影视duppid1 露脸绝对领域 兽入交 学生妹90后淫 揉胸吸奶150 日本美女特大胆裸体露逼 拍妹妹拍哥哥射 在新疆卖GAY影片 家庭淫乱小说之强奸处女 东北小女孩原版 成人网站dizhi1 三个黑鬼与日本少女性交 大鸡巴操骚遥 姐姐美妙的裸体 非卅人休裸 成人片丝袜的诱惑 老人介护士合集 坛蜜恋足 手机看片宅男伦理电影 大姨姐与妹夫乱伦偷情 张柏芝艳门全图 老衲爱百度 亚洲图片区偷拍自拍图片欧美图片小说校园春色 先锋影音av撸色 哥哥综合影院www791hhcom 少妻艳欲下载ed2k 13岁人休艺术图片 色色动漫连载 按摩女人私处 亚洲萝莉射av 美国女人和美国男人一流黄色三级片 丰满嫩逼 做爱狠狠图片 欧美丝袜足交电影快播 18岁人妻少妇口爆吞精 网友夫妻上传免费公开视频另类视频 天天射色女朗 快乐小猪幼儿舞蹈视频 淫荡姐妹小说图片 日本美女干死B 欧美成人女同性恋大片 亚洲色图av亚洲美色图 原色网 幼交片网址 偷情综合网 书包网乱轮小说下载 附近老女人做爱视频 偷拍自拍美罗城 youyoudebi 国语操逼magnet 伦理片直播写真 1024最新人妻观看基地 久草在线美女主播自慰 欧美色图片婷婷基地 日韩美少女射精视频 李宗瑞快播电影网 小仓优子duppid1 免费外国性爱电影 首页中文字幕偷窥自拍人妻熟女 wwwjizzjizzjizznet 都市激情亚洲美图 偷拍卡通动漫另类口味 光酷影院 爱AV软件是什么 妻子和别人的淫乱完作者不详 公共汽车上插小穴 亚洲sewangoumeizipai av网插女 岛国裸女mp4 av淘之类的网站 大香蕉久草aV Av电影代伦理电影的视频 快播制服丝袜强奸网 成人电影上厕所中国 超碰人妻人人碰5533tcom 美丽母亲儿子乱伦 苍井空种子视频网站 无毛美女姓交 人体艺术艺术激情 加藤ツキ超短裙义母的美穴在线观看 日本电影私处下载 有声小说沙漏 qq电台有声小说 春色医 樱井莉亚thrund 小泽玛利亚练功房 小泽玛利亚最多 小泽玛利亚三十部 小泽玛利亚无限 求可以看的h网 给h网 www完美制度com www黄色123.com se开心五月天 开心五月天地址 开心尽情五月天 东京热06 东京热300 酒色网电影网小说 古典武侠酒色网 酒色网卡通动漫 怎么在快播里看黄片 黄色小说集 求一本黄色小说 黄色小说黄色小说 美人电影 偷拍UU 98桃色网 爱窝窝在线 国产小电影 老色鬼影院 骚女窝影片 色妹妹A片网 942xb电影 操你妹高清AV zoosex兽交 18to19emo 桃花色 一色春 鲁鲁射 偏执型人格障碍 马上色 狠很橹图片 白 国产大保健 迅雷 人人操人人摸人妻 最新sq网站 www18AV 色夜院影 缘来影院 abp 淫女动漫在线 写真视频福利app下载 国产性虐在线淫女动漫在线 日本足疗视频 天天828vv 人休艺术视频在线观看 251eee 京香julia 短片 猫咪大香蕉情人综合av 日本在线加勒比一本道SM 医院护士内痕 小池里奈avBB图 做出综合网 av文档一月合集 人工智能ai让女神下海不是梦 13色图 CREAM PIE漫画 女同天天啪 大香蕉青苹果 小明免賛在线电影 女学生 清纯 在线观看 家庭乱纶系少说 97秋霞福利 日本人妻无码播放 萝莉黄色福利 极品美女在线视频 不收费午夜影院污 ktfuli mhdm。xyz 老年人汽车番号 扩阴啪啪 特级大尺度毛片 XxXx69日本 索菲亚无圣光 情人啪啪啪影院 人妻之妻电视免费看 强奸乱伦动态图 人碰欧美在线清 清风阁视频日本免费 - 百度 秋霞在线观看秋霞伦理电影 小美女被强奸的视频丝袜美女 小莹姐吃奶之汁口述全过程 青青草白虎无毛视频免费观看 青青鱼在线视频免费视频 人妻熟女视频 青青草免费无码高清视频在线播放 性爱视频高清无码 迅雷链接 性感女神ppp视频 协和lunl 全国华人偷拍自拍视总集频 秋霞在线手机观看版 邪恶dt图片第145大全 在线福利导航 日韩在线视频国产 曰本大尺度抽扦bb视频大全 日本一本道视频在线播放 有黄视频的月光影院 日韩av手机视频在线播放 日本童交视频播放器 日本在线hh视频 伊人久久精品视频在线 美女自拍福利视频 褐色影院 直播上床 美国女孩成人免费视频 操逼福利动态影院 我爱干比b在线观看 日本夫妻生活片 avhome seji色戒视频 青青艹高青视频 农村色,情视频在线观看 一本道色综合mp4 唐朝av影视高清 大尺度av在线 125电影影视 小池里奈线观看 色喇叭国产自拍 调教性奴鞠婧祎 live 图 无码 51成人电影 亚洲色噜噜 日本少妇5p 吉泽明步7SOE-539 国产91情侣拍在线 自拍偷拍 亚洲 影院 潘号导航 xxx黄色动画片 jjzz啪啪啪 8090碰新公开视频 福利网站懂的2018 人妖欧美操逼视频 国模私拍露点视频 操逼视频碰碰在线看 女人的屄毛形状视频在线观看 女优种子资源 b里香视频在线2白色爽 强奸乱伦 制服丝袜 成人操逼视频在线 佐山爱bt蚂蚁 爱看午夜福利电影院 岛国艺术写真视频在线 兄妹激情 撸撸樂 久久爱视频福利视频自拍 心理追凶磁力链下载 浪阿姨 少女给猫哺乳 美国性爱一级黄片 桐谷奈绪百度网盘 抽插少妇视频欧美 五月香在线 2017最新理论琪琪影院 四虎高清亚洲 夜色福利导航-宅男福利网址大全 热の中文 热の国产av 草坡在线视频免费视频 成人小视频免费试看 91日本 特级毛片影谍 小公主影院av 自拍在线-自拍偷拍-自拍视频-网友自拍-91自拍-自拍在线 偷汉子磁力 免费福利87微拍在线 天天看片视频免费观看 八戒影院av被窝电影网av 武林皇后在线播放台湾 女同性爱视频网站 午夜福利视频1003 淫空姐 12岁啪啪啪 avi 磁力 跨越海峡的一对情侣影音先锋 兰兰性爱视频自爆 kinpatu86 在线 训雷种子 龙头蛇尾 童颜巨乳 久久成人电影免费 何奕恋土耳其在线视频观看 8k福利在线电影视频 美女被操免费观看 WWW373C0操 52avava播放器 色婷婷亚洲婷婷7月波多野结衣 色系里番播放器 桃乃木香奈作品汇总 坏木坏木木集百万潮流小说 厕所偷窥视频 av中文字幕在线看手机 4438x全国大五月花 2017ady映像画官网 森川安娜在线播放 678影院 伦理片黑丝名字 怡红院人人爱免费视频 乐愚驴good电影网 zvtt在线 拍拍776 国产自拍,三级 波多野结衣午夜影院 橹橹橹橹橹中文网 欧美制服在线啪啪 韩国主播金莎朗 在线成人内涵漫画 淫妻妻图片 hnds在线 caoporn91视频在线 AV视频中文字幕 中出外国留学生 国内外激情在线视频网给 私色房天天色 成人caohub 类似cum4K的网站 美足av最新 神秘av 仙桃影 鲁鲁狠狠在线影院 mini按摩黄色一级片 欲望Aⅴ 东方影库在线av东方 处女肏屄视频 福利直播在线观看无需下载 福利一区飘花影院 动漫vip成人视频在线观看 大爱福利导航 大香蕉新人人现 第九影院神马网58Aⅴ 大黑屌免费视频 东方在线aav视频 大香蕉s视频 第九影院午夜重口味 激情乱伦强奸 巨乳亚洲欧美另类在线 国产自拍26页 国产站街女偷拍视频 普通话国产自拍在线 天天摸日日碰人人看最新777 福利伦理无需播放器 nannuzuoaihuangsedaqquan 女主播户外野战合集磁力链接 dodort 在线毛片自拍直播 大香蕉一道本视频 义母吐息在线1mm 国产原味小辣椒在线播放 恋足系列里番 在线播放 自拍偷拍 微信小视频 鸟站出品国模 ccc36em 神纳花电影在线观看 色色久草 eeuss快播影院手机在线观看 爱福利伦理片 91色老板福利电影 91hdav101高清女优在线 泽井芽衣的女教师视频 一本道 moo在线视频播放 福利中文字幕在线看 被人定住的迷奸视频 ftp 免费的小视频在线观看 菠萝湾视频 孤微视频日本高清 国产自拍电源 男人大鸡吧视频 国产自拍 水滴 奸云群 ckplayer 在线观看 偷 哥哥搞在线播放 日本无码视频在线免费观看 亚洲东方成av人片在线观看 任你玩绿色网站 avavavcn idgif卵蛋图解 0077cao改成什么了 时间停止器校园m 91gaogao漫画 国宝影院综合网 理伦片毛毛 av欧盟 人人操人人热 福利bar亚 aV零影院 成人网子你 懂得 肉片动画在线观看视频 射丝袜足 在线影院 6080星奈爱在线播放 女仆娇喘 法国雏女交 接摩人妻 91萝莉转区 网红少女免费福利网站 【35052】在线视频色和尚导航 张筱雨大尺度写真迅雷链接下载 欧美美女无内图 欧美成人野狗免费视频 娜娜sweet磁力链接 宅男吧 大香蕉视频在线频影院 趣爱福利m3u8 名媛人妻温泉旅行黑心精油马杀鸡 日本女人l对性的阴道 日本女人4050 欧美女同性恋互舔视频播放 新新电影倾城雪第1页 成人教育 西瓜影音 插撸吧在线 秋霞 国内自拍 极品口暴深喉先锋 韩国电影床戏女兵 超级av搜索系统 西条琉璃在线bd种子 日韩'AV 99成电人影中文版 天堂鸟ttnbbs 步兵 明日花 影音先锋 青青草人人艹 mide215剧情解析 wwwxiangjiao58 gav成人网无播器 棚户区卖暗视频 播放 18teenjapangirls 大主播网视频站 avnight官方 色婷婷综合网 重口AV名 阿夷令人垂涎的身体漫画 pr网红私人定制在线观看 澳门皇冠永久视频 extreme sm tube AW影院 大西瓜m3u8 AV火山小黄人 电梯里被陌生人干高潮 不知火舞h动漫 小姨夫影院幼女 先锋资源人体 小寨厕所偷窥 香港经典三级免费在线观看 校服白丝污视频 乡村巨根香蕉 JAVHIHIHI视频 renqitouqing 骑姐姐免播放 淫网福利导航 古川伊织star-621在线 欧美A V天堂 禁忌之爱弄自己儿媳妇 堇花团队百度云资源 2018怡春院av影院 哈尔滨A片 午夜剧场福利视频0855 avaoao yy夏同学6080福利片 校园春色欧美视频 极速AV在线 被男友强吻和揉胸自述 999Segui 超清免费伦视视频在线观看 梁婖婷磁力链接 私雅网站 动漫女生和男生啪啪啪视频 日本图书馆暴力强奸在线免费 人人妻人人操免费视频 午夜影院瓯美裸体 A级毛片高潮四虎影院 日本在线高清m949dtv 亚洲影院中出诊所 韩国伦a片 国产自拍D奶 sex做爱舔B jz轮奸一名日本人妻 按摩系列 av 岛国中文无码无卡在线 色吧5色婷婷 sm乐园 868 国产成人规频在线 Vip男人天堂 nhdt-在线观看 乌吗av免播放器你懂的不卡电影 影音先锋资源站xfpllay AV男按摩师系列 magnet 黑人成人网站 肉蒲团 漫画 北京模特刘倩宾馆 操美女小穴 苍木空裸体照 操B插B靠B 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 不要会员的干丁香视频 材料rti值 操婊567 xxxww日本 wwwxxxw6 日韩av无码迅雷 magnet 麻仓美奈 网红女主播户外女王剧情演绎性感女白领叫外卖勾引美团外卖哥 轮奸 夹紧骚货 www4438x10 户外女主播迅雷磁力链接 乱欲全家130 武侠古典在线成人 最酷AV,av天堂,醉地av,醉地视频,醉地导航,醉地,av导航av在线,av电影,av视频,a 岛国AV神作磁力 淫淫色播 大香人伊网在线官网动漫 欧美性色黄视频在线s+o 小新成人影视 中文字幕在线星野遥 卵蛋网葵司 aaa999xyz 女主播门把手自卫秒拍 啵啵xo影库 操逼的小视频黄点。 成人极速性生活视频 WANQUEYINGYUAN saozixaoshuo TGGP78在线观看 苍井忧无码磁力 mp4 成八动漫AV在线 超级国产av自拍在线 爆操小骚货骚逼视频 免费的视频美女图片亚洲小 丝袜美臀在线视频 国产自拍车震 内射妹子免费视频 五五热在线视频 叼嘿视频小清晰影院 深川铃 磁力下载 一楼一凤影院首页vr 日旧夜夜精品免费日日夜夜视频在线奥门金沙乐场 heyav tv日本在线 迹珠美av在线 www99ddocm avgu 一道本东无码免费 香港4438 日本avtt 自拍 快播 色五月天 色婷婷 色老大 色米奇 国内一极刺激自拍片 乱伦骚爽视频、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 六月婷婷网址 跳跳蛋塞美女下面视频 黄片大战 湿舔视频 啪啪在线自拍视频 美谷朱里 男女做爱小视频黄片 vod60视频 午夜福利十二点日本一本道 猪猪爱爱剧场 老湿机影院免费观看十分钟t 乱伦视频影院 速播影院在线观看 最新2019极品爆乳女神私人玩物VIP版 后λ视频 倫理在線視頻 哥干美女l2b feexx BT亚洲熟女在线播放 4455第四色 456电影在钱 97色色来在线观看视频 国产系医生护士搞在线 国产自操 含羞草成人短片在线观看 不用VIP的午夜 爆乳寡妇替欠债亡夫用身体肉偿 本道久在线综合8b网 彩乃奈奈中文字幕在线 被偷拍的女主播中文 国产手机福利人人干 上海性战3 在线啪啪拍视频 美利坚自拍偷拍 人与狗福利视频 磁力搜索~老狼 3D动漫番号 色妻视频观看 干老太体内射精視频 乱伦 激情 pp6s视频 天堂网_avmp4 苍木玛娜教师伦理电影 自拍白虎 东京热一本道av无码百度云 伦理片逍遥谷 小玉私拍视频在线播放 操女友视频在线 97国产早早 XO影院在线直播 44480影院 亚洲成人手机网站 江疏影流出视频种子 快播视视频在线观看 琪琪影院在线视频 play sss欧美完整版 佐伯雪莱 福利视频在线 [无码中文]有m感的苗条美人~做 成人街射你视频 更好看的黄色毛片 楼梯小姐在线观看 佐伯奈奈合集磁力 色妞ppp 裸舞在线网站 伦理片天堂eeuss电影 美国人与兽性生活手机版 论理小视频线观看 毛片黄色午夜啪啪啪 伦理电影自拍福利 少妇的福利 乱交在线视频 毛毛比较多身材不错肤白美乳 卵蛋guf 色喇叭色大香蕉 色姑娘棕色姑娘综合站 毛片免费强奸 极品魔鬼身材女神被满身毛 青山菜菜iv 极品色婷婷影院 激情五月丁香婷婷人人 网络色色Av新片 福利视频午夜小说自拍 偷拍,自拍在线 舒服抚摸揉捏蓓蕾舔阴蒂图片 小岛南ZAIXIAN 五月天婷图片大全 美国伦理电影哥迅雷下载 下载 雷颖菲qq空间 日本捆绑调教 强奸乱伦影音先锋影片 暗怕棚户区小姐卖b视频 暴奸秘书电影 明日花绮罗cos嘉米 连体袜系列番号 我要打飞 机com2019 日本语性别视频 PornhubGav 导航地址发布 lunli 91苏州模特 人妻生活前篇 sigua555 91蛋叔奔驰第二部 日本成人av电影 黄图男人丁丁一进一出真人视频 欧美曰韩A视频 黄片无码网止 欧美H资源 黑丝袜美女和帅哥啪啪啪视频 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 皇网无码 棚户区站街女暗拍洗脚准备开草门被踹开隔壁一对完事的要过来观摩妹子被吓坏了 黑人大鸡吧插逼啪啪啪视频 欧洲无码中字bt 猪肉佬小树林战野鸡视频 韩国1024手机在线播放 肛交视频免费性交 母孑性交 在线观看伦理国产自拍 内外双射激情片段合集 176大长腿野模空乘制服各种性感丝袜情趣大胆私拍2V视频 射影师糟蹋模特BB用扒皮的 韩国三级黄色伦理视频在线免费观看 蜜av 色播五月亚洲综合网站 - 百度 SIRO-3203 thunder AV在线论坛 有哪些口味比较轻的av 娇喘视频激情影院 玉洁全身推油视频 日本岛国中文字幕网站 小美女美乳跳绳 H番动漫在线观看粉鲍鱼 汉庭酒店叫骚 星野明 magnet 春药 国产 magnet 韩国车震视频大全爱奇艺 欧美尻屄视频 菜菜爱电影院 老头操逼免费视频 男人插88嫂骚视频女人9 木村夏菜子无码视频在线观看 国产叶美视频 国模无圣光写真线视频 国产主播自拍磁力链接bt种子下载 内裤哥郭静在线 新视觉影l院p7 二级黄片在线观看 神马你懂的的视频 迷奸超级美女视频迅雷磁力链接 神马影院福利视频88 YY4480阿婴免费观看 chunsetangchao 91boss宝马肉丝 在线 探路者 秘婷婷 欧美激情另类重口 yyyfuli 3Pvideo 桔子影院jm2222午夜 熊猫娜娜龙虾视频下载 wwweeeem AV怡红院 色蒲团 广州柳州莫青视频在线 色妞香蕉 www路52dvd路com aaaa555 在线Av800 在线观看亚洲偷拍视频 10 风吟鸟唱在线 域名升级 ffrrr 欣赏女人阴户图像视频 免费黄视频在线观看 凹凸视频线观看免费 肇庆白沙公园野战视频 chuangshangpapashiping 老头干处女体内射精视频 禁止的爱小第九影院 操狗bi 少女狠狠扣p撸 两性做爱高清写真 19p 优佳人体艺术摄影 蓝光wuma 色詀 优酷里面的丝袜诱惑花心男叫什么名字 澳圳性爱 经典三级1页电影 沦理片在线网 苍井空人人体 中国性交比赛图片 欧美午夜大胆人体艺术 操逼五月天欧美妈妈8888 那里有女人阴道艺术图片 日本人体艺术小穴图片 1级爿快播 轻舔丝袜 日本成人黄色动漫 干妈妈色区 超淫荡粗口脏话自拍在线播放 父女做爱电影快播 大奶子黑丝qovd 日本插逼激情 小说成人母子 喜欢给男人撸鸡鸡的女人qq号码 91四房播播 老熟女家庭乱伦a片 求在线直播黄色网址 很很 se 干90后丝袜女 舔骚逼网 成人视频包射网 人体艺术epub www66riricom 藤冲有关的电视剧 回家被哥哥强奸 最新黄色游戏 日本人体艺术手机图 zuoaitupianquanlou 日本女孩小嫩穴摄影 三八人体图片基地 狗狗巨乳美女裸体人体艺术 马六大胆美鲍人体 免费av女同姓恋视频 用影音先锋看的香港台湾成人网站 mama231 求一个可以用吉吉播放器看的网站 qingsexiaos 幼女艺术体操 每晚小姨骗我上床 日韩成人学生妹无码电影吉吉影音 宫藤新一的性福生活 黑人大吊快播av 天然大奶美女被操 dy东京热 幼群交快播 美女拨开小穴大胆照 我把岳母操的狂叫 亚洲图片小说网 关于鸡巴的故事 熟逼图片 密桃子成熟33gp 亚洲色图小肉穴 野战春色视频 拳宗不知火舞公园夜战 pingse论坛 涩情网站网中文字幕 五月天 va999资源网 美女美臀美穴艺术 女人粉嫩屄全图 欧美视频色七七影院 恋之欲室 百度云 泰国美女美穴图 wwwre999com 幼女海滩性爱 影音先锋 日本人体艺术绿色 最新日本无码av在线观看 连裤袜慧姐小说 女同性爱技巧淫淫网 大鸡吧肏屄里了 kk色色网 孕妇乱伦影视 nnn91色欲影视 看明星裸体 少女激情性爱图片 欧美裸体美女肏屄图 三级伦理艺术片 情电影52521 视频 WWW_850QQ_COM 屄【p】 2012rrcom 波多野结衣被射精图 WWW_778AAA_COM 欧美乱伦老肥胖女人df 美女列车伦理电影 李宗瑞那部好看 西西力人体艺术 干漂亮小媳妇 成人亚洲快播 奇米re666 最新先锋强奸乱伦 捆绑阴茎虐待刑法 干黑袜丝女乳交 日本男人干欧美女孩 国模巴拉拉大胆人体艺术图片 后庭教程 我和嫂子的做爱故事 波霸电影 日本杨幂种子 插淫逼图片 淫女色文 家庭乱伦网址 乱伦强奸偷么看 乱伦性爱无码中文字幕 亚洲sse色图 WWW_LUO999_COM 08人体艺术网 骚妇掰屁股p 影音先锋梁祝艳谈网站 WWW_VIPKUAIBO_COM 欧美逼毛 骚屄浪奶 要干a片网 黑人操妇女 沈阳淘乐新天地影城 3ipad 魅影小说 玄关狭长 山海传说 脱肛吃什么药 激情另类套图 超极度性感日本靓女人体 13日本大胆人体艺术 迅雷下载a片的网站 看人与狗性交的网站 nvyinshengzhiqi 张筱雨魅惑爱人体 chengrendianyingguankan 粉嫩小骚屄屄 继母爱图片 女人爱操逼怎么办 狠狠影院下载 爱爱jj发综合网 骚妇被操出白浆 蛇妖美女人体艺术 茜木铃 女人为出名用一层纱来遮挡身体 99bt核工厂成人 小说享受泰国浴 绝色骚货浴室自拍 为岳母舔阴 大月日本美少妇人体艺术 激情撸色天天草 35人体艺术图片 搡大白逼 林心如脱光衣服做爱视频 操操淫乱穴 色狼和丝袜妈妈 日本男幼影片种子 WWW_AAA_COML 性爱白色丝袜 及度强奸 蝴蝶色播 色哥撸成人xiazai 人体艺体术网 美国大尺度阴道摄影 兽交高清下载 色网站怎么都上不去了 漂亮女大学生在学校里被黑人学生干了的性爱文章 人体艺术草 乡村淫汉 我日了教师图片 挠脚心的小说 刘涛三级影音先锋 水树玉高清图 欧美丝袜svs视频 亚洲色图入江纱绫 成人性教育漫画图片 草小学妹 寂寞少妇极品美鲍人体艺术图片 人体艺术qvodthunderftp 色b姐 丝袜熟女人妻电影 WWW_12SE_COM 最新情路扣扣对话 俄罗斯大吊qvod 尻妣视频 王陆晴西西人体艺术图 菌の黑汁 乡下老夫妻扫墓坟前做爱高清偷拍 大便chaodongtaitupian 阴茎插入女人阴道文章 各大影院网站 rtys照片 WWWAA66ZZCOM 岳阳县荣家湾东风路的妓院打炮要好多钱 贺媳英 中学屄吧 dabimn 最新激情黄色图片小说网站 好色女成人网在线视频 偷拍熟女露鲍 国外天体海滩视频 鸡吧上起个火结子 av幼女种子 中国熟妇性交 日本哪个是白虎女优 熟女视频在线视频 自拍偷拍女女 和黑丝女老师做爱中文字幕 嫁去国外的淫荡少妇被阿根廷老外操高潮 人体艺术图片之舔阴艺术 骚妹妹蝴蝶色色成人网 jioingwuyue 日本美臀片 丝袜乖乖美女 70路熟女交尾 狗和人做爱的卡通 清纯唯美789 视频偷拍逼 美国性爱俱乐部 看老婆和别人做爱 陵辱2穴人生初中出快播 最大胆的摄影艺术 大自由门 深液操大逼 美女的色穴18p WWW78WWW38BOBOCOM 红苹果56女生视频90后 吕婉柔李宗瑞 天天干夜撸 影音先锋高清五十路 欧美成人色图片 肉色丝袜脚超清 狼国色人体 西西大胆激情视频艺术 h级爿 阴就插入小穴 无吗bt种子 三奷乱里五月 巩国兰穿花衣图片 性感女妺妹 强奸性感教师图片 淫色姐姐激情电影 caoporn用什么视频播放器 我用黄瓜套套插自己 性吧sex自拍偷拍 少女少妇幼女性爱 幼女强势进入 欧洲女人体局部高清 老农夫不准打灰机电影 美女图片b照 第一色房 宝玉冒雨回到怡红院 操穴骚穴骚屄插入 丰乳先锋影音 欧美裸体熟妇 五月天大胆美女人体 十次啦亚洲av 五月母子乱论小说 性感白屄人体 欧美孕妇裸体写真 骚穴内射骚逼 山田麻衣子电影么名字 新婚处女儿媳柔佳雅君 妹妹的小穴p 朴妮唛做爱动态图 杠交美女被干 加勒比女海盗torrent 丝袜美女被插插视频 五月天激情网迅雷下载 有动漫色图的网页 l浪起来色色综合 可以直接看黄色电影的网站 爱人体静雨 av网站求给地址李毅 银河护卫队2天天影院 妹妹的da骚逼 黄色8090视频 狠狠射专区 狠狠搜美女 裸女巨乳骚穴大图 人妻凌辱图 强奸熟母 色淫网撸撸 人与人性行为大全搜狗影视 WWW12GAOCOM 欧美大屁股黑珍珠 妹妹骑日 女马交配 色姐操逼网 东南亚少女10p muziluanlei 美丽人妻熟女爱爱图 能看见美女黑洞图片逼 撙士15p 人与狗熊交配 与外国男人激情性爱 台湾大禾丽 成人世界李宗瑞 少妇乱交30p WWW32ZTCOM 快播无码亚洲电影网 小泽玛利亚裸阴 footjobjanpenese足 内容有学生的av网站 风骚美女穿脱丝袜全过程 亚洲色图校园春色激情小说五月婷婷 干死日日b 2015最新操 激情淫乱色网站 清蒸花凤琴系列 亚洲色狼网友 av亚洲天堂网20l7 色喜大胆人体 都市武侠古典校园 亚洲请色音影先锋 成人网站有声 同性伦理聚合 swww99aaww 全国最大的日b网站 久热巨乳裸女 超碰少妇的诱惑 北京人体艺术网 北川瞳人体 东京地下女子影音先锋 熟女人妻变态另类手机在线 三个妻子的污漫画 小骚妻肉便器 步兵爱情电影院 春暖花开大香焦av在线 淫荡骚岳母色图 欧美色图男女乱伦 哪个网站能看到大阴茎 快播日韩av插件 成人欧美第一页在线伦理 浪b网 电驴插嫩逼逼 kkyyzssmagnet 快播骚岳母 印度av无弹影院 毒蛇av影院青 2017成人电影云播放 gay黄网 色波小说 萝莉社区luoli85 儿童爱爱网站 私爱阁AV747com 厕拍在哪搜 乱伦强奸小说吸奶 口交网撸很很撸很干www78p78info 狠撸欧美嫩逼 性吧电台网址 930影城色色影城 肉叉烧包洪金宝 日日干夜夜射天天啪365ahnet 猎男别动队在线 婷色艺术 sese97快播成人电影片 撸淫乱a9av7comwww1kkkkkcomwwwaaa366com 日本做爱大胆人体艺术 16p人与狗 淫乱绝世唐门 老公操死我嗷嗷叫 国产老人做爱在线播放 wwwzz姐姐 大学生做爱偷拍自拍在线小视频 三季带片 近亲分类影片 动漫AV中文字幕迅雷下载链接 狗日女人的真爽好大好舒服小说 刘安琪三级无码 苍井空潦草av片 美女乱轮小说 偷拍自拍欧美色图另类图片萝莉幼女 扩阴器多少钱一个 涩情成人免费播放器 美女人大胆性交猛图 深爱激情四房播 日本片偷拍两儿子和继母一起洗澡 23p啊啊哦哦用力快点 国产调教师 幼爱uu插图 狐狸成人电影 超碰视频con操逼www310zycom 林由奈电影在线手机 b13区2百度影音 超碰链接 桃源AV 射逼逼网 激情五淫激情ssj0comwww2wwwwwcom 校园春色淫荡人妻幼交 快插玩 成人动man 快播初美理音 小学生偷拍妈妈洗澡 xn漫画 宅男福利影院改叫什么了 操死女人逼 无毒成人网址中文字幕 超碰在线巨乳专区 欧美重口味人兽性交 邻家阿姨叫我添她下面 gav无播放器成人网 日日撸百度 婷婷成人网成人网站 中年妇女性爱激情图片 美白丈母娘乱伦 狂操公主嫩穴 欧美非主流性交 亚洲美女色诱图 澳门威尼斯人去去妹 性爱自拍色图片 父亲替女儿解决性 大鸡吧插嫩逼小说 色欲色撸 哪里看欧美乱伦 舔大学美脚微博 久久日在线观看免费923yycom 工口h漫画虐杀桃花岛 羌女阴部大全美16P性爱图片 妻孑的深喉感觉 五月少女艳情大奶妹 果敢成人激情网多多影音 狂插护士的大鸡巴 mCC色色白虎逼图片 www992ZyZC0m资源 超级明星大淫乱 共妻小洁哥去射 抠逼叫床 超蹦公开在线直播 在线视频偷拍自拍情侣丝袜欧美色图 哥哥色受美利坚合众国 东方4V伊甸园 guomoHD 狠狠啕蝶谷 三级黄色添下体 操射有声小说 wwwxxx人妖谢精 中文字幕风间儿子 zhaixiankanhuangpian www03meicon 高个三级片看看 六哥影视登陆 五月婷婷狼 louxuetu 一本道有码a片 性色图在线视频 大鸡巴操小屁眼 第一成人基地 丰满嫂子五月天 cengrenjiqingxingai 明星裸艺术 欧美色惰图片 wwwsusu62som 成人激情无限综合网 色哥看AⅤ 亚洲偷拍肉丝美女 99久久免费热在线精品动漫 哈起吗伦理 狂插空姐淫穴 靠比真人版 狠狠搞视频在线 5355ddcou 大香蕉亚州色图 亚洲图片自拍偷拍日韩伦理 狠狠插影院 亚洲标清成人在线动漫电影 av毛片无码片 韩国成人在线视频观看 无毛人体艺术照片 偷拍窥拍888 童话村av 美女性交欧美在线视频 国内成人偷拍电影院 sA片 艳舞性爱片 免费的黄色网站0 黄san 另类小说52AVav 超碰厕所偷拍在线 哥哥撸妈妈 牛牛碰免费啪啪视频 黄色资源最新地址 【vaaainfo】 骚穴看看 激情网址五月天 狠狠cao在线视频观看 大嫂撸 黄色图片观看 宅男色影视gggg69 先锋资源玖玖爱草第一页 夕草在绕资源站 汽车之家 处女一级做爱片 能看调教图片的网站 瑶瑶美鲍 中国美女外阴裸露 成人影院操P 国产av高清自拍 国产小妖精自慰视频 偷拍自拍区台妹 884aacn 哥哥撸xxx 漫画人体小穴 翁媳操逼乱伦 色哥我日女儿 巨乳丝袜操逼 3七tp人体摄影艺术网 五月天四房间播播电影 露b色图 撸撸射操逼电影 男女交配高清视频直l播频直播 A片套图 暴力虐待亚洲色图 234XXXX 卡通图片美腿丝袜亚洲色图 淫淫插插插玩穴 中文字幕黄色电影网谁知道 爱液操大鸡巴 wwwpp398comVR 儿子日妈妈阴道 动漫鬼作 WWW77baocom 3366mp3com 丝袜骚妇影音先锋 huangsecaoxue mmm9ckanzycom 天天射综合网偷拍自拍 第四色婷婷奇米影视 a片资源免费吧 大爷操作影院388sesecom 亚州欧美另类专 欧美双飞在线视频 亚洲处女网 草榴掰阴偷拍自拍 手机看片亚洲第一色 激情性爱小说网亚洲色图 曹颖三级照片快播 超频视频第一页 欧美久草色 成人套图黄 黄片日本magnet 美国十次博客 激情骚妇15p 优果网电影在线观看 大鸡巴操逼真人版的使劲操色色影院 japanfreevideoshome国产 欧美偷拍自拍偷窥 成年人五月天b网 美乳少妇尽情享受抽插的快感 幼女蜜穴女儿 学生妹被强奸免费在线看 一部女生被插jj的完整黄片 女儿浪叫 澉情五月网vv99vvcom 嗯啊不要 操逼声音 wwwpu311commbdbaiducomfifjpzeoycn 淫荡少妇被轮奸 卡通动漫淫 0088aaa上女朋友的闺蜜 x77135com 无极影院美腿丝袜 法国极品在线看 欧美色图lav 趁着儿子不在家让媳妇为自己服务下7M视频网网罗成人在线视频精品资源 人妻丝袜中出 www980 caobiwangseqiqi 骚老湿av 巨乳美女的奶水 光腚女人 迪丽热巴小穴 精品套图奇米影视 850黄色网站人与兽交配视频 移动成人你射精 成人看片自慰免费视频在线观看视频 伊人网伊人影院在线 后入女优P 午夜免费频道最新最热 www色comwww821kxwcom 霸上留守村妇 青青草有声 夫妻调教女奴 wwwfuliqq wwwliwu077com 免费的黄色电影 云插 慰安妇真实无码图片 日本妈妈的淫荡图 黄色乱伦电影av 澳门金沙动漫成人av 手机看片1024国内甚地 熟人妻网 大色网站av www944ffcomcn 我爱撸撸网 WWWavtb789com 我爱人体艺术图wwwwoairenticom 美腿丝袜迅雷下载 亚洲欧洲校园另类心灵捕手 rbd565在线HD www969ppcom百度 91自拍za 好色上美ol 热带夜手机在线播放 色色在线综合网站 第章熟女双飞 怡红院首页4000hhcom 香瓜妹最新地址 岛国A片免费 成人电影插插插 日本美女色穴图片 家庭乱世小说txt图片 日本色虎网 美子与公猪杂交产子 母子乱伦强奸小姨子 丁香五月小说网 欧州亚州偷拍图片 欲淫强奸亚洲激情 亚洲白虎B图集 俺去射成人网 大黑驴冰冰小说 使劲操骚逼 haole56789 大秀天堂下载 天天影视手机版 美女拷臂动态图 freehmovie动漫 熟女露脸激情自拍 成人激情图片,电影mmmnn7777 换母俱乐部 野人性交电影 geyesecn 失踪的小美幼完全版小说 japanyellowmovie 亚洲最大的成人网站wwwahhqgovcn 欧美吧夫妻 88coco最新网址 93年身材纤细妹妹抱着操才爽 情sei小说 柳岩操逼视频 教师夫妻的交换 美女光定高清图片 htppdddke9pw 内射翘臀少妇视频 韩国操逼怎么叫 推女郎青青草 成人A片小说 搜索女同人体 亚洲人体100 日本少女性交射精视频 葡京热任我鲁免费视频www25popocom 图片区我x要x你xx 韩国黄色的三级片 午夜成人性交生活 越南妹子多少钱玩一次 日本少女激情电影兽欲 最新乱伦比较黄的肉文 av调教视频在线观看 都市激情8899 caopron在线大香蕉 淫乐公馆 泷泽萝拉超碰在线 淫男乱女小说 日女人B洞小说 www点sesev点 3344VB 天堂avtt2017手机 黄色成人快播器 不用播放器观看成人电影网站 潢色片电彰 色7xavcom 你懂的zoos 美女撸撸视频插逼 请君撸angelababy 千人斩萝莉 韩国女主播黑丝叉叉 在线免费观看优色 在线巨乳美女视频网站 丝袜美腿居家熟妇 偷偷盗拍 泰国色哥 cheng成人动画 制服女人的性器官 色色偷动漫 强奸乱伦影音先锋第12页 自慰喷潮在线播放 先锋资源www7xfzy 在线有码1页 亚洲伦理在线无码电影 色色网老年裸体 在电影院偷情舔逼 小明看看黄色色 坏孩子A片番号 幼女的世界 开心四房快播 色厕所偷拍p 鼓楼色你懂得 欧美性交视频AV在线 最好看十大无码AV 一本道协和电影 成人激情12P 童交hentai 激情山村 肉感爆乳妈妈 偷拍自拍实拍 看图秘密app 影音先锋制服丝袜偷拍 东京热图片站 免费的av小电影网站 www路tu550 xxx苍井空黄片 老师插俱乐部 v色成人影院热热色 类似ked9的网站 猛操侄女的骚逼 之美丽人妖空姐黄色另类性乐趣 肉欲女医生 男人资源高清无码 WWW_WWUUSSS_COM 哪里看av影片 色妹妹25 偷拍学生妹自拍走光露穴毛 李宗瑞种子下载谁有 欧美性在线人3 外国人大屄大奶 地下歌舞团黑酒吧演出 猛男以超快速度不间断最后干的女友高潮长叫一声 操逼对人体有哪些好处 日韩爱情电影快播 色亚洲吉吉 做爱好图片 大胆时装秀千千影院 都市激情 综合网站 爷爷孙女性爱乱伦 美女动态图片都不穿 月亮女孩人体 抗日红杏夜色贵族 写真个人 张婉婉做爱白浆都操出来了 亚洲爽图馒头b 西西人体给力人体网 知性 激情五月成人 操逼图片 美女图片 国产三级伦理电影 美女老师操逼 淫妻小说日本做爱 99大胆人艺体图片 骚骚妈妈萧楠小说 欧美熟女乱伦15p 男友是黑人阴茎太大 女性人体艺术成人用品 色五网迅雷下载 哪里能看撸片 肏屄露屄图 色擦擦色图 成人 南宁极品美女 欧美成人在线视频无需播放器 蜜桃成熟 骚货 在百度种输那几个英文字母可以看裸照 异地恋对象各种勾搭怎么办 熟成人电影 韩国美女护士人体艺术 最新乱伦强奸迷奸小说网 小泉真希 美鲍 人体艺术图片搞鸡 www骚碰 女主播琴雨全集 11岁美女巨乳图片 幼女的资源第1页 古田美穗亚洲电影 好色妻降临 快播 欧美动物av sm性图片 穿着网袜人体艺术 淫荡老姨妈和我乱伦 外国的性交视频a 人妖乱伦强奸电影 同色电影网 自拍屄特写 日本美女兽交 第一会所骚穴 美美奶子裸体照 强奸理乱伦 毛片短视频 骚货护士图片 和妈妈玩脱衣游戏 乱伦小说 屄1图片 人妻1953 国产操逼片 人与曽肏屄播放 操自己女儿的逼小说 人体艺术a4u套图 偷拍工公园男女激情图 caodapigu 操大屁股女人 女生宿舍偷拍性爱 暴风影音偷拍自拍36ccc 对操图片 成人小说视影 欧美女王另类调教视频 性交生殖器动感观 qvod 女儿的奶水 亚洲色女露逼全裸图片 美女裸照种子 国模人体艺术大全 屄逼肉 高清视频成人写真 吉吉影音幼女片地址 八少女大胆裸体照片 女厕 露脸 成人捣逼 拳交 兽交 重口 日本少妇私处图 h狠狠搜 女人白虎屄 人和鬼做爱 父女做爱的自述 94蜜桃色图片小说 自拍偷拍激情艳照 偷拍自拍撸撸色明星陈慧琳 成人动漫电影小说 亚洲激色图 越狱第二季高清下载 太原回收冬虫夏草 心理学与生活下载 禧阁古装 感知农场 北京公交车线路 艾灸视频 WWWWWJOUJIZZCOM WWWWXRBCOM 爸爸鸡巴插我屄里教我做 日本性虐待漫画 透明裤衩美女看见屄开口丝袜 岛国肉片在线看 美女裸模劈腿露阴毛照 色色公公与好儿媳 美国人家庭性爱乱伦春暖花开 黑人体艺 www亚洲色图com 童话村徐锦江 池田小可ed2k 美女操干 这老外在泰国专干孕妇 插你妹仓木麻衣 金发空姐性交 色老头色图 黄色乱伦性奴小说 国产群交视频 7788sesewang 为什么男人都色总摸我 朴妮唛没马图片 臭逼成人网 大屁股淫妇也疯狂 WWWQL028COM 空中剧场相中xian 长相超赞的欧美白发天使女郎床上大胆人体 我和小姐乱伦 567pm 兽交影片先锋 美女毛片a 日本熟女人妻黄色网站 3级激情小说 在线美女成人电影 大肉棒插新娘小穴免费小说 四房播播成人网 WWWMEIZYWCOM 毛毛逼网 形形色色六月天 亚洲淑女老妈视频 小说激情的少妇和狗 亚洲av人与兽 成人电泓网 淫淫网色吧26uuu 日屄找谁 苍井空绿色大战 正在播放幼岁交快播 wuyuetdvd 由赖心美 小任的调教 乱伦大鸡吧操逼故事 欧美专区在线 和女仆干真爽电影 裸体体艺术 脚插入美女的小穴 肏赤峰情人屄 人体写真阴道i 内射妈妈乱伦电影 风暴成人网站 f05bbd3e00007510 口述女人操逼 影音色中色成人人影院 成年骚女人 孕妇阴外艺术 快播强奸少女小说 操闺女逼小说 422sss 人体艺术夏冰百度 小早川玲子诱惑美腿教师影音先锋 春暖花开性吧有你亚洲无码视频 成人在线专区 wagasetu 禁片人与动物 寻找日本乱伦家庭黄色小说 屌配屄毛 偷拍自拍东方色图 美女做热爱性交口交 qisedaohangchengrenwang 柯南zonghewang 明星美图视频 小说骚女骆白 av音影先锋 黑人空姐种子 内射中出肏屄 口交口爆性爱 rentiyshu 嫩逼会所 哪里有欧美高清性感图啊 人体图艺术片大全 人体淫秽性交色图 加山なつこ无码流出 李宗瑞性侵视频全集久久 三级色黄色片图片 菲律宾三级片 日韩女同色图 四房快播狂插美女 av男人电影天堂dg286com 哪里有阿娇种子 有免费的操逼视频吗 美女写真内射 西瓜影院图片图库 快播少女裸体艺术表演 如月教师快播 操屄小说视频 蒙古女人的性欲故事 本地偷拍自拍 女人黑木耳wwwgzjnetcom 欧美av美图天堂网 少女小骚逼照片 农夫新导航不准打灰机 苍井空AV全集在线播放一本道东京热 24报偷拍自拍 换妻母子 美国一级毛带基地d 樱花族luntan 空姐干爹 解梦淫妻网 妹妹爱液横流 色婷色婷婷五月丁香 曰本少女曰夜射 熟女乱入10p 欧美图片日韩自拍偷拍 亚洲性l大爷视频av 美国大片操 妹妹主播 淫乱熟女艺术 cctuo wwwAVKUTV 干少女肥屁股小说 古装电影日逼 白虎美女色区 幼幼片微信群 家庭乱伦综合 无码免费中文字幕wwwhhxxoo1com 哪里能看最新东京热 抽插揉捏少妇小梅 欧美阿v女星播放 18岁以下禁止视频myoukucom 伦理片和姐姐野战 2017港台三级最新网站 快播成人中文字幕 插姐姐奶 18禁图片干比 www撸撸射亚洲人 操插瘤护e?1?7?1?7流水 wwwbaiducomwwwbbb077com 公公公公操操媳妇嫩b 桃花宝典极夜著豆瓜网 厕所里的肉肉 激烈抽插漂亮大奶妹 先锋影音av撸色 疯airav安卓 黑鲍老女人 13岁人休艺术图片 chengrenxingjiaoba 韩国玫瑰主播 邪恶帝国肉番全彩变态 插了进去妈妈a片 处女人体艺术阴部下体 在线点播长电影 wwwcaoppp9com 群p门 撸一撸幼女性交视频 少妇的qq或微信 外国姨蕾丝水 老阿姨包吹www91qq1com 美乳诱惑美女 撸一撸强奸乱伦电影 日本大奶大屁股电影 成人小说sis 舔阴猛人网站 色尼姑全亚洲 好屌干qk青娱乐 下载邪恶姐弟小说 谁知道色五月网址 美国黄色pnt miaomixia 青草快播全集 大咪咪色图网 龙骧亚洲色图美腿丝 男人插美女护士私处视频 男主播飞机自拍 pengchao 黄色一本道a片 大奶子干妈给撸着鸡巴 网页搜索午夜大片 坠落女友九九 wwwhaorenshuoc 台湾明星teresa 女厕所系列网站 极品美足猫色网19 插妈妹妹综合 h人妻女友短篇小说 农村少妇裸体写真艺术图 色播五月天 开心网 有声小说叫床 有声小说神医 最春色小说 大陆春色 樱井莉亚dvd 小泽玛利亚紫色 波多野结衣图片 求火影h网 无毒无弹窗h网 开心播播网日韩五月天 东京热天使 东京热0108 东京热jpgfs2you 快播酒色成人网 安也去也酒色网 9492酒色网 波野结衣av影音先锋 悦来客栈 采色区谁有E 插骚逼电影 屋屋色影视 小骚女影视 AV色站导航 开心激情影视 你淫我射电影 人间风月影院 人来色成人网 色JJ电影网 性乐汇色高清 淫荡AV美女 高清无缓冲影院 赤裸宫殿谁有E谁有G 美妇骚穴成人电影 法证先锋2 日日夜夜 葡萄干 公开caoporn 新农夫 色之综合 免费无码不卡动漫 音影先锋 2019 色色资源 唐人电影1号站 偷拍影院东京热日本 无码中字 人妻中字 强奸中字 闷骚欧美在线影院 谷露影院日韩 蜜Av 性漫画在线免费观看 magnet 蓝色导航地址雅虎 美女ppp小黄视频大全 76,kkkk,com 色五月综合缴猜 4438x打不开换什么 古墓丽影香奈儿在线观看下载链接 天天一鲁 gay pornhub video chitu 日本大尺度黄片视频网址 中出视频456 四虎在线影院 magnet 秋山雫视频写真 性生活抽插视频播放 拳交的美女裸体视频 晓晓影视av 秋霞伦理电影网中文板 犬交福利 邪恶e漫画口供无遮挡了3d 日人人555 日本三级高清视频 影音先锋在线视频 与洋妞大羊女做爰的免费视频 日日啪夜夜爽天天干2017 樱井步 骑乘 玉桃园毛片 日本午夜成人一本道 日本性虐电影百度云 656影视 美女的下面怎么长黑 天昊影院理论片 在线的午夜成人av影院 フェラハメりっぷす-01分 美女主播菲菲福利视频 小蛮腰xxmmyy 视频全集 avhome 黄瓜视频福利地址 狼人在线播放视频中文 韩国vip福利在线播放 大型AV 日韩高清av在线 亚洲 小明看看 神马电影dy888午夜4k4k 欧美色女郎 4438怎么播放不了 老鸭窝移动网站 天海翼秘密女捜査官协和影视 心心影院 福利 京香人妻动漫 驾照家教轮流操爆20女学生 av2017手机版天堂网在线观看 国产主播热舞4000部在线视频 强奸少妇 magnet xxx|4性交视频 秀美白脚趾视频 大香 蕉伊人免费视频 西西国模吧 波多野结衣d∨d在线中文亚洲无码无码视频 乡下小学女生的性生活视频 模特被扒光 在线视频 啪啪免费国产视频 男奴舔美女高跟鞋视频 走光偷拍青青草免费视频 77777电影院院 少妇白洁有声小说 大牛电影福利电影 高清无码偷拍磁力链接 下载 色一色午夜夫妻影院 兄妹激情 曰本阿V无码 2fc夜色猫视频在线观看 ee亲 a片mp4午夜影院 灰丝少妇zaixian 邪恶少漫画大全4399漫画集 日本综艺节目在线78看 无码潮吹电影影音先锋 在线影音 素人搭讪开房!性交偷拍流出影像 1能不能看一看A片 成人小视频免费试看 青娱乐视频极品视觉盛宴 英国色色 卵蛋网MIDE 国产3龙2凤群p直播视频 395UaGG 亚洲不卡视频大全 青青草欧美做爱视频 白丝袜萝莉足交 四虎影院aV在线20l8 jj无码激情视频播放 免费做爱云户作小视频 国产社区在线自拍视频 偷亚洲在线视频观看 淫妻艳姨 玩弄吃乳头视频 午夜月光影院黄片 中文字慕大香蕉免费视频 A4U官网 冲田杏梨影手机在线 javbbus 老司机成人网站4388 福利女同视频在线 美里有纱影音先锋漂亮女教师 男恩妃南非黑人同志在一起做爱的片子 黑木耳福利 富二代在线福利視频 拔插在线公开 午夜影院av神马影院 费的韩国伦理片 超碰青娱乐导航在线 AV天堂5018 km302c0m www++t828++win 偷拍走光成人 图片 好国产自拍 色色色天堂 午夜电影伦理人与动物 朝鲜高清在线色视频 足控电影有哪些 aikoiijima caoporn原纱央莉 岛国三级磁力链接 magnet 西野翔 夫目前犯 正在播放 白石茉莉奈免费观看 猫味网站 极品呦呦集合 jjzzz欧美 铃原爱蜜莉电影下载 ftp 上原亚衣av片 26uuu亚洲电影最新电影网站 小明看看正版 caopron\ 长梓泽免费视频 等一次玩这么会喷潮的女人视频 金荷娜丝袜视频 gav成人不用下载 六点成人 www3131dd 静香的欲望漫画 香港成人夜色影 ai宅男影院 色爱热 鲁鲁狠狠在线影院 saoyi8 国产自拍视频崛起 电车痴汉 立花瑠莉 福利视频偷拍 大啪噜 大肥女视频@StopFuck 东方va免费进入免费观看视频 粉嫩欧妹 大波妹 福利 国模 视频 在线 大香蕉在緌人妻 xsm 影音先锋 大香蕉草逼视频 动漫伦理 璃莎 yuoijzz日本在线播放 日本高清hav 日本嫩泬插ji 韩国少妇丰乳翘臀视频 女主播魔仙迅雷 超爽影园 桃花园宅男视频 九哥操逼以 邪恶影院黄色 日本交尾无码 磁力链 下载 久久自拍视频在线观看 欧美骚逼视频 我和阿姨乱伦视频 四虎0202 在线aⅴ福利网 av小学生黄片 雅情会首页在线 4438x全国最大成年 本库子 正在播放喉奥 女捜査官波多野结衣mp4 东方成人正确网站 五月樱桃唇bd 自拍透拍五月 闫凤娇全套无码magnet eeuss快播影院手机在线观看 欧美成人凹凸视频播放 小仓优子露私处视频 有色视频 大学情侣自拍视频在线 xlyy100 厕所自拍偷拍超碰 国产自拍精品黑丝 男女日bb的视频播放器 影音先锋主播勾引 神马影院欧美无码 青青草免费导航在线视频 看着我的女友变淫荡 mp4 狂欲a片 一本道色戒 wpvr-108 先锋影音 国产白领,迅雷 magnet 【国产】漂亮華裔小美眉白老外大長屌插嘴十幾分鐘 射的滿臉都是点击播放【巨乳,重 九尾狐狸m视频在线种子 56popoc0m 莉莉影院在线啪啪视频 桃大桥未久在线 中学生嗳嗳网站 我女朋友视频最新地址 欧美俱乐部的视频 人人曹b 大尺度av vvvv999 无码高清av 996re在线中国偷拍视频 久热 操逼人兽com 中文字幕女优磁性连接 www502rr,com 国产高清情吕视屏网 波野多结衣护士是什么名字 米奇影视777在线视频 国产骚妇卡戴珊视频在线 石榴社区先锋在线视频 国产98G奶 制服下的名器丁雪倩 无码轮奸BT magnet 磁力扒 涩涩的网址 sssXXX欧美 天天曹天天插天天摸 日本好色妻 强奸乱伦zaixianguankan 番号水杯里面下药 饭冈加纳子在线播放 赵得三日张爱玲 免費高清視頻一色佬 午夜呃福利 妹子bb超粉嫩,绝对是个极品逼 灌肠欧美在线观看 在线Av,41saO,COm Tom天堂 四房播播婷婷电影网 舔着空姐的小穴 嗯嗯香港毛片 大贯杏里AV资源 WWW,XXBBmon 美国艳星taya 在线视频 欧美电影 xart 啪啪啪电影漫画 ssni141在线 思妍白衣小仙女被邻居强上 用什么搜索草榴 大香蕉亚洲人妻小说 莉哥不雅视频 好屏日视频53sao com 尼可基德曼三级 弱气乙女网盘文件 av淘宝2o19淘你喜欢 布兰迪爱 美女主播和炮友啪啪直播对白清晰 线国产幼偷拍视频100 小早川怜子和江波亮在线观看 小萝莉影院福利 先锋视频玖资源站 性爱直播磁力链接 小明成人在线漫画观看 性感空姐啪啪啪 香i巷黄色片 香奈儿·普雷斯顿级网站 性交ⅩxⅩ视频 b站可可味成人在线视频 国产在线fenbaoyu 女人乳环阴蒂环强奸 月夜影院av 一级黄色大香蕉片 制服四虎 汤不热流出极品白肤美粉嫩逼逼小 三级片免播放器 gav 欧美日一本道 - 百度 - 百度 - 百度 - 百度 3344fmcom欧美电影 超碰任你干免费在线 老司机色播影院普通用户 汤姆影院tam四虎影库 魔鬼身材七尺爆乳又大又白 亚洲 偷拍99ses 小明首发看看 正在播放真实强奸 完整 毛片捆绑束缚视频 宫交h灌满浓精 juy707 magnet 日月影视啪啪啪 二级黄片在线播放 香港按摩高清手机视频直播 pandra迅雷 免费下载A片的链接 女优做爱动态 日韩A片高清视频 AK第一精品福利资源导航 美人女教师的诱惑授业魅惑性技-里美 黄页连接免费福利视频 无尽另类在线视频 国产啪啪爱爱在线小视频 乡村寻艳王upu av搜搜福利 激情综合 西瓜影音 6688新视觉影院 狼窝窝影院高清视频 立花美凉资源在线播放 擼擼色綜合 土库影院 日本三级av论里2017 爆米花网性交 草草青视频在线中文字幕 app 仓井空系列种子磁力链接 被鸡巴干到出水的视频 草裙影视草裙社区主论坛福利社区午夜福利福利视频微拍福利福利电影福利导 国外XXX免费直播 猜人游戏在线播放影院 国外服务器手机看大片58天 啵啵视院 videoboy按摩 luobiyouyou 色色发宗合香蕉网 黄色日本三级片播放 av午夜网站 陈冠希钟欣桐视频磁力 国产成人综合4438 susu85网站改成什么了 宇都宫紫苑 在线电影 大贯杏里KDG一020 程x大人 死侍2在线观看莉莉影院 羔羊医生 magnet AV番号电影网 欧美番号 欲望保姆 AV新加坡资源 红涛阁av影院 蝌蚪窝在线视频观看午夜剧场 蝌蚪窝被封 2乱色 人工智能ai迪丽热巴在线播放 vedios SOD时间禁止器 爆乳无码出中出 magnet va中文字幕高清无码 成人aⅤ影视 v2ba萌白酱 苍井空在线精品视频 wwse560info 成人黄色自拍啪啪网 超级对碰视频在线观看 插下面的在线视频 成年亚洲免费手机视频 v ip eeusssvv 69saocom 嗯嗯轻点视频 美女自卫在线视频手机视频 国模黎萍超大尺度私拍 飘香影阁 女人视频av 亲娱乐 男人裸体黄色一级 身材很棒的大奶主播漏奶漏逼自慰开车 熟女福利电影 日本无码成人电影一本道 qkonzr87936 日本女人,淫荡视频 张紫妍磁力 美女训恋足奴会所 颜射大奶在线播放 先锋影音北条麻妃 亚洲偷拍91风月 日本东方aⅴ 天天影视色最新一色 李毅啪啪啪视频 戏精刘婷 在线 九哥操逼丨ㄥ 绿茶福利视频导航在线观看 54jb 在线小女破处性视频 www19rt 女教师 仙桃tv 天堂鸟影院av动漫 午夜成人在线直播 magnet 网红啪啪啪视频大全 韩国激情主播 AV美女女优性感宝贝视频 强奸洛天依视频 18r在线影院 最懂男人影院啪啪 丝袜少妇3p在线视频 av黄片免费网站 一本到道视频 卖来的女人迅雷下载 mp4 高老庄影院在线视频 在线视频直播 中文无码色视频 操空姐网站在线 韩国美女主播杰西卡视频 用嘴就能让你爽 被窝电影网酒店偷拍 肏我在线播放 波多野结衣丝袜福利视频 国产自拍女上位 苍井宫无码电影 韩国极品情侣家中 操逼爱奇艺 百度男人综合vA 色宗一本道 aotushipinzaixianguankan 狠狠胔大香蕉视频 午夜快成播 依依在线Aⅴ 情龟电影 闪电奇迹裸体 先锋国内口爆 范群侦上司 sex love ooxx 免费成人斤 九州AV免费成人 UUZIYUANWANG 播色屋a v久久 国语黄片a片 wwwchc2017av 牛牛免费视7755com 【开心五月】,深爱五月,大色窝,丁香五月,五月婷婷 立足于美利坚合众国鲁 外国兽交视频 董美香无码链接 magnet jiuboyinyuan 董美香在线中文字幕 日韩福利盒子拍拍拍 做爱无码磁力链接 mp4 无码区成人在线视频 啪啪秀自拍 A片 午夜影院 696人体 日韩新葡萄金无码视频 把96年白嫩美臀小情人带到宾馆肆意蹂躏穿衣服照样操 日本毛片一本道 视频 日本黄色群 激情邪恶大香蕉 伊人久久五十路 大桥未久 耻辱中出授业 三级香片 网红原味小辣椒VIP视频 www774jj 美脚をしゃぶり尽くす~ 梨花在线播放 色狼窝视频 色巨乳国产在线 强奸内射 在线观看 秋霞在线新纶 鸡鸡插bb的视频 极品网红女喝高了和粉丝啪啪 极品外围女模特拍摄时被2个摄影师勾引疯狂操 井上瞳在线播放 强吻小视频软件不用下载在线观看 三百元的性交动画 无码在线偷拍 四虎视频在线澳门皇冠 日本一级A片做爱片 足交鸣人漫画 3d里番动漫链接 小岛南ZAIXIAN 主播裸聊迅雷无码种子 8k 厄运小姐 免免福利视频 思思操干 神马影院1000合集 国产SM精品白富美富姐浴室玩弄漂亮女奴 伦奸学园磁力链接迅雷下载 magnet 绿巨人》AV版 正在草她老公打电话来一边草一边打 51pao 男人日女逼只流水 抠逼萝莉 欧美肥胖学生性交视频 好了Av成人免费视频 花果山福利视频区 碰碰播放器 女人屋福利视频免 花花公子在线视频 黄片国产免费的完整 黄色老人强奸美女抽插美女 欧美?iαeosαsexo孕妇 朋友推荐县城保健会所新来的小媚技术不错要提前几天才能预约到720p高清 梓由衣在线观看, 9200dy 日本最骚的波多野结衣 网友最新自拍在线狗添水 视频 日本一本道日韩欧 www92kkdycon 日本第一福利影院 曰本A片 日本福利影院500 先是激烈后是呆萌 迷恋为所欲为,看点很多。 非洲成年a片 俺去啦视频最新官网 酒井千波肛交 heshenshenzuoai 漏点福利视频 中川美铃在线伦理 孕妇番号 ftp 婷婷深爱五月视频在线观看 vk视频 骑女马 真崎航番号 色色免费在线综合视频 亚洲禽流氓冒险与绫 人人澡夜夜澡 AV高清AV天堂 今日新鲜事片毛片 长泽梓吃粪 完熟 av 卵蛋芽森滴 gvg 326在线观看 星球大战h剧场 麻仓优在线观看奇特影院 怡红院一大香蕉猫视频 红怡阁h jjzzkk 欲火难耐电影琪琪影院手机在线观看 日本av韩国av 种子A片 mvsd291樱木优希音在线 euss电影天堂2012 4438咱们看不了 9988xxav 白白色小明看看成人 情趣制服无码 mp4 偷拍视频毛片 无码插逼视频 色屌丝 欧美 视频 天天曰天天看操逼 熟妇乱伦在线播放 外交部长的娇妻的电影 soe878 亚洲一本道免费观看看 一本道第1页 在线人人妻福利免费视频播放 好看的亚洲无码。 伦理片福利国产短片 动漫啪啪网 国产自拍17啪啪啪 韩国盗窃撮全集视频 尼姑吧福利影视 尼玛影院伦理我不卡 男人桶女人阴口视频 国模王芳人体艺术套图 男女勃起抽插拔射视频 国内美女直播福利 国外无码ay免费视频 k8伦理剧情 男主拿鱼打女主,高宝宝 gvg448中文字幕 草榴影院 西瓜影音 澳门自拍偷拍视频 模特大尺度高清视频 香港伦理片抓色狼 not far 宅男免费福利视屏网址 另类综合性 日本性爱BBB视频 超碰人妻做爱视频 欧美激情另类重口 国产情侣激情视频自拍 丝袜美脚影视影院 84porn在线 黄图视屏高清免费观看网址 宫部凉花 福利 日本一本道在线无行v 成年区在线电影 wwwxo8xo8 初川南个人资源 自拍网5x社会最新 手机五月丁人网 a阿vvt天堂2014在线 tubicao 蓝尺润在线 妹纸你拍就拍被搞得跟贞子一样吓人 一本道久久日本视频v 动漫无码伦理片在线观看 四虎 小穴 日日批视频免费播放器收看 自拍视频内射 女明星漏三点视频磁力 性爱 在线视频 西西里高清模特艺术图 l撸就色 狂操护士15p 把鸡巴插入妈妈的阴道 草漂亮熟女 丁香五月色洛洛中文网 苏琪的人体写真 自拍老妇女操逼视频性爱 刘可颖被老外干快播截图 性感裸体美女性交图 撸撸色涩 苍井空湖南 插死骚屄妈妈 肏婶骚屄 迅雷在线草裙 短片无码mp4 黄色三级小说 人体艺术韩国高中女生 韩国比较色的剧 人妻色插 五月天电影人与狗 美女么自己鸡巴 日韩女优丝袜自卫 666大胆人体艺术 撸撸色色屄 农村骚丈母娘小说 88uuu影qvcd 东莞图片大合集下载 五月天婷婷快播 亚洲熟女淫色图 人体艺术波谷绘狗 少妇嫩逼性交图片 鼎美女朴妮唛狠狠插 跟老妈玩足交 极品白富美爆操15p 日幼发育12p 日日来插逼 想和你上床三邦车视 人体艺术电影在线看 淫荡乱季 大姨和妈妈乱交