mysql 和 php的一些备忘

本文详细解读了MySQL与PHP在处理字符串与数字比较时的内部逻辑,包括如何将字符串转换为数值进行比较,以及不同语言环境中比较行为的差异。此外,还介绍了PHP中的引用传递、常量与定义的区别、对象复制方式以及如何通过设置mysql变量防止误操作等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.mysql 字符串和0比较结果为真

select  'string'=0; //结果为

+------------+
| 'string'=0 |
+------------+
|          1 |
+------------+


大概意思就是说,在mysql里面用字符串和数字比较的话,会先把字符串转换成数字  因为“string”这个字符串里面不是以数字开头的,所以转化成了0,0当然是等于0的,所以就返回为true了


2.php里面的字符串和0值比较,也是true的。

var_dump('abc'==0) 为true,也是因为比较的时候做了转换


3.php的函数名是大小写不敏感的 也就是说

function aa(){echo 'aa'};

echo aa(); // aa

echo AA();//不会出错,也是aa

但是php得变量是大小写敏感的

4.在php里面const和define的区别

http://stackoverflow.com/questions/2447791/define-vs-const/3193704#3193704



php引用


1.引用传递的时候只要函数声明的时候加上&符号就可以,调用函数时写的实参并不需要加上&符号也可


function foo(&$var){    $var++;}
$a=5;foo($a);



2.引用返回的时候如果要想期望运行正常  则函数定义和函数调用的时候都必须加&符,接受函数返回的变量和返回的变量并不引用同一个地址


 

    function &func(){
        static $static = 0;
        $static++;
        return $static;
    }

    $var1 =& func();
    echo "var1:", $var1; // 1
    func();
    func();
    echo "var1:", $var1; // 3
    $var2 = func(); // assignment without the &
    echo "var2:", $var2; // 4
    func();
    func();
    echo "var1:", $var1; // 6
    echo "var2:", $var2; // still 4


php对象复制是通过引用传递的,如果想拷贝一个副本,使得修改原来的对象不会影响的副本的值 使用clone关键字

class person{
	public $name;
	public $age;
	public function toString(){
		echo "姓名是:".$name;
		echo "年龄是:".$age;
	}
	
}
//引用传递 修改了p1,p2也自动被修改了
$p1=new person();
$p2= $p1;
var_dump($p1);
var_dump($p2);
$p1->name="zhangsan";
$p1->age=14;
var_dump($p1);
var_dump($p2);

$p3= clone $p1;
var_dump($p1);
var_dump($p3);
$p1->name="lisi";
$p1->age=15;
var_dump($p1);
var_dump($p3);


mysql 限制没有where语句的时候禁止执行update 和delete语句

相信很多人都遇到过不小心update的时候没有写where语句就误碰到了回车的问题,教训之惨痛不言而喻,我甚至见过有人把线上的数据全部update成了一样的值

那么预防这种问题的办法是什么呢,其中之一就是限制那些没有where子句的mysql执行

这里需要一个mysql变量的配合  sql_safe_updates

| sql_safe_updates               | OFF   |

这是一个mysql session变量,可以动态修改它的值,但是只限于当前回话,该值无法设置为全局的

所以要使其生效需要在每个mysql链接中执行 set sql_safe_updates=on;  来进行启用


效果为:只有在拥有where子句的情况下,并且where子句里面的字段是主键的情况下才能执行通过

或者

只有在拥有where子句的情况下,如果where子句里面的字段不是主键的情况下则需要配合limit 子句才能执行通过




php的交互式命令行环境

有些时候有一些小的php代码片段需要测试,每次都写一个php文件然后通过web运行起来有点略显麻烦

这时候就可以通过php的交互式环境来执行这些代码片段

启用php的交互式模式的命令为

php -a

使用这个功能需要编译的时候开启了readline选项,否则无法使用



php在函数里面想使用函数外面的变量:

1.在函数里面使用global 声明变量  比如:global $a;

2.在函数里面使用超级全局变量引用  比如:$GLOBALS['a']


查看某一个字符的unicode代码点和utf8存储编码或者gbk存储编码

set names utf8

select hex(convert('中’ using ucs2)); //查看’中‘字的unicode代码点

select hex(convert('中' using utf8));//查看’中‘字的utf8存储编码   E4B8AD

select hex(convert('中' using gbk));//查看’中‘字的gbk存储编码

select convert(0xE4B8AD using utf8); //转换'中'字的存储编码‘E4B8AD’到‘中’字


mysql的虚拟表 dual

如果想永远获取一个空集可以使用sql

select 1 from dual where false;



php去除非bmp(Basic Multilingual Plane)字符

1.根据字符长度取出 (bmp字符占用3个字符 supplementary planes字符占用4个字节 )

//remove non-BMP characters
function trimOutsideBMP($str) {
    if (empty($str)) return $str;
    $len = mb_strlen($str);
    $str1 = '';
    for ($i = 0; $i < $len; $i++) {
        $c = mb_substr($str, $i, 1,'utf8');
        $str1 .= strlen($c) <= 3 ? $c : '';
    }
    return $str1;
}

2.根据正则范围

Since 4-byte UTF-8 sequences always start with the bytes 0xF0-0xF7, the following should work:

$str = preg_replace('/[\xF0-\xF7].../s', '', $str);

Alternatively, you could use preg_replace in UTF-8 mode but this will probably be slower:

$str = preg_replace('/[\x{10000}-\x{10FFFF}]/u', '', $str);

This works because 4-byte UTF-8 sequences are used for code points in the supplementary Unicode planes starting from 0x10000.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值