SQL基础教程系列_基于Postgresql_创建表时的中文乱码问题(附如何修改注册表更改dos encoding方式)

2023-10-29

创建表时的中文乱码问题:具体分为两种,一种是输入进去就不显示中文,第二种是当上传到服务器端会返回乱码。具体原因可以参考: http://www.cnblogs.com/winkey4986/p/6279243.html (一篇博客)及 http://www.postgres.cn/docs/9.5/multibyte.html (官方字符集支持documentation)以下为总结:

1.数据库编程的编码问
数据库编程设计的编码问题包括三个方面:
    数据库服务器编码;
    数据库客户端编码;
    本地环境编码。


1.1 数据库服务器字符编码:
数据库服务器支持某种编码,是指数据库服务器能够从客户端接收、存储以及向客户端提供该种编码的字符,并能将该种编码的字符转换到其它编码。

查看PostgreSQL数据库服务器端编码:

postgres=# show server_encoding;
 server_encoding 
-----------------
 UTF8
postgres=# \l
   名称    |  拥有者   | 字元编码 |                       Collate                       |                        Ctype                        |        TestDb1   | TestRole1 | UTF8     | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 | 
 TestDb2   | postgres  | UTF8     | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 | 
 postgres  | postgres  | UTF8     | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 | 
 template0 | postgres  | UTF8     | Chinese (Simplified)_People's Republic of China.936 | Chinese (Simplified)_People's Republic of China.936 | 


1.2 数据库客户端字符编码:
 客户端工具支持某种编码,必须能够显示从数据库读取的该种编码的字符,也能通过本工具将该种编码的字符提交到给服务器端。

查看PostgreSQL客户端工具psql编码:

 postgres=# show client_encoding;
 GBK
 postgres=# \encoding
 GBK


 指定Postgresql会话的客户端编码:

 postgres=# set client_encoding to 'utf8';
 SET
 postgres=# show client_encoding;
 client_encoding 
 -----------------
 UTF8


 1.3 本地环境编码:
如果使用dos的命令行界面,本地环境就是指dos命令行环境的编码,可以使用dos命令chcp查看dos环境编码:

D:\Program Files\PowerCmd>chcp
活动代码页: 936
----936为简体中文,GBK;

如果在使用某种编辑器,则本地环境编码取该编辑器的编码设置。

   1.3.1 修改dos命令行编码方式:

       1.3.1.1 临时修改,只作用于当前打开的窗口

            进入cmd窗口后,直接执行“chcp 65001”

            执行完后,cmd的编码格式就是UTF-8

       1.3.1.2 永久修改,修改注册表。

            在运行中输入"regedit",找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor

            然后“右键-新建”,选择“字符串值”,“名称”列填写“autorun”, 数值数据填写“@chcp65001>null”   --for windows 10

2 示例
2.1 示例1

2.1.1 设置

PostgreSQL的数据库postgres,

服务器端字符编码:utf8,

客户端工具psql字符编码:gbk,

本地环境dos命令编辑器编码:gbk,此时:

postgres=# show server_encoding;
 server_encoding 
-----------------
 UTF8
(1 行记录)
postgres=# show client_encoding;
 client_encoding 
-----------------
 GBK
(1 行记录)
postgres=# \! chcp
活动代码页: 936
postgres=# select * from "TestTb1";
  Column1                                                               
-----------


2.1.2 分析

由于本地环境和客户端编码都是GBK,一致,没有问题。

insert时,客户端接收本地环境输入的GBK字符(两者都为GBK),客户端传到服务器端时自动转换为UTF-8编码存储,没有问题。

select时,服务器端传到客户端,UTF-8编码自动转换为GBK编码,在本地环境显示时,本地环境就是GBK编码,显示没有问题。(编码方式互相支持的转换在官方文档里有提及)

2.2 示例2

2.2.1 设置

PostgreSQL的数据库postgres,

服务器端字符编码:utf8,

客户端工具psql字符编码:utf8,

本地环境dos命令编辑器编码:GBK,此时:

postgres=# set client_encoding to 'utf8';
SET
postgres=# insert into test values('测试1');
閿欒?:  鏃犳晥鐨?"UTF8" 缂栫爜瀛楄妭椤哄簭: 0xb2
postgres=# select * from test;
      column1
--------------------
 娴嬭瘯
(1 行记录)                                   

2.2.2 分析                                                                
由于客户端和服务器的编码一致,故不进行转码。

insert时,本地输入的GBK编码到客户端不自动转换,而客户端又把接收到的没转换编码方式的字符当作utf编码直接传给服务器端且也没有转换,这时服务器就将GBK编码的字符作为UTF-8编码的字符存储,故有问题。报错的信息为:ERROR:  invalid byte sequence for encoding "UTF8": 0xb2;

select时,服务端的utf编码传给客户端不转换,客户端把utf编码传给本地环境不自动转换,utf8编码用gbk编码显示,故有问题。

2.2.3 结论

虽然PG支持客户端和服务器端的编码自动转换,但是本地环境的编码方式到客户端并不会自动转换,所以还需要遵从一个原则:本地环境的编码和客户端编码需一致。

