• Mysql 字符问题


    先看一下mysql支持的字符范围

    *数值类型
    1.整形:
    类型                               大小     范围                                               无符号
    tinyint                            1字节   -128 127                                          0-255
    smallint                         2字节   -32768 32767                                 0-65535
    mediumint                    3字节   -8388608  8388607                       0-16777215
    int                                   4字节   -2147483648  2147483647         4294967295
    bigint                             8字节   -9223372036854775808             18446744073709551615
                                                           9223372036854775807          
    注意1.
    定义数据类型时,如果为 int(5)    5是显示位的意思,不足5位的系统自动补充空格 
    使用关键字zerofill 用0代替空格补充空位。
    注意2.
    int(5)  unsigned    这样定义数据类型,则表示无符号类型数值,默认是有符号的。
     
     
    2.浮点型:
    float(M,D)                    M:显示位数      M参数称为精度,是数据的总长度         M应大于0
    double (M,D)              D :小数位数     D称为标度

    3.定点型:
    decimal(M,D)

    类型                                     字节            范围                                             无符号 范围
    FLOAT 4 -3.402823466E+38~
    -1.175494351E-38
    0和1.175494351E-38~
    3.402823466E+38
    DOUBLE 8 -1.7976931348623157E+308~
    -2.2250738585072014E-308
    0和2.2250738585072014E-308~
    1.7976931348623157E+308
    DECIMAL(M,D)或DEC(M,D) M+2 同DOUBLE型 同DOUBLE型

     

    注意:
    浮点数如果不写M和D,则会按照实际显示。定点数如果不写M和D,则只显示整数
    如果有M和D,插入值的精度高于实际定义的精度,则会将数据四舍五入后插入,定点类型会警告
    使用unsigned时,对应字段只保留正数
    数值不够指定显示宽度时,左边自动补空格
    M仅是显示宽度,存储值大小由类型决定
    使用关键字zerofill时,用0代替空格补充空位

    注意:
              建议在定义浮点数时,如果不是实际情况需要,最好不要使用。
              浮点数后面跟“(M,D)”的用法是非标准用法,如果要用于数据库迁移,则最好不要用。
              在MySQL中,定点数以字符串的形式存储,因此,其精度比浮点数要高。而且浮点数会出现误差,这是浮点数一直存在的缺陷。如果要对数据的精度要求比较高,还是选择定点数(DECIMAL)比较安全。
             浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围,它的缺点是会引起精度问题。在MySQL中,定点数以字符串的形式存储,在对精度要求比较高的时候(如货币、科学数据等

    *字符类型

    类型                         大小                 用途 
    CHAR                
    0-255字节       定长字符串 
                                   比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补
                                   速度快,但空间利用率低
    VARCHAR         0-255字节       变长字符串
                                    短于指示器长度的 VARCHAR 类型不会被空格填补,但长于指示器的值仍然会被截短
                                   在不确定需要多少字符时使用VARCHAR 可以大大地节约磁盘空间、 提高存储效率 
                                   空间利用率高,但速度慢

    特别注意:
          
    varchar(N),  这里的N是指字符数,并不是字节数.占用的字节数与编码有关
           中文和英文字母都被当作1个字符来对待。
          
    utf-8 :一个汉字3字节 英文字母1字节
           gbk   :一个汉字占2个字节

     
    TEXTBLOB 类型
       对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。

      TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。比指定类型支持的最大范围大的值将被自动截短。

    *日期和时间类型

    日期类型        存储空间              日期格式                                                     日期范围 
    ------------           ---------              ---------------------                                  ----------------------------------------- 
    datetime        8 bytes         YYYY-MM-DD HH:MM:SS             1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 
    timestamp     4 bytes         YYYY-MM-DD HH:MM:SS             1970-01-01 00:00:01 ~ 2038 
    date                3 bytes         YYYY-MM-DD                                  1000-01-01          ~ 9999-12-31 
    year                1 bytes          YYYY                                                1901                ~ 2155
    time                 3 byte           HH:MM:SS                                      -838:59:59 ~  838:59:59


    注意:
    datetime    如果不分配一个值,默认值为0
    timestamp 时间戳 如果你不分配一个值,自动设置为最近操作的日期和时间

    以上两种格式 插入数据时不需要加分隔符 例如 20150701220506

    *枚举类型
    ENUM类型

    create table enum (
        sex  enum("nan","nv","qita")
     );
              如果一个 ENUM被声明为 NULL,NULL 也是该列的一个合法值,并且该列的缺省值也将为 NULL。如果一个 ENUM被声明为 NOT NULL,该列的缺省值将是该列表所允许值的第一个成员。
    enum一次只能插入一个值

    SET类型
    create table  table1(
            aihao  set ("yinyue","meishu","tiyu")
    );

    inter into table1(aihao)  value("yinyue")
    inter into table1(aihao) value("tiyu")
    inter into table1(aihao) value("yinyue","tiyu")
    inter into table1(aihao) value("yinyue","tiyu","meishu")
    set一次只能插入多个个值

       首先要声明,MySQL中默认字符集的设置有四级:

    服务器级数据库级表级 。最终是字段级 的字符集设置。
            注意前三种均为默认设置,并不代码你的字段最终会使用这个字符集设置。所以我们
    建议要用
    show create table 表名 ; show full fields from tableName; 来检查当前表中字段的字符集设置。
             很多数据库的字符集问题原因在这里,我们只改了前三个字符集,却没有改字段的字符集。
             
     
     
    1.服务器级别的字符集设置
     
            通过命令: mysql> SHOW VARIABLES LIKE 'character%';

    查看Mysql默认字符集的相关设置:

     

    # Variable_name,                   Value
    character_set_client,               utf8                 客户端来源数据使用的字符集   
    character_set_connection,      utf8                 连接层字符集
    character_set_database,        gbk                 当前选中数据库的默认字符集
    character_set_filesystem,      binary              系统元数据(字段名等)字符集
    character_set_results,             utf8                  查询结果字符集
    character_set_server,              latin1               默认的内部操作字符集 
    mysql 字符问题 - 朝鲜程序员 - 朝鲜程序员的博客
     
    检测字符集问题的一些手段 
    ? SHOW CHARACTER SET; 

    ? SHOW COLLATION; 

    ? SHOW VARIABLES LIKE 'character%'; 

    ? SHOW VARIABLES LIKE 'collation%'; 

    ? SQL函数HEX、LENGTH、CHAR_LENGTH 

    ? SQL函数CHARSET、COLLATION 



    mysql客户端与mysql服务端之间,存在着一个字符集转换器。
     
    character_set_client          =>gbk:转换器就知道客户端发送过来的是gbk格式的编码
    character_set_connection=>gbk:将客户端传送过来的数据转换成gbk格式
    character_set_results        =>gbk:
    注:以上三个字符集可以使用set names gbk来统一进行设置
     
     
     
     
     

    MySQL中关于连接环境的字符集设置有  Client端,connection, results 通过这些参数,MySQL就知道你的客户端工具用的是什么字符集,结果集应该是什么字符集。这样MySQL就会做必要的翻译,一旦这些参数有误,自然会导致字符串在转输过程中的转换错误。基本上99%的乱码由些造成。

    乱码后需要检查的信息。(如果需要论坛上的朋友帮助,建议你提供以下信息 )


    1. 数据库表中字段的字符集设置 。show create table TableName 或 show full columns from tableName


    mysql> show create table t1;
    +-------+------------------------------------
    | Table | Create Table                       
    +-------+------------------------------------
    | t1    | CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `c1` varchar(30) DEFAULT NULL,
      PRIMARY KEY (`id`)    
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk |
    +-------+------------------------------------
    1 row in set (0.00 sec) 
                            
    mysql> show full columns from t1;
    +-------+-------------+----------------+------+-----+-
    | Field | Type        | Collation      | Null | Key | 
    +-------+-------------+----------------+------+-----+-
    | id    | int(11)     | NULL           | NO   | PRI | 
    | c1    | varchar(30) | gbk_chinese_ci | YES  |     | 
    +-------+-------------+----------------+------+-----+-
    2 rows in set (0.00 sec)
     

    mysql>

     

    2. 当前联接系统参数  show variables like 'char%'


    mysql> show variables like 'char%';
    +--------------------------+----------------
    | Variable_name            | Value
    +--------------------------+----------------
    | character_set_client     | gbk
    | character_set_connection | gbk
    | character_set_database   | latin1
    | character_set_filesystem | binary
    | character_set_results    | gbk
    | character_set_server     | latin1
    | character_set_system     | utf8
    | character_sets_dir       | C:/Program File
    +--------------------------+----------------
    8 rows in set (0.00 sec)
     

    mysql>


    1. 中文,请确保 表中该字段的字符集为中文兼容: 
     big5     | Big5 Traditional Chinese
     gb2312   | GB2312 Simplified Chinese
     gbk      | GBK Simplified Chinese
     utf8     | UTF-8 Unicode

     

    2. 确保,联接参数与这个字段字符集一致,你可以用 set name 'charsetname'; 
     比如, set name 'gbk';
     这条命令会同时修改 character_set_client,character_set_connection,character_set_results
     (如果你的这架MySQL中都为中文,则你可以在my.ini或my.cnf中加上或修改这个参数, 参数文件修改后需重启MySQL服务)
    [mysql]
    default-character-set=gbk

     

    3. PHP 乱码, 同样 mysql_query("set name 'gbk'"); 其它API也类似。

     

    4. phpmyadmin里乱码 
    phpMyAdmin的config.inc.php中有没有设置$cfg['DefaultCharset']='utf-8';

     

    5. Windows操作系统中命令行("DOS"窗口)下。 
     在你的DOS窗中的左上角标题栏片左键,属性,
     在字体中,选择“宋体”,确认
     mysql中 set names 'gbk';


     

    改表编码:
    alter table 表名 default character set 现在的编码 collate 新编码方式

    修改列编码
    ALTER TABLE `uc_users_bak` CHANGE  `nick_name`  `nick_name` VARCHAR ( 100 )
    CHARACTER
    SET
    utf8
    COLLATE
    utf8_general_ci
    NULL
    DEFAULT
    NULL

    1.修改数据库的编码 
      将数据库(test)的编码方式修改为utf8,如: 
      ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
    2.修改表的编码 
      将表(test)的编码方式修改为utf8,如: 
      ALTER TABLE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 
    3.修改字段的编码 
      将表(test)中字段(name)的编码方式修改为utf8,如: 
      ALTER TABLE `test` CHANGE `name` `name` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE  utf8_bin NOT NULL; 

  • 相关阅读:
    mybatis自学历程(二)
    mybatis自学历程(一)
    Hibernate入门教程(二):Hibernate核心API
    Hibernate入门教程(一):入门示例(Myeclipse)
    Python中反射的简单应用
    Struts2的Action访问
    Myeclipse中dtd代码提示
    B/+、索引原理
    postgres 模糊匹配
    jvm_第三章:垃圾收集与内存分配策略
  • 原文地址:https://www.cnblogs.com/centos2017/p/7896804.html
Copyright © 2020-2023  润新知