<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>程序猿二三事儿 &#187; 数据库</title>
	<atom:link href="http://www.waicai.org/?cat=4&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.waicai.org</link>
	<description>歪才的程序猿手记</description>
	<lastBuildDate>Wed, 25 Dec 2024 08:50:38 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8.1</generator>
	<item>
		<title>查看Navicat已保存数据库连接的密码</title>
		<link>http://www.waicai.org/?p=105</link>
		<comments>http://www.waicai.org/?p=105#comments</comments>
		<pubDate>Wed, 11 Dec 2024 02:22:54 +0000</pubDate>
		<dc:creator><![CDATA[waicai]]></dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.waicai.org/?p=105</guid>
		<description><![CDATA[1.导出数据库连接 connections.ncx 文件，导出时要勾选导出密码 2.使用文本编辑工具打开导出的 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>1.导出数据库连接 connections.ncx 文件，导出时要勾选导出密码</p>
<p>2.使用文本编辑工具打开导出的connections.ncx 文件，找到Password字段中的加密数据</p>
<p>3.JAVA解密脚本</p>
<p>import javax.crypto.Cipher;<br />
import javax.crypto.spec.IvParameterSpec;<br />
import javax.crypto.spec.SecretKeySpec;<br />
import java.security.MessageDigest;<br />
import java.util.Arrays;</p>
<p>public class NavicatPassword {<br />
public static void main(String[] args) throws Exception {<br />
NavicatPassword navicatPassword = new NavicatPassword();</p>
<p>// 解密11版本及以前的密码<br />
//String decode = navicatPassword.decrypt(&#8220;15057D7BA390&#8243;, 11);</p>
<p>// 解密12版本及以后的密码<br />
//String decode = navicatPassword.decrypt(&#8220;15057D7BA390&#8243;, 12);<br />
String decode = navicatPassword.decrypt(&#8220;解密密码&#8221;, 12);<br />
System.out.println(decode);<br />
}</p>
<p>private static final String AES_KEY = &#8220;libcckeylibcckey&#8221;;<br />
private static final String AES_IV = &#8220;libcciv libcciv &#8220;;<br />
private static final String BLOW_KEY = &#8220;3DC5CA39&#8243;;<br />
private static final String BLOW_IV = &#8220;d9c7c3c8870d64bd&#8221;;</p>
<p>public static String encrypt(String plaintext, int version) throws Exception {<br />
switch (version) {<br />
case 11:<br />
return encryptEleven(plaintext);<br />
case 12:<br />
return encryptTwelve(plaintext);<br />
default:<br />
throw new IllegalArgumentException(&#8220;Unsupported version&#8221;);<br />
}<br />
}</p>
<p>public static String decrypt(String ciphertext, int version) throws Exception {<br />
switch (version) {<br />
case 11:<br />
return decryptEleven(ciphertext);<br />
case 12:<br />
return decryptTwelve(ciphertext);<br />
default:<br />
throw new IllegalArgumentException(&#8220;Unsupported version&#8221;);<br />
}<br />
}</p>
<p>private static String encryptEleven(String plaintext) throws Exception {<br />
byte[] iv = hexStringToByteArray(BLOW_IV);<br />
byte[] key = hashToBytes(BLOW_KEY);</p>
<p>int round = plaintext.length() / 8;<br />
int leftLength = plaintext.length() % 8;<br />
StringBuilder result = new StringBuilder();<br />
byte[] currentVector = iv.clone();</p>
<p>Cipher cipher = Cipher.getInstance(&#8220;Blowfish/ECB/NoPadding&#8221;);<br />
SecretKeySpec secretKeySpec = new SecretKeySpec(key, &#8220;Blowfish&#8221;);<br />
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);</p>
<p>for (int i = 0; i &lt; round; i++) {<br />
byte[] block = xorBytes(plaintext.substring(i * 8, (i + 1) * 8).getBytes(),currentVector);<br />
byte[] temp = cipher.doFinal(block);<br />
currentVector = xorBytes(currentVector, temp);<br />
result.append(bytesToHex(temp));<br />
}</p>
<p>if (leftLength &gt; 0) {<br />
currentVector = cipher.doFinal(currentVector);<br />
byte[] block = xorBytes(plaintext.substring(round * 8).getBytes(), currentVector);<br />
result.append(bytesToHex(block));<br />
}</p>
<p>return result.toString().toUpperCase();<br />
}</p>
<p>private static String encryptTwelve(String plaintext) throws Exception {<br />
byte[] iv = AES_IV.getBytes();<br />
byte[] key = AES_KEY.getBytes();</p>
<p>Cipher cipher = Cipher.getInstance(&#8220;AES/CBC/NoPadding&#8221;);<br />
SecretKeySpec secretKeySpec = new SecretKeySpec(key, &#8220;AES&#8221;);<br />
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);<br />
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);</p>
<p>byte[] result = cipher.doFinal(plaintext.getBytes());<br />
return bytesToHex(result).toUpperCase();<br />
}</p>
<p>private static String decryptEleven(String ciphertext) throws Exception {<br />
byte[] iv = hexStringToByteArray(BLOW_IV);<br />
byte[] key = hashToBytes(BLOW_KEY);<br />
byte[] encrypted = hexStringToByteArray(ciphertext.toLowerCase());</p>
<p>int round = encrypted.length / 8;<br />
int leftLength = encrypted.length % 8;<br />
StringBuilder result = new StringBuilder();<br />
byte[] currentVector = iv.clone();</p>
<p>Cipher cipher = Cipher.getInstance(&#8220;Blowfish/ECB/NoPadding&#8221;);<br />
SecretKeySpec secretKeySpec = new SecretKeySpec(key, &#8220;Blowfish&#8221;);<br />
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);</p>
<p>for (int i = 0; i &lt; round; i++) {<br />
byte[] block = Arrays.copyOfRange(encrypted, i * 8, (i + 1) * 8);<br />
byte[] temp = xorBytes(cipher.doFinal(block), currentVector);<br />
currentVector = xorBytes(currentVector, block);<br />
result.append(new String(temp));<br />
}</p>
<p>if (leftLength &gt; 0) {<br />
currentVector = cipher.doFinal(currentVector);<br />
byte[] block = Arrays.copyOfRange(encrypted, round * 8, round * 8 + leftLength);<br />
result.append(new String(xorBytes(block, currentVector)));<br />
}</p>
<p>return result.toString();<br />
}</p>
<p>private static String decryptTwelve(String ciphertext) throws Exception {<br />
byte[] iv = AES_IV.getBytes();<br />
byte[] key = AES_KEY.getBytes();<br />
byte[] encrypted = hexStringToByteArray(ciphertext.toLowerCase());</p>
<p>Cipher cipher = Cipher.getInstance(&#8220;AES/CBC/NoPadding&#8221;);<br />
SecretKeySpec secretKeySpec = new SecretKeySpec(key, &#8220;AES&#8221;);<br />
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);<br />
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);</p>
<p>byte[] result = cipher.doFinal(encrypted);<br />
return new String(result);<br />
}</p>
<p>private static byte[] xorBytes(byte[] bytes1, byte[] bytes2) {<br />
byte[] result = new byte[bytes1.length];<br />
for (int i = 0; i &lt; bytes1.length; i++) {<br />
result[i] = (byte) (bytes1[i] ^ bytes2[i]);<br />
}<br />
return result;<br />
}</p>
<p>private static byte[] hexStringToByteArray(String s) {<br />
int len = s.length();<br />
byte[] data = new byte[len / 2];<br />
for (int i = 0; i &lt; len; i += 2) {<br />
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) &lt;&lt; 4)<br />
+ Character.digit(s.charAt(i + 1), 16));<br />
}<br />
return data;<br />
}</p>
<p>private static byte[] hashToBytes(String s) throws Exception {<br />
return MessageDigest.getInstance(&#8220;SHA-1&#8243;).digest(s.getBytes());<br />
}</p>
<p>private static String bytesToHex(byte[] bytes) {<br />
StringBuilder result = new StringBuilder();<br />
for (byte b : bytes) {<br />
result.append(String.format(&#8220;%02X&#8221;, b));<br />
}<br />
return result.toString();<br />
}<br />
}<br />
4.PHP解密脚本</p>
<p>&lt;?php</p>
<p>namespace FatSmallTools;</p>
<p>class NavicatPassword<br />
{<br />
protected $version = 0;<br />
protected $aesKey = &#8216;libcckeylibcckey&#8217;;<br />
protected $aesIv = &#8216;libcciv libcciv &#8216;;<br />
protected $blowString = &#8217;3DC5CA39&#8242;;<br />
protected $blowKey = null;<br />
protected $blowIv = null;</p>
<p>public function __construct($version = 12)<br />
{<br />
$this-&gt;version = $version;<br />
$this-&gt;blowKey = sha1(&#8217;3DC5CA39&#8242;, true);<br />
$this-&gt;blowIv = hex2bin(&#8216;d9c7c3c8870d64bd&#8217;);<br />
}</p>
<p>public function encrypt($string)<br />
{<br />
$result = FALSE;<br />
switch ($this-&gt;version) {<br />
case 11:<br />
$result = $this-&gt;encryptEleven($string);<br />
break;<br />
case 12:<br />
$result = $this-&gt;encryptTwelve($string);<br />
break;<br />
default:<br />
break;<br />
}</p>
<p>return $result;<br />
}</p>
<p>protected function encryptEleven($string)<br />
{<br />
$round = intval(floor(strlen($string) / 8));<br />
$leftLength = strlen($string) % 8;<br />
$result = &#8221;;<br />
$currentVector = $this-&gt;blowIv;</p>
<p>for ($i = 0; $i &lt; $round; $i++) {<br />
$temp = $this-&gt;encryptBlock($this-&gt;xorBytes(substr($string, 8 * $i, 8), $currentVector));<br />
$currentVector = $this-&gt;xorBytes($currentVector, $temp);<br />
$result .= $temp;<br />
}</p>
<p>if ($leftLength) {<br />
$currentVector = $this-&gt;encryptBlock($currentVector);<br />
$result .= $this-&gt;xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);<br />
}</p>
<p>return strtoupper(bin2hex($result));<br />
}</p>
<p>protected function encryptBlock($block)<br />
{<br />
return openssl_encrypt($block, &#8216;BF-ECB&#8217;, $this-&gt;blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING);<br />
}</p>
<p>protected function decryptBlock($block)<br />
{<br />
return openssl_decrypt($block, &#8216;BF-ECB&#8217;, $this-&gt;blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING);<br />
}</p>
<p>protected function xorBytes($str1, $str2)<br />
{<br />
$result = &#8221;;<br />
for ($i = 0; $i &lt; strlen($str1); $i++) {<br />
$result .= chr(ord($str1[$i]) ^ ord($str2[$i]));<br />
}</p>
<p>return $result;<br />
}</p>
<p>protected function encryptTwelve($string)<br />
{<br />
$result = openssl_encrypt($string, &#8216;AES-128-CBC&#8217;, $this-&gt;aesKey, OPENSSL_RAW_DATA, $this-&gt;aesIv);<br />
return strtoupper(bin2hex($result));<br />
}</p>
<p>public function decrypt($string)<br />
{<br />
$result = FALSE;<br />
switch ($this-&gt;version) {<br />
case 11:<br />
$result = $this-&gt;decryptEleven($string);<br />
break;<br />
case 12:<br />
$result = $this-&gt;decryptTwelve($string);<br />
break;<br />
default:<br />
break;<br />
}</p>
<p>return $result;<br />
}</p>
<p>protected function decryptEleven($upperString)<br />
{<br />
$string = hex2bin(strtolower($upperString));</p>
<p>$round = intval(floor(strlen($string) / 8));<br />
$leftLength = strlen($string) % 8;<br />
$result = &#8221;;<br />
$currentVector = $this-&gt;blowIv;</p>
<p>for ($i = 0; $i &lt; $round; $i++) {<br />
$encryptedBlock = substr($string, 8 * $i, 8);<br />
$temp = $this-&gt;xorBytes($this-&gt;decryptBlock($encryptedBlock), $currentVector);<br />
$currentVector = $this-&gt;xorBytes($currentVector, $encryptedBlock);<br />
$result .= $temp;<br />
}</p>
<p>if ($leftLength) {<br />
$currentVector = $this-&gt;encryptBlock($currentVector);<br />
$result .= $this-&gt;xorBytes(substr($string, 8 * $i, $leftLength), $currentVector);<br />
}</p>
<p>return $result;<br />
}</p>
<p>protected function decryptTwelve($upperString)<br />
{<br />
$string = hex2bin(strtolower($upperString));<br />
return openssl_decrypt($string, &#8216;AES-128-CBC&#8217;, $this-&gt;aesKey, OPENSSL_RAW_DATA, $this-&gt;aesIv);<br />
}<br />
}</p>
<p>use FatSmallTools\NavicatPassword;</p>
<p>//需要指定版本，11或12<br />
$navicatPassword = new NavicatPassword(12);<br />
//$navicatPassword = new NavicatPassword(11);</p>
<p>//解密<br />
//$decode = $navicatPassword-&gt;decrypt(&#8217;15057D7BA390&#8242;);<br />
$decode = $navicatPassword-&gt;decrypt(&#8216;解密密码&#8217;);<br />
echo $decode.&#8221;\n&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waicai.org/?feed=rss2&#038;p=105</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL常用命令</title>
		<link>http://www.waicai.org/?p=79</link>
		<comments>http://www.waicai.org/?p=79#comments</comments>
		<pubDate>Thu, 15 Nov 2018 08:35:33 +0000</pubDate>
		<dc:creator><![CDATA[waicai]]></dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.waicai.org/?p=79</guid>
		<description><![CDATA[1.连接命令：mysql -h 数据库连接 -u 用户名 -p 2.显示数据库：show databases; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>1.连接命令：mysql -h 数据库连接 -u 用户名 -p<br />
2.显示数据库：show databases;<br />
3.选择数据库：use 库名;<br />
4.显示所有表：show tables;<br />
5.显示表结构：describe 表名;<br />
6.创建数据库：create database 库名;<br />
7.增删改查：insert,delete,update,select<br />
8.删库删表：drop database 库名;drop table 表名;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waicai.org/?feed=rss2&#038;p=79</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用唯一主键批量更新数据(ON DUPLICATE KEY UPDATE)</title>
		<link>http://www.waicai.org/?p=15</link>
		<comments>http://www.waicai.org/?p=15#comments</comments>
		<pubDate>Tue, 22 Apr 2014 10:57:50 +0000</pubDate>
		<dc:creator><![CDATA[waicai]]></dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.waicai.org/?p=15</guid>
		<description><![CDATA[今天学习到了一种利用唯一主键批量更新sql的方法： INSERT INTO a ( id,name,age ) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今天学习到了一种利用唯一主键批量更新sql的方法：</p>
<p>INSERT INTO a ( id,name,age ) values (1,&#8217;andy&#8217;,12), (2,&#8217;lili&#8217;,13), (3,&#8217;lucy&#8217;,14) ON DUPLICATE KEY UPDATE name=VALUES(name), age=VALUES(age);</p>
<p>如果a表的id是唯一主键，而且values里边的值都是要更新的，那么这条语句就会等价于</p>
<p>UPDATE a SET name=&#8217;andy&#8217;, age=12 WHERE id=1;</p>
<p>UPDATE a SET name=&#8217;lili&#8217;, age=13 WHERE id=2;</p>
<p>UPDATE a SET name=&#8217;lucy&#8217;, age=14 WHERE id=3;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waicai.org/?feed=rss2&#038;p=15</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更新表时WHERE当前表</title>
		<link>http://www.waicai.org/?p=12</link>
		<comments>http://www.waicai.org/?p=12#comments</comments>
		<pubDate>Wed, 12 Mar 2014 07:46:03 +0000</pubDate>
		<dc:creator><![CDATA[waicai]]></dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.waicai.org/?p=12</guid>
		<description><![CDATA[今天在修改数据库字段的时候，执行UPDATE XXX SET is_delete=1 WHERE id IN  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今天在修改数据库字段的时候，执行UPDATE XXX SET is_delete=1 WHERE id IN (SELECT id FROM XXX WHERE name=&#8217;Andy&#8217;)这个SQL，直接报错，错误为：You can&#8217;t specify target table &#8216;XXX&#8217; for update in FROM clause。</p>
<p>百度了一下，说是一个update语句，不能在where条件里边嵌套自身表的查询语句。</p>
<p>根据提供的解决方案，尝试着修改了一下SQL：UPDATE XXX AS a,(SELECT id FROM XXX WHERE name=&#8217;Andy&#8217;) AS b SET a.is_delete=1 WHERE a.id=b.id，修改后执行，成功修改</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waicai.org/?feed=rss2&#038;p=12</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
