• 彻底解决存储程、存储函数中文乱码的问题



    这个问题困扰了我很久,断断续续花了我2天的时间才解决。

    一、统一使用一种编码,比如utf8。

    1、首先查看数据库编码。

    mysql> show create database db;
    +----------+------------------------------------------------------------------+
    | Database | Create Database |
    +----------+------------------------------------------------------------------+
    | db | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET latin1 */ |
    +----------+------------------------------------------------------------------+
    1 row in set (0.00 sec)

    可以看到数据库db默认的charcter set为latin1,因此有必要改成utf8。

    mysql> alter database db default character set utf8 default collate utf8_gene
    ral_ci;
    Query OK, 1 row affected (0.00 sec)

    将数据库db的默认编码和字符集分别改为了utf8和utf8_general_ci。utf8_unicode_ci和utf8_general_ci区别:
    在数据库系统MySQL中有多种字符集,其中utf8_unicode_ci和utf8_general_ci是最常用的,但是utf8_general_ci对某些语言的支持有一些小问题,如果可以接受,那最好使用utf8_general_ci,因为它速度快。否则,请使用较为精确的utf8_unicode_ci,不过速度会慢一些(维基百科)。

    现在再来看是否修改成功:

    mysql> show create database db;
    +----------+----------------------------------------------------------------+
    | Database | Create Database |
    +----------+----------------------------------------------------------------+
    | db | CREATE DATABASE `db` /*!40100 DEFAULT CHARACTER SET utf8 */ |
    +----------+----------------------------------------------------------------+
    1 row in set (0.00 sec)

    可以看到已经修改成功了。

    二、修改客户端和服务端字符集
    这部分在网络上已经有了:
    SET character_set_client = utf8;
    SET character_set_connection = utf8;
    SET character_set_database = utf8;
    SET character_set_results = utf8;
    SET character_set_server = utf8;
    SET collation_connection = utf8;
    SET collation_database = utf8;
    SET collation_server = utf8;
    这里有个建议。因为现在php、asp.net、python...连接mysql都可以进行持久化连接池。因此,只需要在php第一次建立mysql连接后设置上述配置,除非在查询时需要更改用户名或数据库,不然上述配置只须设立一次,即每次建立mysql对象时。所以可以自定义一个mysql类,单例模式,这样可以保证以后的查询都使用上述配置,使查询字符集统一。

    三、创立一个存储程序
    具体的例子就免了。
    我们来个左证。mysql建立的存储程序都存放在mysql.proc表中。打开查看在后面发现三项:
    彻底解决存储程、存储函数中文乱码的问题 - sumsung753 - php + mysql+js
     可以看到,character_set_client和collation_connerction、db_collation都已经设置成utf8,这时无论你存储程序或函数里填些什么都不会乱码了。

    四、utf8兼容gbk情况
    如果在windows dos下,使用“set names utf8"并不会起作用,因为dos这个客户端并不支持utf8,这时可以使用"set names gbk"进行查询存储程序,大部份情况下utf8是兼容gbk的,因此基本上不会出现乱码。
  • 相关阅读:
    apache mina框架
    架构学习笔记
    接口抽象类
    继承是共用,不是复制
    线程安全的单例模式还需要对成员变量的set get方法设置锁么
    受检查异常要求try catch,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间
    myeclipse 写java代码提示 dead code 原因
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils
    android内存优化发展——使用软引用
    cocos2dx3.1.1+cocosstudio+lua问题总结
  • 原文地址:https://www.cnblogs.com/sumsung753/p/3821517.html
Copyright © 2020-2023  润新知