我PHP设置的是UTF-8,数据库设置的是UTF8-general-ci,从页面发送数据给数据库后数据库显示的是乱码是为啥

我PHP设置的是UTF-8,数据库设置的是UTF8-general-ci,从页面发送数据给数据库后数据库显示的是乱码是为啥,第1张

试试把下面类似语句放到连接语句之后

mysql_query("SET NAMES UTF8");

或 PDO

$dbh->exe("SET NAMES UTF8");

用 SET NAMES UTF8 校正一下连接编码

因为PHP 连接数据库的过程中会经过三次编码转换,比如输出的的时候

MySql Server(UTF-8) -> PHP Connection( Latin1) -> UTF8页面的Result(UTF-8) 这时两种编码不兼容则产生乱码。

codeigniter中的脚手架 从 CodeIgniter 160 开始,脚手架功能已经废弃掉了

CodeIgniter 的脚手架功能使您可以在开发过程中方便快速的在数据库中添加、删除、修改数据。

非常重要:脚手架只可以在开发过程中使用。因为它提供了非常少的安全保护,所以可以访问到您的 CodeIgniter 站点的任何人都可以添加删除或修改您数据库中的数据。如果您使用脚手架,那么请确认您在使用完之后一定要立刻禁止它。千万不要在上线的站点中激活它,并且一定要在使用前给它设置一个密匙(secret word)。

为什么要使用脚手架?

这是一个经典场景:开发过程中,你创建了一个数据表并且希望快速地插入一些数据。没有“脚手架”时,你要么写些插入命令,要么就使用如phpMyAdmin之类的数据库管理工具。用CodeIgniter的脚手架特性,你可以快捷地通过浏览器添加数据。当你用完时,也可以轻易删除掉这些数据。

设置一个密匙(Secret Word)

激活脚手架之前,要先设置一个密匙。我们将通过这个密匙来启动脚手架,所以要用一些不常见的词防止被人猜到。

设置密匙,打开文件 application/config/routesphp 找到下面字段:

$route['scaffolding_trigger'] = '';

把值替换成你的密匙

注意: 脚手架密匙 不能 以下划线开头。

激活脚手架

注意:本页信息假设你已经知道 控制器 是怎么工作的了, 并且你已经有一个正在运行的控制器。同时,我们假设你已经设置好CodeIgniter使之能自动连上 数据库 。如果不是,此页的信息不会很有价值,所以我们建议你先阅读相关内容。最后,我们假设你已经知道什么叫类的构造函数。否则,请阅读 控制器 的最后一节。

激活脚手架,你的控制器构造函数应该有像这样的代码:

<phpclass Blog extends Controller { function Blog() { parent::Controller(); $this->load->scaffolding('table_name'); }}>

此处的 table_name 为你想 *** 作的数据表名 (表名,不是数据库名)

一旦初始化脚手架,你可以以这样的URL来访问它:

examplecom/indexphp/class/secret_word/

比如,控制器名为 Blog ,密匙为 abracadabra , 你可以这样访问脚手架:

examplecom/indexphp/blog/abracadabra/

脚手架界面是简单明了的。你可以添加,修改或删除数据。

最后需要注意的地方:

脚手架特性只能 *** 作有主键的表,因为这是各种数据库函数所必需的信息。

Laravel框架中的DB类让我们可以方便的进行数据库 *** 作,比如常见的query查询:

DB::query('SELECT FROM users');

Larvel还提供了类似CI框架中Active Record的Fluent Query Builder : DB::table('user')->where('id','=','1')->get();

虽然从 *** 作上和普通查询相差不大,但是需要注意到是Laravel的查询结果和原生查询不同。

简单建立一个contents表测试下,表里有content字段,我们查询一下:

$content = DB::table('contents')->where('id','=','1')->get();

最后打印一下$content变量看看有什么不同:

array(1)

{

[0]=> object(stdClass)#31 (1) {

["content"]=> string(24) "这是一个测试~~" }

}

从上面可以知道查询的结果是一个包含对象的数组,因此我们要取得content值就必须先迭代:

foreach($contents as $content)

{ echo $content->content;

}

总体来说Laravel的数据库 *** 作很容易上手。

第一种:

ALTER TABLE tb   --(指定某表的某列)

ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS           --不区分大小写

ALTER TABLE tb   --(指定某表的某列)

ALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CS_AS          --区分大小写

alter database 数据库 COLLATE Chinese_PRC_CS_AS  --(指定整个数据库)

第二种:

--创建如下用户自定义函数(UDF)

CREATE FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))

--ALTER FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))

RETURNS INTEGER

AS

