小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页_php教程-查字典教程网
小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页
小结下MySQL中文乱码,phpmyadmin乱码,php乱码 产生原因及其解决方法第1/3页
发布时间:2016-12-29 来源:查字典编辑
摘要:乱码产生原因mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统。我们可以在MySQLCommandL...

乱码产生原因

mysql字符编码是版本4.1引入的,支持多国语言,而且一些特性已经超过了其他的数据库系统。

我们可以在MySQLCommandLineClient下输入如下命令查看mysql的字符集

mysql>SHOWCHARACTERSET;

+----------+-----------------------------+---------------------+--------+

|Charset|Description|Defaultcollation|Maxlen|

+----------+-----------------------------+---------------------+--------+

|big5|Big5TraditionalChinese|big5_chinese_ci|2|

|dec8|DECWestEuropean|dec8_swedish_ci|1|

|cp850|DOSWestEuropean|cp850_general_ci|1|

|hp8|HPWestEuropean|hp8_english_ci|1|

|koi8r|KOI8-RRelcomRussian|koi8r_general_ci|1|

|latin1|cp1252WestEuropean|latin1_swedish_ci|1|

|latin2|ISO8859-2CentralEuropean|latin2_general_ci|1|

|swe7|7bitSwedish|swe7_swedish_ci|1|

|ascii|USASCII|ascii_general_ci|1|

|ujis|EUC-JPJapanese|ujis_japanese_ci|3|

|sjis|Shift-JISJapanese|sjis_japanese_ci|2|

|hebrew|ISO8859-8Hebrew|hebrew_general_ci|1|

|tis620|TIS620Thai|tis620_thai_ci|1|

|euckr|EUC-KRKorean|euckr_korean_ci|2|

|koi8u|KOI8-UUkrainian|koi8u_general_ci|1|

|gb2312|GB2312SimplifiedChinese|gb2312_chinese_ci|2|

|greek|ISO8859-7Greek|greek_general_ci|1|

|cp1250|WindowsCentralEuropean|cp1250_general_ci|1|

|gbk|GBKSimplifiedChinese|gbk_chinese_ci|2|

|latin5|ISO8859-9Turkish|latin5_turkish_ci|1|

|armscii8|ARMSCII-8Armenian|armscii8_general_ci|1|

|utf8|UTF-8Unicode|utf8_general_ci|3|

|ucs2|UCS-2Unicode|ucs2_general_ci|2|

|cp866|DOSRussian|cp866_general_ci|1|

|keybcs2|DOSKamenickyCzech-Slovak|keybcs2_general_ci|1|

|macce|MacCentralEuropean|macce_general_ci|1|

|macroman|MacWestEuropean|macroman_general_ci|1|

|cp852|DOSCentralEuropean|cp852_general_ci|1|

|latin7|ISO8859-13Baltic|latin7_general_ci|1|

|cp1251|WindowsCyrillic|cp1251_general_ci|1|

|cp1256|WindowsArabic|cp1256_general_ci|1|

|cp1257|WindowsBaltic|cp1257_general_ci|1|

|binary|Binarypseudocharset|binary|1|

|geostd8|GEOSTD8Georgian|geostd8_general_ci|1|

|cp932|SJISforWindowsJapanese|cp932_japanese_ci|2|

|eucjpms|UJISforWindowsJapanese|eucjpms_japanese_ci|3|

+----------+-----------------------------+---------------------+--------+

36rowsinset(0.02sec)

更多mysql的字符集知识可以参考本论坛的

http://www.phpfans.net/bbs/viewt...&extra=page%3D1

或者mysql官方的

http://dev.mysql.com/doc/refman/5.1/zh/charset.html

MySQL4.1的字符集支持(CharacterSetSupport)有两个方面:字符集(Characterset)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器(server),数据库(database),数据表(table)和连接(connection)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:

mysql>SHOWVARIABLESLIKE'character_set_%';

+--------------------------+-------------------------------------------+

|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|D:MySQLMySQLServer5.0sharecharsets|

+--------------------------+-------------------------------------------+

8rowsinset(0.06sec)

mysql>SHOWVARIABLESLIKE'collation_%';

+----------------------+-------------------+

|Variable_name|Value|

+----------------------+-------------------+

|collation_connection|latin1_swedish_ci|

|collation_database|latin1_swedish_ci|

|collation_server|latin1_swedish_ci|

+----------------------+-------------------+

3rowsinset(0.02sec)

上面列出的值就是系统的默认值。latin1默认校对规则是latin1_swedish_ci,默认是latin1的瑞典语排序方式.

为什么呢默认会是latin1_swedish_ci呢,追溯一下mysql历史很容易发现

1979年,一家瑞典公司Tcx欲开发一个快速的多线程、多用户数据库系统。Tcx公司起初想利用mSQL和他们自己的快速低级例程(IndexedSequentialAccessMethod,ISAM)去连接数据库表,然而,在一些测试以后得出结论:mSQL对其需求来说不够快速和灵活。这就产生了一个连接器数据库的新SQL接口,它使用几乎和mSQL一样的API接口。这个API被设计成可以使那些由mSQL而写的第三方代码更容易地移植到MySQL。

相信如果mysql是中国开发的,那么汉语也是默认编码了

当然我们也可以自己需要修改mysql的默认字符集

在mysql配置文档my.ini,找到如下两句:

[mysql]

default-character-set=latin1

#createdandnocharactersetisdefined

default-character-set=latin1

修改后面的值就可以。

这里不建议改,仍保留默认值

也就是说启动mysql时,如果没指定指定一个默认的的字符集,这个值继承自配置文件中的;

此时character_set_server被设定为这个默认的字符集;当创建一个新的数据库时,

除非明确指定,这个数据库的字符集被缺省设定为character_set_server;当选定了一个数据库时,

character_set_database被设定为这个数据库默认的字符集;在这个数据库里创建一张表时,

表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;

当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集。

这样问题就随之而来了,假如一数据库是gbk编码。如果访问数据库时没指定其的字符集是gbk。

那么这个值将继承系统的latin1,这样就做成mysql中文乱码。

乱码解决方法

要解决乱码问题,首先必须弄清楚自己数据库用什么编码。如果没有指明,将是默认的latin1。

我们用得最多的应该是这3种字符集gb2312,gbk,utf8。

那么我们如何去指定数据库的字符集呢?下面也gbk为例

【在MySQLCommandLineClient创建数据库】

mysql>CREATETABLE`mysqlcode`(

->`id`TINYINT(255)UNSIGNEDNOTNULLAUTO_INCREMENTPRIMARYKEY,

->`content`VARCHAR(255)NOTNULL

->)TYPE=MYISAMCHARACTERSETgbkCOLLATEgbk_chinese_ci;

QueryOK,0rowsaffected,1warning(0.03sec)

当前1/3页123下一页阅读全文

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类