3.总结

①直接在psql执行insert或者select的时候,设置client_encoding=gbk(默认),dos命令行编码方式=gbk(本地环境的编码和客户端编码需一致),server_encoding=utf8 

②使用“\i sql文件.sql”(sql文件是utf8编码)命令的时候,如果sql文件中有中文,一定要先行执行set client_encoding=utf8;(设置此之后,按照上面说的,客户端不转换,直接把接收的字符作为utf8编码传给服务器端,而文件本身就是utf8,所以不乱码;同理如果sql文件是ansi编码即gbk编码的话,确保client_encoding为gbk;总之,sql文件与client_encoding编码一致),才不乱码。

 

ref:http://www.cnblogs.com/winkey4986/p/6279243.html 

        http://www.postgres.cn/docs/9.5/multibyte.html 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL基础教程系列_基于Postgresql_创建表时的中文乱码问题(附如何修改注册表更改dos encoding方式) 的相关文章

  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • 在 SELECT IN 中使用 Oracle 参数时出现问题

    我在将一串数字插入sql查询时遇到问题 SELECT FROM tablename a WHERE a flokkurid IN 3857 3858 3863 3285 ORDER BY sjodategund rodun or SELEC
  • 给定“java.sql.SQLIntegrityConstraintViolationException”是否可以确定错误的列

    鉴于我有一个类型为 java sql SQLIntegrityConstraintViolationException 的异常 是否可以以编程方式确定错误的列 或多列 我问这个问题是因为我想将错误映射回客户端的数据模型以指示错误的字段 例如
  • 插入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型

    当我尝试插入分区表时 出现以下错误 SemanticException 错误 10044 第 1 23 行无法插入目标表 因为列号 类型不同 表 insclause 0 有 6 列 这 3 列已分区 我们不需要任何必须从中转储 存储的过滤器
  • SQL Join 列上类似于另一列[重复]

    这个问题在这里已经有答案了 可能的重复 mysql连接查询使用like https stackoverflow com questions 1930809 mysql join query using like 我想要进行连接 其中一列包含
  • T-SQL:用最新的非空值替换 NULL 的最佳方法?

    假设我有这张表 id value 1 5 2 4 3 1 4 NULL 5 NULL 6 14 7 NULL 8 0 9 3 10 NULL 我想编写一个查询来替换任何NULL值与表中最后一个不为空的值在那一栏里 我想要这个结果 id va
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • Reporting Services 在哪里存储其日志文件

    最相关的谷歌结果似乎表明 为了访问日志 我们必须将您自己的日志表部署到数据库并制作报告服务写入它 http technet microsoft com en us library ms157403 aspx 简而言之 Reporting S
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 快速查询最新记录的方法?

    我有一张这样的表 USER PLAN START DATE END DATE 1 A 20110101 NULL 1 B 20100101 20101231 2 A 20100101 20100505 在某种程度上 如果END DATE i
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • 如何在 DB2 中创建返回序列值的函数?

    如何在 DB2 中创建一个从序列中获取值并返回该值的函数 应该可以在 select 或 insert 语句中使用该函数 例如 select my func from xxx insert into xxx values my func 基本
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • Spark SQL 中的 SQL LIKE

    我正在尝试使用 LIKE 条件在 Spark SQL 中实现联接 我正在执行连接的行看起来像这样 称为 修订 Table A 8NXDPVAE Table B 4 8 NXD V 在 SQL Server 上执行联接 A revision
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • CKA认证题型解析

    文章目录 0 前言 1 RBAC 授权 2 节点设置不可用 3 升级 K8s 版本 注意 4 etcd 备份与恢复 5 网络策略 查看官网 NetworkPolicy 6 SVC 暴露应用 7 Ingress 查看官网 ingress 8
  • unix环境高级编程——进程间通信之管道

    本期主题 unix环境高级编程 进程间通信之管道 管道 1 什么是管道 1 定义 2 管道的局限性 2 进程管道 1 popen和pclose 2 使用popen的弊端 3 pipe函数 1 单进程管道通信 2 跨越fork调用的管道 4
  • 数字证书简介

    1 为什么 在说清楚数字证书是什么之前 先要搞清楚为什么要有数字证书 或者说数字证书的出现是为了解决什么问题 请看以下通信流程 1 1 使用数字签名技术防止信息伪造 1 1 1 发送明文信息 小灰灰给懒羊羊发了一条信息 约懒羊羊去玩 1 1
  • 自行获取区域经纬度的工具

    摘要 上一章教大家如何建立自己的行政区域地图 这次为大家提供一个 可视化选择区域 并且能自动生成经纬度代码的工具 工具的源代码完全公开 并且做了详尽的注释 可以单纯做为一个工具 也可做为百度地图API的学习案例 工具说明 1 开关可以控制
  • substring的常用两个方法

    概述 1 substring是用来截取字符串的 根据参数的个数不同 方法含义也不同 2 substring 0 2 这个只含开头不含结尾 因此截取是截取两个字符 从第一个到第二个字符 不包含第三个 3 substring 2 这个表示截掉前
  • javaweb-30:smbms项目搭建

    SMBMS 数据库 sql脚本 通过sqlyog图形化界面操作 在历史记录中对应相应的sql 表的引擎默认为InnoDB 字符集和核对默认和数据库一致 CREATE DATABASE smbms CHARACTER SET utf8 COL
  • java堆外内存泄漏分析排查

    JAVA堆外内存分析 文章目录 JAVA堆外内存分析 1 前言 2 准备 3 具体分析 3 1堆外溢出风险判断 3 1 1确认java进程号 3 1 2查看此java进程的jvm参数 3 1 3查看java进程的大概内存占用情况 3 1 4
  • bug: tab 标签页界面切换导致echarts图表默认宽度100px的问题

    bug tab 标签页界面切换导致echarts图表默认宽度100px的问题 最近在bootstrap中使用echarts 本来在一个页面显示全部图表时是正常的 后面使用tab标签页界面切换不同表格时碰到的一个echarts bug tab
  • 【CSDN开发云】光速认识Cloud IDE

    个人格言 时间是亳不留情的 它真使人在自己制造的镜子里照见自己的真相 Git专栏 Git篇 你的一键三连是对我的最大支持 CSDN最新产品 云IDE 来啦 云IDE 将为各位技术er一键秒级构建云开发环境 提升开发效率 为持续提升产品体验
  • javaScript数组方法记录——持续补充

    javaScript数组方法记录 将平时用到的或者可能用到的记录一下 有助于加深记忆 查找起来也方便 concat concat 方法用于 连接 两个或者多个 数组 会返回合并数组之后的数据 不会改变原来的数组 let a 张三 李四 赵五
  • DC基础学习(五)Verilog语言结构到门级的映射1

    Design Compiler 以下简称DC 是Synopsys公司用于做电路综合的核心工具 可以将HDL描述的电路转换为基于工艺库的门级网表 本系列主要介绍综合相关的知识以及DC工具的使用 Verilog编码效率的高低是综合后电路性能高低
  • 「Python 基础」网络编程、电子邮件

    文章目录 1 网络编程 TCP IP TCP 编程 服务端 客户端 UDP 编程 服务端 客户端 2 电子邮件 SMTP 发送邮件 POP3 收取邮件 1 网络编程 网络通信就是两个进程之间的通信 TCP IP IP 地址 计算机的网络接口
  • Nginx入门和反向代理

    文章目录 1 Nginx简介 2 Nginx在Linux上安装 2 1先去 nginx官网 http nginx org en download html 下载压缩包 2 2把压缩包上传到Linux中 2 3 安装依赖环境 2 4 解压 需
  • 一个Python示例,它演示了如何定义一个函数,计算两个数字的乘积

    一个Python示例 它演示了如何定义一个函数 计算两个数字的乘积 定义一个函数 计算两个数字的乘积 def multiply x y return x y 调用函数 并将结果存储在变量中 result multiply 5 10 输出函数
  • shell脚本实现C程序日志分流和多Terminal显示

    日志打印是软件必需的功能 通常C程序会将所有运行日志输出到指定LOG 一 有时候需要在C程序运行期间查看实时日志 最好地 可以根据关键字筛选自己想要查看的内容 二 有时候 希望另开Terminal去查看日志 而不是使用当前的Terminal
  • python怎么遍历文件夹_python遍历文件夹,指定遍历深度与忽略目录的方法

    背景 需要在文件夹中搜索某一文件 找到后返回此文件所在目录 用最常规的os listdir 方式实现了一版 但执行时报错 递归超过最大深度 于是自己添加了点功能 之所有写此函数是为了让它适应不同的项目 因为有项目要找的文件在第一层 有的在第
  • 趣味面试题

    趣味面试题集锦 最近看了不少关于求职面试的试题 在其中发现了不少有意思的题目 特整理后发表上来与大家一起分享 为了方便与以后添加的题目区别 每次更新会以 A B 的方式标注 A 1 如何将 a b 的值进行交换 并且不使用任何中间变量 解析
  • 【超详细】使用Git上传本地文件夹到GitHub main branch

    最近对Tensorflow Object Detection Tutorial进行更新 想把本地建好的文件夹上传到main brach而不是master brach 一 新建仓库 Repository 在GitHub上登陆你的账号 点击 N
  • qDebug 学习小结

    在qtcentre中看到有网友问这样一个问题 Why this doesn t work qDebug lt lt Test lt lt std endl 第一反应 这两个东西本来就不能这样搭配使用啊 第二反应 额 如何解释这个问题呢 还真
  • SQL基础教程系列_基于Postgresql_创建表时的中文乱码问题(附如何修改注册表更改dos encoding方式)

    创建表时的中文乱码问题 具体分为两种 一种是输入进去就不显示中文 第二种是当上传到服务器端会返回乱码 具体原因可以参考 http www cnblogs com winkey4986 p 6279243 html 一篇博客 及 http w