a.11.1. | CJK字符集所有MySQL? |
| CJK字符集的列表可能取决于你的MySQL版本有所不同。例如,在gb18030 字符集不支持MySQL 5.7.4之前。然而,由于适用的语言的名称出现在描述 在每一栏INFORMATION_SCHEMA.CHARACTER_SETS 表,你可以得到一个当前使用该查询的所有非Unicode CJK字符集列表: MySQL的>SELECT CHARACTER_SET_NAME, DESCRIPTION FROM INFORMATION_SCHEMA.CHARACTER_SETS WHERE DESCRIPTION LIKE '%Chin%' OR DESCRIPTION LIKE '%Japanese%' OR DESCRIPTION LIKE '%Korean%' ORDER BY CHARACTER_SET_NAME; 字符集| -------------------- --------------------------------- _ _ name | | -------------------- ---------------------------------描述中国传统| BIG5 | BIG5 | | cp932 | sjis for Windows | |日本日本eucjpms | ujis for Windows | | euckr | EUC KR韩国| | | GB18030国家标准GB18030 GB2312 GB2312 | | |简化简化| GBK中国| | GBK中国| | sjis | Shift-JIS日本| | ujis | EUC JP日本--------------------------------- | -------------------- (更多信息,参见24.1节,“information_schema character_sets表”。) MySQL支持的三种变体GB(国家标准,或国家标准,或简体中文)这是官方在中华人民共和国字符集:gb2312 ,GBK ,和(如MySQL 5.7.4)gb18030 有时人们试图插入gbk 字符gb2312 ,和它的作品大部分时间因为gbk 是一个超集gb2312 。但最终他们试图插入一个罕见的汉字,它不工作。(例如,见虫#套数)。 在这里,我们试图弄清到底是什么人物都是合法的gb2312 或GBK ,参照官方文件。请检查这些引用报告前gb2312 或GBK 漏洞 它也可以存储CJK字符的Unicode字符集,虽然可用的排序规则可能不排序字符完全如你所期望的: 使用Unicode字符集确定排序能力排序(即区分)的特点: 基于Unicode排序算法排序规则(UCA)4.0.0区别BMP字符。 基于UCA 5.2.0或9.0.0区分BMP和补充字符的排序规则。 非均匀圆阵排序规则可能不区分所有Unicode字符。例如,在utf8mb4 校勘是默认我们utf8mb4 _通用_ ,使得只有BMP字符。
此外,突出的特点是不要求他们每一个给定的CJK语言习俗相同。目前,MySQL只有一个CJK具体UCA整理,gb18030_unicode_520_ci (需要使用非Unicodegb18030 字符集) 关于Unicode排序规则和不同性质的信息,包括补充字符的排序性能,看第10.10.1,“Unicode字符集” |
a.11.2. | 我插入CJK字符进入我的表。为什么SELECT 其显示为“?“人物吗? |
| 这个问题通常是由于一个设置MySQL不匹配的应用程序或操作系统的设置。这是纠正这些问题的一些常见步骤: 一定是你所使用的MySQL版本 使用声明SELECT VERSION(); 确定这一 确保数据库实际上是使用所需的字符集 人们常常认为客户端字符集都是为服务器字符集或用于显示字符集相同。然而,这些都是错误的假设。你可以通过检查结果确定SHOW CREATE TABLE
tablename 或者,更好的是,用这句话: SELECT character_set_name, collation_name FROM information_schema.columns WHERE table_schema = your_database_name AND table_name = your_table_name AND column_name = your_column_name; 确定的字符或字符不能正确显示的十六进制值 你可以得到一个列信息column_name 在桌子上table_name 使用以下查询: 选择六(column_name from)table_name ; 3F 对于编码? 性格;这意味着? 实际上是存储在列中的字符。这往往是因为一个问题从客户端字符集转换到目标字符集的特定字符。
确保往返是可能的。当你选择literal (或_introducer hexadecimal-value ),做你的权利literal 因此? 例如,日本的片假名字符体育课(ペ' )存在于所有CJK字符集,并有代码值(十六进制编码)0x30da 。为了测试这个角色一个来回,用这个查询: SELECT 'ペ' AS `ペ`; /* or SELECT _ucs2 0x30da; */
如果结果不还ペ 一次失败 错误报告对于这样的失败,我们可能会问你跟进SELECT HEX('ペ'); 。然后我们可以确定客户端编码是正确的。 确保问题不在浏览器或其他应用程序,而不是MySQL 使用MySQL客户端程序来完成这个任务。如果MySQL显示字符正确但你的程序不,你的问题可能是由于系统设置。 确定你的设置,使用SHOW VARIABLES 声明,其输出应类似于如下所示: MySQL的>SHOW VARIABLES LIKE 'char%'; -------------------------- ---------------------------------------- | Variable_name | Value | -------------------------- ---------------------------------------- | character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | -------------------------- ---------------------------------------- 这些都是典型的字符集设置为一个面向国际的客户(注意使用utf8 Unicode)连接到服务器(西latin1 是一个西欧字符集) 虽然所有的Unicode(theutf8 UNIX网络variant,and theUCS2 变异在Windows)最好是拉丁语,它往往不是你的操作系统工具支持最好。许多Windows用户发现微软的字符集,如cp932 日本的窗口,是合适的。 如果你不能控制服务器设置,你不知道你的计算机使用的设置下,试着换一个通用字符集的国家,你在(euckr = Korea;gb18030 ,gb2312 或GBK = People's Republic of China;big5 = Taiwan;SJIS ,ujis ,cp932 ,或eucjpms = Japan;UCS2 或utf8 = anywhere). Usually it is necessary to change only the client and connection and results settings. TheSET
NAMES 。表三次变化。例如: 集名“big5”; 一旦设置是正确的,你可以通过编辑让它永久my.cnf 或my.ini 。例如,你可以添加线条看起来像这样: [mysqld]
character-set-server=big5
[client]
default-character-set=big5
它也可能有与API配置设置是在应用程序中使用的问题;看为什么我的GUI前端或浏览器不显示CJK字符正确…吗?更多信息
|
a.11.3. | 有什么问题我应该注意工作与繁体中文字符集的时候? |
| MySQL支持BIG5字符集在香港和台湾通用(中华民国)。MySQLbig5 字符集是在现实中微软代码页950,这与原来非常相似BIG5 字符集 一个添加的功能要求HKSCS 扩展已提交。谁需要这种推广的人可能会发现,建议的补丁的bug # 13577感兴趣。 |
a.11.4. | 为什么日本的字符集转换失败? |
| MySQL支持sjis ,ujis ,cp932 ,和eucjpms 字符集,以及Unicode。一个共同的需要之间的字符集转换。例如,可能有一个UNIX服务器(通常是sjis 或ujis )和Windows客户端(通常是cp932 ) 在下面的转换表,ucs2 列代表的来源,和SJIS ,cp932 ,ujis ,和eucjpms 列代表的目的地;即,最后4列为十六进制的结果当我们使用CONVERT(ucs2) 或我们分配一个UCS2 含有值的列的sjis ,cp932 ,ujis ,或eucjpms 专栏 现在考虑以下部分的表。 这意味着MySQL转换NOT SIGN (UnicodeU 00AC )来sjis 代码点0x81ca 和cp932 代码点3F 。(3F 是问号(“?“。这是什么总是使用时不能执行转换。) |
a.11.5. | 如果我想把SJIS怎么81CA 到cp932 ? |
| 我们的回答是:“?“。有缺点这,很多人会喜欢“释放“转换,使81CA (NOT SIGN) 进入SJIS 成为81CA (FULLWIDTH NOT
SIGN) 进入cp932 |
a.11.6. | 如何代表Yen(MySQL¥ DC-SIGN)? |
| 问题的产生是因为日本字符集的一些版本(包括sjis 和EUC )治疗5C 作为一个逆斜線(\ ,也被称为一个反斜杠),而另一些人把它作为一个符号(日元¥ ) MySQL是只有一个版本的JIS(日本工业标准)标准的描述。在MySQL,5C 总是反斜线(\ ) |
a.11.7. | 什么问题,我应该注意工作与MySQL韩语字符集的时候? |
| 在理论上,虽然有几个版本euckr (扩展的UNIX代码韩国)字符集,只有一个问题已经被注意到。我们使用“ASCII码“euc-kr变种,其中代码点0x5c 是反斜线,那是\ 相反的,“KS罗马“变异的欧C-KR,在密码点0x5c 是获签 (? )。这意味着你不能转换UnicodeU 20a9 到euckr : MySQL的>SELECT CONVERT('?' USING euckr) AS euckr, HEX(CONVERT('?' USING euckr)) AS hexeuckr; | -------选择euckr | hexeuckr | | -------选择?| -------选择| 3F |
a.11.8. | 为什么我得到的不正确的字符串值错误信息? |
| 看到这个问题,有一个Unicode创建一个表(ucs2 )列和一个中国(gb2312 )柱 mysql> CREATE TABLE ch
(ucs2 CHAR(3) CHARACTER SET ucs2,
gb2312 CHAR(3) CHARACTER SET gb2312);
在非严格的SQL模式,尝试将罕见的字符汌 在两列 MySQL的>SET sql_mode = ''; MySQL的>INSERT INTO ch VALUES ('A汌B','A汌B'); 查询行,1行的影响,1报警(0秒) 这个INSERT 产生一个警告。使用下面的语句来看看它是什么: MySQL的>SHOW WARNINGS\G *************************** 1。行***************************级别:警告:错误代码:1366message字符串值:\ \ \ x8cb XE6:“列“GB2312”排1 所以这是一个警告gb2312 列 MySQL >选择UCS2,HEX(UCS2)、GB2312、六(GB2312)从CH;------- -------------- -------- ------------- | UCS2 |进制(UCS2)| GB2312 |进制(GB2312)| ------- -------------- -------- ------------- |一汌B | 00416c4c0042 |一?B | 413f42 | ------- -------------- -------- ------------- 几件事情需要解释这里: 这个汌 字符不在gb2312 字符集,如前所述 如果你使用的是MySQL的一个旧版本,你可能会看到一个不同的消息。 一个警告出现而不是一个错误因为MySQL设置不使用严格的SQL模式。在非严格模式,MySQL试图尽其所能,以获得最佳的拟合,而不是放弃。以严格的SQL模式,不正确的字符串值信息发生错误而不是警告,和INSERT 失败.
|
a.11.9. | 为什么我的GUI前端或浏览器显示CJK字符错误在我的应用程序使用,PHP,或另一个API吗? |
| 获得一个直接连接到服务器使用MySQL客户端,并尝试相同的查询有。如果MySQL回答正确,问题可能是你的应用程序需要初始化。使用MySQL告诉你什么字符集使用的语句SHOW VARIABLES LIKE
'char%'; 。如果您使用的是Access,你最有可能与连接器/ ODBC连接。在这种情况下,你应该检查配置ODBC连接器/。如果,例如,你使用big5 ,你会进入集名“big5” 。(在这种情况下,没有; 性格是必需的。)如果你使用的是ASP,你可能需要添加SET NAMES 在代码。这里有一个例子,过去的: <%Session.CodePage=0Dim strConnectionDim ConnstrConnection="driver={MySQL ODBC 3.51 Driver};server=server ;uid=username ;" \ & "pwd=password ;database=database ;stmt=SET NAMES 'big5';"Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open strConnection%> 同样,如果你使用的是什么字符集以外的latin1 与连接器/网,您必须指定在连接字符串中的字符集。看到连接用连接器/净MySQL为更多的信息 如果你使用的是PHP,试试这个: <?php
$link = new mysqli($host, $usr, $pwd, $db);
if( mysqli_connect_errno() )
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$link->query("SET NAMES 'utf8'");
?>
在这种情况下,我们使用SET NAMES 改变character_set_client ,character_set_connection ,和character_set_results 另一个问题是经常遇到的PHP应用程序必须通过浏览器提出假设。有时添加或更改<meta> 标签就足以解决问题:例如,确保用户代理将页面内容gb3212 ,包括<meta http-equiv="Content-Type" content="text/html;
charset=gb3212"> 在<head> HTML页的部分 如果你正在使用的连接器/ J,看使用的字符集和Unicode |
a.11.10 | 我已经升级到MySQL 8。我怎么能恢复到像在MySQL 4中关于字符集的行为吗? |
| 在MySQL 4版本中,有一个“全球“设置为服务器和客户端两个字符,并决定哪个角色使用被服务器管理员。这改变了从MySQL 4.1版本。现在所发生的是一个“握手“,如10.4节,“连接字符集和Collations”: 这样做的效果是,你无法控制的客户端启动特点mysqld与--character-set-server=utf8 。然而,一些亚洲客户喜欢MySQL 4.0行为。为了能够保持这种行为,我们添加了一个mysqld开关,--character-set-client-handshake ,它可以关闭--skip-character-set-client-handshake 。如果你开始mysqld与--skip-character-set-client-handshake ,然后,当一个客户端连接,它发送到服务器的字符集,它要使用的名称。然而,在客户端,服务器不知道这一请求。 举例来说,假设你喜爱的服务器字符集latin1 (在中日韩地区,不太可能但这是默认值)。进一步假设客户端使用UTF8 因为这是客户端的操作系统支持。现在,启动服务器latin1 作为其默认字符集: mysqld --character-set-server=latin1 然后启动客户端的默认字符集utf8 : mysql --default-character-set=utf8 由此产生的设置可以通过查看输出的视SHOW VARIABLES : MySQL的>SHOW VARIABLES LIKE 'char%'; -------------------------- ---------------------------------------- | Variable_name | Value | -------------------------- ---------------------------------------- | character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | -------------------------- ---------------------------------------- 现在停止客户端和服务器,停止使用mysqladmin。然后启动服务器,但是这个时候告诉它跳过握手一样: mysqld --character-set-server=utf8 --skip-character-set-client-handshake
启动客户端utf8 再次作为默认的字符集,然后显示的设置: MySQL的>SHOW VARIABLES LIKE 'char%'; -------------------------- ---------------------------------------- | Variable_name | Value | -------------------------- ---------------------------------------- | character_set_client | latin1 || character_set_connection | latin1 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | latin1 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | -------------------------- ---------------------------------------- 正如你可以看到,通过比较不同的结果SHOW VARIABLES 忽略,服务器客户端的初始设置如果--skip-character-set-client-handshake 选择使用 |
a.11.11 | 为什么有些LIKE 和全文 CJK字符搜索失败? |
| 为LIKE 搜索,有二进制字符串列的类型如一个很简单的问题BINARY 和BLOB 我们必须知道:性格。在多字节字符集,不同的角色可能有不同的字节长度。例如,在UTF8 ,A 需要一个字节,但裴勇俊 需要三个字节,如下所示: +-------------------------+---------------------------+
| OCTET_LENGTH(_utf8 'A') | OCTET_LENGTH(_utf8 'ペ') |
+-------------------------+---------------------------+
| 1 | 3 |
+-------------------------+---------------------------+
如果我们不知道在一个字符串的第一个字符结束,我们不知道第二个字符开始的地方,在这种情况下,即使是很简单的搜索,如LIKE '_A%' 失败。该解决方案是使用一个二进制字符串列的类型定义为具有适当的CJK字符集。例如:论文正文SJIS字符集 。另外,转换为CJK字符集比较之前。 这就是为什么MySQL不允许存在字符编码。如果这不是拒绝坏的输入严格,它没有办法知道字符结束。 为FULLTEXT 搜索,我们必须知道单词的开始和结束。与西方语言,这是很少的问题因为大多数(如果不是全部的话)使用这些容易识别单词边界:空间特征。然而,这通常是不与亚洲撰写案例。我们可以使用任意的不彻底的措施,如假设所有汉字表示的话,还是(日本)取决于由于语法词尾假名片假名的变化。然而,唯一确定的方案需要一个全面的单词列表,这意味着我们必须包括一个字典为服务器中的每个亚洲语言支持。这是不可行的。 |
a.11.12 | 我怎么知道字符X 可在所有的字符集? |
| 简体中文及基本所有CJK字符集出现nonhalfwidth日文假名字符大多数。下面的存储过程接受一个UCS-2 Unicode字符,将其转换为其他字符集,以及十六进制显示结果。 DELIMITER //CREATE PROCEDURE p_convert(ucs2_char CHAR(1) CHARACTER SET ucs2)BEGINCREATE TABLE tj (ucs2 CHAR(1) character set ucs2, utf8 CHAR(1) character set utf8, big5 CHAR(1) character set big5, cp932 CHAR(1) character set cp932, eucjpms CHAR(1) character set eucjpms, euckr CHAR(1) character set euckr, gb2312 CHAR(1) character set gb2312, gbk CHAR(1) character set gbk, sjis CHAR(1) character set sjis, ujis CHAR(1) character set ujis);INSERT INTO tj (ucs2) VALUES (ucs2_char);UPDATE tj SET utf8=ucs2, big5=ucs2, cp932=ucs2, eucjpms=ucs2, euckr=ucs2, gb2312=ucs2, gbk=ucs2, sjis=ucs2, ujis=ucs2;/* If there are conversion problems, UPDATE produces warnings. */SELECT hex(ucs2) AS ucs2, hex(utf8) AS utf8, hex(big5) AS big5, hex(cp932) AS cp932, hex(eucjpms) AS eucjpms, hex(euckr) AS euckr, hex(gb2312) AS gb2312, hex(gbk) AS gbk, hex(sjis) AS sjis, hex(ujis) AS ujisFROM tj;DROP TABLE tj;END//DELIMITER ; 输入可以是任何单ucs2 字符,也可以是代码值(十六进制表示的字符)。例如,从Unicode的名单UCS2 的编码和名称(www.unicode.org http:/ / / / /公共unicodedata.txt联拓),我们知道,片假名字符体育课出现在所有CJK字符集,和它的代码值X'30DA' 。如果我们使用这个值作为实参改性() ,结果如下图所示: mysql> CALL p_convert(X'30DA');
+------+--------+------+-------+---------+-------+--------+------+------+------+
| ucs2 | utf8 | big5 | cp932 | eucjpms | euckr | gb2312 | gbk | sjis | ujis |
+------+--------+------+-------+---------+-------+--------+------+------+------+
| 30DA | E3839A | C772 | 8379 | A5DA | ABDA | A5DA | A5DA | 8379 | A5DA |
+------+--------+------+-------+---------+-------+--------+------+------+------+
由于该列的值都是3F (即问号字符,? ),我们知道每一个转化工作。 |
a.11.13 | 为什么中日韩字符串排序不正确的Unicode?(我) |
| CJK排序问题在老版本的发生,可以作为解决利用MySQL 8utf8mb4 字符集和utf8mb4_ja_0900_as_cs 整理 |
a.11.14 | 为什么中日韩字符串排序不正确的Unicode?(II) |
| CJK排序问题在老版本的发生,可以作为解决利用MySQL 8utf8mb4 字符集和utf8mb4_ja_0900_as_cs 整理 |
a.11.15 | 为什么我的补充字符被MySQL? |
| 补充字符的Unicode之外基本多文种平面/平面0。BMP字符的码点之间的值U+0000 和u FFFF 。补充字符代码点之间的值U+10000 和U 10ffff 存储补充字符,你必须使用一个字符集,允许他们: 这个utf8 和UCS2 字符集支持BMP字符。 这个utf8 字符集只允许gb3212 字符占用三字节。这导致了报表如发现错误# 12600,我们拒绝“不是一个错误“。与utf8 ,MySQL必须截断输入字符串的字节,当它遇到不理解。否则,它是未知的坏的多字节字符是多久。 一个可能的解决方法是使用ucs2 而不是UTF8 ,在这种情况下,“坏的“人物都变成问号。然而,没有截断发生。您还可以更改数据类型BLOB 或BINARY ,这不执行有效性检查。 这个utf8mb4 ,UTF16 ,utf16le ,和utf32 字符集支持BMP字符,以及补充字符以外的BMP。
|
a.11.16 | 应“CJK“是“中日韩越“? |
| 第期“中日韩越“(中国日本韩国越南)是指越南字符集包括汉族(中文)字符。MySQL支持西部特点的现代越南文字,但不支持使用汉字老越南文字。 在MySQL 5.6,还有越南的排序规则的Unicode字符集,如第10.10.1,“Unicode字符集” |
a.11.17 | 是MySQL允许CJK字符用于数据库和表的名称吗? |
| 是 |
a.11.18 | 我在哪里可以找到MySQL手册为中文,日文和韩文翻译吗? |
| 在MySQL 5.6手册日语翻译可以从下载http://dev.mysql.com DOC |
a.11.19 | 我在哪里可以得到帮助的中日韩及相关问题在MySQL? |
| 以下资源可用: |