BEGIN

  DECLARE @i INTEGER

  --DECLARE @Str1 VARCHAR(50)

  --DECLARE @Str2 VARCHAR(50)

  DECLARE @y INT

  --SET @Str1='a'

  --SET @Str2='A'

  SET  @i=0

  --SELECT ASCII(SUBSTRING(@Str1,@i+1,1))

  SET @y=1

  DECLARE @iLen INT

  SET @iLen = LEN(LTRIM(RTRIM(@Str1)))

  IF LEN(LTRIM(RTRIM(@Str1))) < LEN(LTRIM(RTRIM(@Str2))) --THEN

     SET @iLen = LEN(LTRIM(RTRIM(@Str2)))

  WHILE (@i < @iLen)

    BEGIN

      IF (ASCII(SUBSTRING(@Str1,@i+1,1))=ASCII(SUBSTRING(@Str2,@i+1,1))) --THEN

         SET @i = @i +1

      ELSE

         BEGIN

           SET @y=0

           BREAK

         END

      END

     RETURN @y

END

测试:

select 

from Table1

Where dboStrComp(Field1,'aAbB') =1

第三种:

SQL Server 数据库中的文本信息可以用大写字母、小写字母或二者的组合进行存储。例如,姓氏可以"SMITH"、"Smith"或"smith"等形式出现。

数据库是否区分大小写取决于 SQL Server 的安装方式。如果数据库区分大小写,当搜索文本数据时,必须用正确的大小写字母组合构造搜索条件。例如,如果搜索名字"Smith",则不能使用搜索条件"=smith"或"=SMITH"。

另外,如果服务器被安装成区分大小写,则必须用正确的大小写字母组合提供数据库、所有者、表和列的名称。如果提供的名称大小写不匹配,则 SQL Server 返回错误,报告"无效的对象名"。

当使用关系图窗格和网格窗格创建查询时,查询设计器始终正确地反映出服务器是否区分大小写。但是,如果在 SQL 窗格中输入查询,则必须注意使名称与服务器解释名称的方式相匹配。

如果服务器是用不区分大小写的选项安装的,则

提示   若要确定服务器是否区分大小写,请执行存储过程 sp_server_info,然后检查第 18 行的内容。如果服务器是用不区分大小写的设置安装的,则 sort_order 选项将设置为"不区分大小写"。可以从查询分析器运行存储过程。

第四种:

select  from servers where convert(varbinary, name)=convert(varbinary, N'RoCKEY')

第五种:

ascii('a')再配合Substring()一起用

回答的有点多请耐心看完。

希望能帮助你还请及时采纳谢谢

1事务的原理

事务就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。MySQL事务处理只支持InnoDB和BDB数据表类型。

1事务的ACID原则

1(Atomicity)原子性: 事务是最小的执行单位,不允许分割。原子性确保动作要么全部完成,要么完全不起作用;

2(Consistency)一致性: 执行事务前后,数据保持一致;

3(Isolation)隔离性: 并发访问数据库时,一个事务不被其他事务所干扰。

4(Durability)持久性: 一个事务被提交之后。对数据库中数据的改变是持久的,即使数据库发生故障。

1缓冲池(Buffer Pool)

Buffer Pool中包含了磁盘中部分数据页的映射。当从数据库读取数据时,会先从Buffer Pool中读取数据,如果Buffer Pool中没有,则从磁盘读取后放入到Buffer Pool中。当向数据库写入数据时,会先写入到Buffer Pool中,Buffer Pool中更新的数据会定期刷新到磁盘中(此过程称为刷脏)。

2日志缓冲区(Log Buffer)

当在MySQL中对InnoDB表进行更改时,这些更改命令首先存储在InnoDB日志缓冲区(Log Buffer)的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。

3双写机制缓存(DoubleWrite Buffer)

Doublewrite Buffer是共享表空间的物理文件的 buffer,其大小是2MB是一个一分为二的2MB空间。

刷脏 *** 作开始之时,先进行脏页‘备份’ *** 作将脏页数据写入 Doublewrite Buffer

将Doublewrite Buffer(顺序IO)写入磁盘文件中(共享表空间) 进行刷脏 *** 作

4回滚日志(Undo Log)

Undo Log记录的是逻辑日志记录的是事务过程中每条数据的变化版本和情况

在Innodb 磁盘架构中Undo Log 默认是共享表空间的物理文件的Buffer

在事务异常中断,或者主动(Rollback)回滚的过程中 ,Innodb基于 Undo Log进行数据撤销回滚,保证数据回归至事务开始状态

5重做日志(Redo Log)

Redo Log通常指的是物理日志,记录的是数据页的物理修改并不记录行记录情况。(也就是只记录要做哪些修改,并不记录修改的完成情况) 当数据库宕机重启的时候,会将重做日志中的内容恢复到数据库中。

1原子性

Innodb事务的原子性保证,包含事务的提交机制和事务的回滚机制在Innodb引擎中事务的回滚机制是依托 回滚日志(Undo Log) 进行回滚数据,保证数据回归至事务开始状态

