zoukankan      html  css  js  c++  java
  • MySQL编码不一致导致查询结果为空

    升级数据库后(5.1到8.0),发现一个奇怪的问题,某些页面在升级前可以正常查询,但升级后什么也查不出来了,有时候还会查出错误的结果。经过一整天的排查,终于发现由两个原因导致,现记录如下。

    第一是数据库的编码。使用中文关键字查不出结果(或结果错误),但是英文关键字可以正常查询。

    还原数据库后默认的编码不是utf-8。执行下面命令可以查看当前数据库编码。

    show variables like 'collation%';

    或者

    show variables like '%character%';

    修改编码的语句

    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

    但是重启MySQL服务后,再查看数据库的编码,发现又变回了原来的。

    原来使用命令行设置只是在当前会话中有效,当重启数据库后就会恢复默认编码。因此应该在MySQL的配置文件my.ini中设置。

    低版本MySQL的my.ini在安装路径下可以找到,但是8.0的版本存放在C:ProgramDataMySQLMySQL Server 8.0下,这是一个隐藏的文件夹

    打开my.ini后,加入如下配置

    [mysql]
    default-character-set=utf8
    [mysqld]
    character_set_server=utf8 
    collation_server=utf8_general_ci 

    修改后重启MySQL服务,发现编码已经成功修改

    第二种原因是因为新版本MySQL的关键字导致

    数据库的表中有个字段为virtual,在8.0中是虚拟列的关键字。

    因此要在查询中加上``避免和关键字重复

    其他的关键字Name、Class等没有问题。

  • 相关阅读:
    无锁数据结构(Lock-Free Data Structures)
    Grouping Sets:CUBE和ROLLUP从句
    SQL Server里Grouping Sets的威力
    第18/24周 乐观并发控制(Optimistic Concurrency)
    SQL Server里PIVOT运算符的”红颜祸水“
    数据库收缩:NOTRUNCATE与TRUNCATEONLY
    在SQL Server里为什么我们需要更新锁
    SQL Server里的自旋锁介绍
    SQL Server里的闩锁介绍
    配置内存中OLTP文件组提高性能
  • 原文地址:https://www.cnblogs.com/yaotome/p/10622986.html
Copyright © 2011-2022 走看看