2那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰? 答案是 锁 和 MVCC。

3持久性

基于事务的提交机制流程有可能出现三种场景

1 数据刷脏正常一切正常提交,Redo Log 循环记录数据成功落盘持久性得以保证

2数据刷脏的过程中出现的系统意外导致页断裂现象 (部分刷脏成功),针对页断裂情况,采用Double write机制进行保证页断裂数据的恢复

3数据未出现页断裂现象,也没有刷脏成功,MySQL通过Redo Log 进行数据的持久化即可

4一致性

从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性

2事务的隔离级别

Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别

脏读: 指一个事务读取了另外一个事务未提交的数据。

不可重复读: 在一个事务内读取表中的某一行数据,多次读取结果不同

虚读(幻读): 是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

2基本语法

-- 使用set语句来改变自动提交模式

SET autocommit = 0; /关闭/

SET autocommit = 1; /开启/

-- 注意:

--- 1MySQL中默认是自动提交

--- 2使用事务时应先关闭自动提交

-- 开始一个事务,标记事务的起始点

START TRANSACTION

-- 提交一个事务给数据库

COMMIT

-- 将事务回滚,数据回到本次事务的初始状态

ROLLBACK

-- 还原MySQL数据库的自动提交

SET autocommit =1;

-- 保存点

SAVEPOINT 保存点名称 -- 设置一个事务保存点

ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点

RELEASE SAVEPOINT 保存点名称 -- 删除保存点

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/

课堂测试题目

A在线买一款价格为500元商品,网上银行转账

A的yhk余额为2000,然后给商家B支付500

商家B一开始的yhk余额为10000

创建数据库shop和创建表account并插入2条数据

/

CREATE DATABASE `shop`CHARACTER SET utf8 COLLATE utf8_general_ci;

USE `shop`;

CREATE TABLE `account` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(32) NOT NULL,

`cash` DECIMAL(9,2) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)

VALUES('A',200000),('B',1000000)

-- 转账实现

SET autocommit = 0; -- 关闭自动提交

START TRANSACTION; -- 开始一个事务,标记事务的起始点

UPDATE account SET cash=cash-500 WHERE `name`='A';

UPDATE account SET cash=cash+500 WHERE `name`='B';

COMMIT; -- 提交事务

# rollback;

SET autocommit = 1; -- 恢复自动提交

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

3事务实现方式-MVCC

1什么是MVCC

MVCC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVVC。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别为RR(可重复读)和RC(读提交)生效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突,极大的增加了系统的并发性能。

2MVCC的实现机制

InnoDB在每行数据都增加两个隐藏字段,一个记录创建的版本号,一个记录删除的版本号。

在多版本并发控制中,为了保证数据 *** 作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被 *** 作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的;对于数据的更新(包括增删改) *** 作成功,会将这个版本号更新到数据的行中;事务提交成功,新的版本号也就更新到了此数据行中。这样保证了每个事务 *** 作的数据,都是互不影响的,也不存在锁的问题。

3MVCC下的CRUD

SELECT:

当隔离级别是REPEATABLE READ时select *** 作,InnoDB每行数据来保证它符合两个条件:

1 事务的版本号 大于等于 创建行版本号

  2 行数据的删除版本 未定义 或者大于 事务版本号

  行创建版本号 事务版本号 行删除版本号

 

INSERT:

InnoDB为这个新行 记录 当前的系统版本号。

DELETE:

InnoDB将当前的系统版本号 设置为 这一行的删除版本号。

UPDATE:

InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为 当前的系统版本号。它同时也会将这个版本号 写到 旧行的删除版本里。

————————————————

版权声明:本文为CSDN博主「@Autowire」的原创文章,遵循CC 40 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:>

FILENAME = 'C:\MSSQL\data\XXXXMDF' , SIZE = 1,---数据库储存路径FILEGROWTH = 10%) LOG ON (NAME = N'fendoujob_Log',FILENAME = 'C:\MSSQL\data\XXXXLDF' ,SIZE = 1,---数据库日志储存路径FILEGROWTH = 10%)--2--建表ADMIN_USERUSE TESTCREATE TABLE [ADMIN_USER] ([AD_ID] [int] NOT NULL ,--帐号ID[AD_NAME] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,--帐号[AD_PASSWORD] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,--密码[AD_popedom] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,--权限[AD_ADDTIME] [datetime] NULL --创建日期) ON [PRIMARY]GO--3--插入数据

以上就是关于我PHP设置的是UTF-8,数据库设置的是UTF8-general-ci,从页面发送数据给数据库后数据库显示的是乱码是为啥全部的内容,包括:我PHP设置的是UTF-8,数据库设置的是UTF8-general-ci,从页面发送数据给数据库后数据库显示的是乱码是为啥、php ci框架中脚手架是做什么用的、laravel vagrant mysql 怎么查看等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9270017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存